LinearRegression预测时特征数量不匹配报错求助
问题原因与解决方案
核心错误原因
特征数量不匹配的问题,根源在于训练和测试阶段使用了两个独立的OneHotEncoder实例,且分别对训练数据和测试数据执行了fit操作:
- 训练时的编码器基于训练集的
LocationJob类别生成编码规则,得到22个特征维度 - 测试时重新新建编码器并对测试集的
LocationJob执行fit,会基于测试集的类别生成新的编码规则,得到28个特征维度 - 模型是用训练集的22维特征训练的,自然无法识别测试集的28维特征
代码修正步骤
1. 复用同一个编码器,避免重复fit
训练时用fit_transform处理训练数据,测试时只用transform,复用训练好的编码器规则:
############ train df_train = pd.read_excel('/content/feature importance training profiles.xlsx') train_shuffled = df_train.sample(frac=1) x_df_train = train_shuffled[['Name', 'middleName', 'lastnName', 'Certification', 'Location', 'College', 'Degree', 'Jobs', 'Company', 'Date', 'LocationJob']] y_df_train = train_shuffled[['Label']] ############ test df_test = pd.read_excel('/content/feature importance testing profiles.xlsx') test_shuffled = df_test.sample(frac=1) # 测试集特征不能包含Label,避免数据泄露 x_df_test = test_shuffled[['Name', 'middleName', 'lastnName', 'Certification', 'Location', 'College', 'Degree', 'Jobs', 'Company', 'Date', 'LocationJob']] y_df_test = test_shuffled[['Label']] #### 复用同一个编码器处理训练和测试数据 skencoder = OneHotEncoder(handle_unknown='ignore') # 训练集执行fit_transform,完成拟合与转换 sk_data_train = skencoder.fit_transform(x_df_train[['LocationJob']]) # 测试集仅执行transform,复用训练好的编码规则 sk_data_test = skencoder.transform(x_df_test[['LocationJob']]) # 训练模型并预测 model = LinearRegression().fit(sk_data_train, y_df_train) print(model.predict(sk_data_test))
2. 额外需要修正的问题
- 测试集数据泄露:之前的
x_df_test包含Label列,属于数据泄露,必须移除,否则测试结果无参考价值 - 未利用全部特征:当前代码仅对
LocationJob做了编码,x_df_train中的其他特征(如Name、Certification等)都未参与模型训练。若要评估这些特征的重要性,需要对所有目标特征做一致的预处理(类别特征编码、数值特征标准化等),且训练与测试的预处理逻辑必须完全统一
特征重要性评估补充
线性回归的特征重要性可通过系数绝对值判断(需先对特征做标准化,否则系数大小会受特征尺度影响)。若要更系统地评估特征重要性,还可考虑:
- 树模型(如RandomForestClassifier)的
feature_importances_属性 - 置换重要性(Permutation Importance)方法
内容的提问来源于stack exchange,提问作者Jesper Ezra
相关产品推荐
相关产品推荐

