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

线性回归训练报错:Expected 2D array, got 1D array instead问题排查

解决线性回归训练时的ValueError及数据集处理问题

看起来你在拆分数据集和训练线性回归模型时踩了几个典型的坑,我来一步步帮你理清问题并解决:

问题根源分析

你的代码里有三个核心问题导致了这个报错:

  1. 没有区分特征(X)和目标变量(Y):你直接把整个DataFrame同时赋值给X_train和Y_train,线性回归要求X是用于预测的2D特征矩阵,Y是要预测的1D目标向量,而不是把整个数据集既当特征又当目标。
  2. 未处理非数值型特征:你的数据集包含object类型的列(比如Country),线性回归模型只能接受数值型输入,这些文本列会导致模型无法解析。
  3. 初始的X = [] y = []完全没用到:这行代码是空列表定义,后续操作根本没使用,等于白写了。

分步解决方案

1. 先明确特征与目标变量

首先你得从22列里确定哪一列是你要预测的目标(比如假设是GDP,替换成你实际的目标列名),剩下的作为特征:

import pandas as pd
from sklearn import linear_model

# 假设你的目标列是'Target',替换成你真实的列名
target_column = "Target"

# 拆分特征矩阵X和目标向量y
X = df.drop(columns=[target_column])  # 所有特征列(去掉目标列)
y = df[target_column]  # 单独的目标列

2. 处理非数值型特征

因为你的数据有object类型的列(比如Country),需要把这些分类变量转换成数值形式,最常用的是独热编码:

# 自动检测所有object类型的列并做独热编码,drop_first避免多重共线性
X = pd.get_dummies(X, columns=X.select_dtypes(include=["object"]).columns, drop_first=True)

3. 正确拆分训练集和测试集

现在X是纯数值的2D矩阵,y是1D向量,再做拆分就没问题了:

n_train = int(len(df) * 0.7)
X_train = X[:n_train]
y_train = y[:n_train]
X_test = X[n_train:]
y_test = y[n_train:]

# 打印样本数
print('The number of samples in the training set:')
print(len(y_train))
print('The number of samples in the test set:')
print(len(y_test))

4. 训练线性回归模型

现在输入符合模型要求了,可以正常训练:

lr = linear_model.LinearRegression()
lr.fit(X_train, y_train)

更简便的方式:用sklearn的train_test_split

手动切片容易出错,推荐用sklearn内置的拆分工具,还能设置随机种子保证可复现:

from sklearn.model_selection import train_test_split

# 按7:3拆分,random_state固定随机数种子
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7, random_state=42)

为什么之前会报那个错?

你之前的代码把整个DataFrame传给Y_train,这是一个2D的DataFrame,而线性回归的fit方法要求y是1D的Series或数组;同时未处理的非数值列会导致X_train不是纯数值矩阵,双重问题叠加就触发了那个ValueError。

内容的提问来源于stack exchange,提问作者Uda_ Mad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:37:49