You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:25:53