Sklearn MLPRegressor预测特征数不匹配报错如何解决
问题原因
你遇到的特征数不匹配错误和预处理流程、数据格式转换无关,完全是代码逻辑错误导致的,核心问题有2个:
- 代码残留了测试用的模拟数据生成逻辑:你加载完自己的自行车租赁数据集、完成特征标签拆分和数组转换后,又执行了
X, y = make_regression(n_samples=200, random_state=1),这行代码直接覆盖了之前从真实数据提取的X、y变量。make_regression默认生成100个特征的模拟回归数据,你后续的MLP模型是用这组100维的模拟数据训练的,根本没有学习你自己的19维自行车租赁数据,拿19维的真实测试集预测自然会报特征数不匹配。 - 存在变量名拼写错误:读取训练集时你赋值的变量名是
train,后续拆分特征标签时写的是treino.drop(...),如果没有提前定义过treino变量,运行到这行本身就会触发NameError,属于变量名前后不一致问题。
修复方案
按照以下步骤修改代码即可解决问题:
- 删掉和当前任务无关的
X, y = make_regression(...)模拟数据生成代码,不要让这行代码覆盖你自己加载的真实数据集变量。 - 统一训练集变量名,把后续引用的
treino全部改成和读取时一致的train,避免变量不存在的报错。 - 训练验证集拆分要基于你自己的真实业务数据做,不要用模拟生成的数据。
- 归一化操作要遵守规范:
StandardScaler只在训练集上执行fit,再用同一个scaler分别转换验证集和测试集,不要在不同数据集上单独fit,避免数据泄露。 - 检查测试集CSV是否包含
aluguéis标签列,如果有要在预测前先删除该列,否则会导致测试集特征数多1,再次触发特征不匹配错误。
修复后可运行核心代码
import pandas as pd import numpy as np import math from sklearn.neural_network import MLPRegressor from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error # 读取预处理完成的数据集 caminho_treino = '/content/treino_tratado.csv' train = pd.read_csv(caminho_treino) caminho_teste = '/content/teste_tratado.csv' test = pd.read_csv(caminho_teste) # 拆分训练集特征与标签,修正变量名拼写问题 X = train.drop('aluguéis', axis=1) y = train['aluguéis'] # 转换为numpy数组格式 X = X.to_numpy() y = y.to_numpy() # 如果测试集包含标签列,要先执行test = test.drop('aluguéis', axis=1)再转数组 test_arr = test.to_numpy() # 基于自有数据集拆分训练、验证集 X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.3, random_state=1) # 数据归一化 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_val_scaled = scaler.transform(X_val) test_scaled = scaler.transform(test_arr) # 模型训练 regr = MLPRegressor( hidden_layer_sizes=(1000,), activation='relu', solver='adam', alpha=0.0001, batch_size='auto', learning_rate='constant', learning_rate_init=0.001, max_iter=200, shuffle=True, random_state=1, # 固定随机种子保证结果可复现 tol=0.0001 ).fit(X_train_scaled, y_train) # 验证集RMSE计算 val_pred = regr.predict(X_val_scaled) val_rmse = math.sqrt(mean_squared_error(y_val, val_pred)) print(f"验证集RMSE: {val_rmse}") # 测试集预测,此时特征维度完全匹配 test_pred = regr.predict(test_scaled)
内容的提问来源于stack exchange,提问作者Henrique Rezer Mosquér
相关产品推荐
相关产品推荐

