构建多回归模型会引发错误:`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
产生与 object
或 category
相同的错误...叹息。【参考方案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)并解读