构建多回归模型会引发错误:`Pandas 数据转换为对象的 numpy dtype。使用 np.asarray(data) 检查输入数据。`

Posted

技术标签:

【中文标题】构建多回归模型会引发错误:`Pandas 数据转换为对象的 numpy dtype。使用 np.asarray(data) 检查输入数据。`【英文标题】:Building multi-regression model throws error: `Pandas data cast to numpy dtype of object. Check input data with np.asarray(data).` 【发布时间】:2016-02-23 08:42:31 【问题描述】:

我有 pandas 数据框,其中包含一些分类预测变量(即变量)作为 0 和 1,以及一些数字变量。当我将它安装到像这样的 stasmodel 时:

est = sm.OLS(y, X).fit()

它抛出:

Pandas data cast to numpy dtype of object. Check input data with np.asarray(data). 

我使用df.convert_objects(convert_numeric=True)转换了DataFrame的所有dtypes

在此之后,数据框变量的所有 dtype 都显示为 int32 或 int64。但最后还是显示dtype: object,像这样:

4516        int32
4523        int32
4525        int32
4531        int32
4533        int32
4542        int32
4562        int32
sex         int64
race        int64
dispstd     int64
age_days    int64
dtype: object

这里的 4516、4523 是变量标签。

有什么想法吗?我需要在数百个变量上建立一个多元回归模型。为此,我连接了 3 个 pandas DataFrame 以提供最终的 DataFrame 以用于模型构建。

【问题讨论】:

您看到的输出符合预期。输出末尾列出的 dtype 是 dtypes 系列的 dtype(调用 pd.DataFrame.dtypes 的结果),与数据帧内部的类型无关。试试pd.DataFrame(range(100)).dtypes 检查 np.asarray(X).dtype 应该是 float64,还是 int64,我认为它将在 statsmodels 中转换为 float64。最好再次检查est.model.exog.dtype 以确保在计算中使用了 float64。 【参考方案1】:

如果 X 是您的数据框,请尝试在运行模型时使用.astype 方法转换为浮点数:

est = sm.OLS(y, X.astype(float)).fit()

【讨论】:

so .. 将分类变量转换为浮点数? 所有分类变量在粘贴到模型之前都应该转换为虚拟变量,所以是的 而且整数还不够好,它们必须是浮点数! Int64 产生与 objectcategory 相同的错误...叹息。【参考方案2】:

如果 y(dependent) 和 X 都取自一个数据帧,则类型转换两者:-

est = sm.OLS(y.astype(float), X.astype(float)).fit()

【讨论】:

so .. 将分类变量转换为浮点数?【参考方案3】:

这是因为您没有为所有预测变量生成虚拟值步骤,那么回归如何在文字上发生?这就是错误消息所说的它正在尝试转换为 numpy 有效条目的内容。

只需返回您的管道并正确包含虚拟对象。

【讨论】:

【参考方案4】:

正如 Mário 和 Daniel 所建议的那样,是的,问题是由于之前没有转换为虚拟变量的分类值造成的。

我在查看StatLearning book 实验室对来自 statsmodels 的“Carseats”数据集进行线性回归时遇到了这个问题,其中 'ShelveLoc'、'US' 和 'Urban' 列是分类值,我假设在您的数据集中导致问题的分类值也是与此类似的字符串。考虑到前面,我将以此为例,因为您没有为问题提供数据框。

我们在开头的列如下,如前所述,“ShelveLoc”、“US”和“Urban”是分类的:

Index(['Sales', 'CompPrice', 'Income', 'Advertising', 'Population', 'Price',
       'ShelveLoc', 'Age', 'Education', 'Urban', 'US'],
      dtype='object')

在 Python 的一个简单行中,我将它们转换为分类值,并删除了带有“No”和“Bad”标签的那些(因为这是本书中实验室要求的)。

carseats = pd.get_dummies(carseats, columns=['ShelveLoc', 'US', 'Urban'], drop_first = True)

这将返回一个包含以下列的数据框:

Index(['Sales', 'CompPrice', 'Income', 'Advertising', 'Population', 'Price',
       'Age', 'Education', 'ShelveLoc_Good', 'ShelveLoc_Medium', 'US_Yes',
       'Urban_Yes'],
      dtype='object')

就是这样,您已经为 OLS 准备好了虚拟变量。希望这有用。

【讨论】:

以上是关于构建多回归模型会引发错误:`Pandas 数据转换为对象的 numpy dtype。使用 np.asarray(data) 检查输入数据。`的主要内容,如果未能解决你的问题,请参考以下文章

sklearn构建stacking模型进行堆叠多模型分层级回归分析

用于Logistic回归评估的Sklearn Python Log Loss引发了错误

sklearn使用投票回归VotingRegressor算法构建多模型融合的投票回归模型并自定义子回归器的权重(weights)评估多模型融合的回归模型评估R2msermsemape

Python使用sklearn和statsmodels构建多元线性回归模型(Multiple Linear Regression)并解读

R使用lm构建多变量线性回归模型

将 pandas 稀疏数据帧转换为稀疏 numpy 矩阵以供 sklearn 使用?