python - ValueError: exog 在尝试拟合 statsmodels OLS 时不是 1d 或 2d
问题描述
我试图通过输入 2 个具有列名的 numpy 数组来使用 statsmodels 来拟合一个简单的 OLS 模型。但是,在尝试拟合模型时,我收到此错误:
ValueError: exog is not 1d or 2d
为了使示例可重现,我使用了 sklearn 数据集并创建了数组。我的代码是这样的:
import numpy as np
import pandas as pd
import statsmodels.api as sm
from sklearn import datasets ## imports datasets from scikit-learn
data = datasets.load_boston() ## loads Boston dataset from datasets library
df = pd.DataFrame(data.data, columns=data.feature_names)
Y = pd.DataFrame(data.target, columns=["MEDV"])
Y = Y.to_numpy(dtype=[('MEDV', 'float64')])
X = df.to_numpy(dtype=[('CRIM', 'float64'), ('ZN', 'float64'), ('INDUS', 'float64'), ('CHAS', 'float64'), ('NOX', 'float64'),
('RM', 'float64'), ('AGE', 'float64'), ('DIS', 'float64'), ('RAD', 'float64'), ('TAX', 'float64'),
('PTRATIO', 'float64'), ('B', 'float64'), ('LSTAT', 'float64')])
model = sm.OLS(Y, X).fit()
这没有任何意义,因为我的 Y 变量是数字的垂直向量,所以它肯定是 1D 或 2D。
有谁明白我为什么会收到这个错误?
解决方案
简单的解决方法是:
import numpy as np
import pandas as pd
import statsmodels.api as sm
from sklearn import datasets ## imports datasets from scikit-learn
data = datasets.load_boston() ## loads Boston dataset from datasets library
df = pd.DataFrame(data.data,
columns=data.feature_names)
Y = pd.DataFrame(data.target, columns=["MEDV"])
X = df.to_numpy()
Y = Y.to_numpy()
model = sm.OLS(Y, X).fit()
让我们看看这两种方法之间的区别:
Y = pd.DataFrame(data.target, columns=["MEDV"])
(Y.to_numpy(dtype=[('MEDV', 'float64')]))[:10]
array([[(24. ,)],
[(21.6,)],
[(34.7,)],
[(33.4,)],
[(36.2,)],
[(28.7,)],
[(22.9,)],
[(27.1,)],
[(16.5,)],
[(18.9,)]], dtype=[('MEDV', '<f8')])
# That is an array of tuples
Y.to_numpy()[:10]
array([[24. ],
[21.6],
[34.7],
[33.4],
[36.2],
[28.7],
[22.9],
[27.1],
[16.5],
[18.9]])
# This is an array of floats
完全相同的情况发生在X
.
推荐阅读
- elasticsearch - 在 Kibana 中可视化漏斗
- swift - Xcode显示弹出但没有错误
- android - 应用程序在后台运行时在三星手机中重新启动,并且用户从建议的应用程序中单击应用程序图标
- typescript - 使用映射类型将泛型类型数组映射到不同的(返回)数组
- freeswitch - freeswitch什么时候停止向asr引擎传输语音流?
- magento2 - 捆绑产品未出现在 magento 2 中
- oracle - 使用 oracle sql 连接表
- dart - 我怎样才能返回一个特定的容器小部件,或者什么都不返回
- c# - 在不使用替换的情况下更新对象中传递的所有字段
- android - io.realm.exceptions.RealmMigrationNeededException:由于以下错误,需要迁移: - 添加了“SaveMessage”类