Sklearn线性回归Fit阶段报错:期望2D数组却得到1D数组求助
解决Scikit-learn线性回归中的ValueError:Expected 2D array, got 1D array instead
嘿,刚入门Scikit-learn和Python数据分析的时候,我也踩过这个一模一样的坑!别慌,这个错误本质是线性回归模型对输入特征的格式有严格要求——它必须接收二维数组作为特征输入,但你现在传入的训练数据是一维的。
为什么会出现这个问题?
当你用train_test_split拆分数据后,你的特征集(比如X_train)大概率是像[1.2, 3.4, 5.6]这样的一维数组(Numpy的1D array或者Pandas Series),但Scikit-learn的模型期望的输入结构是每行对应一个样本,每列对应一个特征的二维数组,比如:
[[1.2], [3.4], [5.6]]
快速解决方法
针对单特征的场景(你现在应该是这种情况),用reshape(-1, 1)把一维数组转换成二维数组就行,具体修改代码如下:
假设你原来的代码是这样的:
from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression # 从CSV加载数据后的代码 X = df['your_feature_column'] # 这里得到的是一维结构 y = df['target_column'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) lm = LinearRegression() lm.fit(X_train, y_train) # 这里触发ValueError
只需要在拟合前给X_train和X_test做重塑:
# 把一维特征转成二维结构 X_train = X_train.reshape(-1, 1) X_test = X_test.reshape(-1, 1) lm.fit(X_train, y_train) # 现在就能正常运行啦!
关于reshape(-1, 1)的小解释
-1是让Numpy自动计算这个维度的元素数量,不用你手动数样本个数1表示把数据整理成1列的二维数组,完美匹配单特征的输入要求
提前避免这个问题的小技巧
如果你用Pandas加载数据,获取特征时用双括号而不是单括号,直接得到二维的DataFrame,就不用再手动reshape了:
# 用双括号获取特征,得到的是DataFrame(二维结构) X = df[['your_feature_column']]
这样拆分后的X_train和X_test本身就是二维的,直接传入fit方法就不会报错啦!
内容的提问来源于stack exchange,提问作者cphill
相关产品推荐
相关产品推荐

