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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:37:13