运行Scikit-learn线性回归代码遇ValueError:预期2D数组获1D数组
问题排查与解决
错误原因
你遇到的ValueError: Expected 2D array, got 1D array instead,是因为scikit-learn的线性回归模型要求特征数据x必须是二维数组格式(形状为(样本数, 特征数))。直接通过df_percentage.Percentage提取的是pandas Series对象,本质是一维结构,即便调用reshape(-1,1),部分场景下Series的reshape操作不会自动转换为模型所需的二维数组。
修复方案
有两种可靠的解决方式:
方案1:用双层方括号提取特征(推荐)
直接提取得到二维DataFrame,无需额外转换:
x = df_percentage[['Percentage']] # 双层方括号返回二维结构 y = df_percentage['Peakintensity']
方案2:转numpy数组后再reshape
先将Series转为numpy一维数组,再调整为二维形状:
x = df_percentage.Percentage.values.reshape(-1, 1) # values转numpy数组,再reshape成二维 y = df_percentage.Peakintensity
修复后的完整代码
from sklearn import linear_model from sklearn.metrics import mean_squared_error, r2_score from sklearn.model_selection import train_test_split import pandas as pd df_percentage = pd.read_csv("Data.csv", sep=';') print(df_percentage) # 二选一使用方案1或方案2的x、y定义 x = df_percentage[['Percentage']] y = df_percentage['Peakintensity'] # x = df_percentage.Percentage.values.reshape(-1, 1) # y = df_percentage.Peakintensity x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) model = linear_model.LinearRegression() model.fit(x_train, y_train) y_pred = model.predict(x_test) print('Coefficients: ', model.coef_) print('Intercept: ', model.intercept_)
补充说明
- 原代码中
x = x.reshape(-1,1)不生效的核心原因:pandas Series的reshape方法返回的仍是Series对象,而非二维numpy数组,scikit-learn无法识别这种一维结构作为特征输入。 - 双层方括号提取的方式更直观,既能保留pandas DataFrame的特性,又直接满足模型对输入维度的要求。
内容的提问来源于stack exchange,提问作者Ben Jack
相关产品推荐
相关产品推荐

