使用Polynomial回归训练加州住房数据时出现特征数不匹配错误求助
问题原因与解决方法
错误根源
- 你训练
LinearRegression时用的是原始的8维X_train,但预测时传入的是多项式转换后的45维X_test,模型的输入维度要求是训练时的8维,自然会报错维度不匹配。 - 额外使用
reshape(1, -1)是错误操作,它会把数据集的形状彻底打乱(比如把(n_samples, 8)变成(1, n_samples*8)),完全不符合模型输入要求。
正确操作流程
多项式回归的核心是对所有用于训练和预测的特征数据,都要使用同一个PolynomialFeatures转换器进行转换,步骤如下:
- 拆分训练集和测试集后,先初始化
PolynomialFeatures对象; - 用训练集的特征X_train拟合转换器(让转换器学习原始特征的多项式组合规则),同时转换X_train得到X_train_poly;
- 用转换后的X_train_poly训练
LinearRegression模型; - 用同一个转换器转换X_test得到X_test_poly,再用训练好的模型进行预测。
修正后的代码示例
from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression # 获取数据集并取50%数据 data = fetch_california_housing() X, y = data.data, data.target X_half, _, y_half, _ = train_test_split(X, y, train_size=0.5, random_state=42) # 拆分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X_half, y_half, test_size=0.2, random_state=42) # 初始化多项式特征转换器 poly = PolynomialFeatures(degree=2, include_bias=False) # include_bias=False避免和LinearRegression的截距重复 # 拟合转换器并转换训练集特征 X_train_poly = poly.fit_transform(X_train) # 用转换后的训练集训练模型 model = LinearRegression() model.fit(X_train_poly, y_train) # 用同一个转换器转换测试集特征,然后预测 X_test_poly = poly.transform(X_test) y_pred = model.predict(X_test_poly) # 验证(可选) print(f"训练后模型接受的输入维度: {model.coef_.shape[0]}") print(f"转换后测试集的特征维度: {X_test_poly.shape[1]}")
内容的提问来源于stack exchange,提问作者Shan
相关产品推荐
相关产品推荐

