sklearn LinearRegression特征数不匹配报错解决方法
报错根因
报错的核心是传入模型的特征矩阵维度写反,不符合sklearn的输入格式要求:
你代码里写的g = [df[:,1]]是把整列特征数据套了一层外层列表,最终得到的数组形状是(1, 数据总行数)——模型会把这个结构识别为「1个样本,每个样本包含N个特征」,训练完成后就会要求后续预测输入必须有N个特征,和你实际要做的单特征回归需求完全不符,自然触发维度不匹配报错。
排查方法
不需要复杂调试,训练前打印数组形状就能快速定位问题:
在model.fit()之前加两行代码:
print("特征矩阵g的形状:", np.array(g).shape) print("标签矩阵h的形状:", np.array(h).shape)
运行后你会看到g的形状输出类似(1,5),也就是1行5列,对应模型认知里的1个样本、5个特征,和你预期的5个样本、1个特征刚好行列颠倒。
这里明确sklearn线性回归的固定输入要求:
- 传入
fit()的特征X必须是二维数组,形状固定为(样本数量, 特征数量),行代表单个样本,列代表单个特征维度 - 哪怕只有1个特征,也不能传一维数组或者形状颠倒的二维数组,必须严格符合
(n_samples, 1)的格式要求 - 标签y可以是形状为
(n_samples,)的一维数组,不需要额外转二维
修复代码
把构造特征、标签的部分改成符合维度要求的写法即可,修正后的可运行代码:
import matplotlib.pyplot as plt import numpy as np import pandas as pd import sklearn.linear_model dados = pd.read_csv("dados.csv", thousands=',', sep = ";", header = 0, encoding='latin-1') dados.drop('pais', axis = 1, inplace=True) df = dados.to_numpy() # 用reshape把单特征列转成(样本数,1)的标准二维格式 g = df[:, 1].reshape(-1, 1) h = df[:, 0] plt.scatter(g, h, color='blue') model = sklearn.linear_model.LinearRegression() model.fit(g, h) G_new = [[22500]] print(model.predict(G_new))
修复后训练时模型识别到的特征数是1,和你预测时传入的单特征维度匹配,就不会再报这个错。
补充:如果后续扩展为多特征回归,只要保证预测时传入的特征列数和训练时的特征列数完全一致,就不会出现这类维度报错。
内容的提问来源于stack exchange,提问作者orlando moura junior
相关产品推荐
相关产品推荐

