如何确保训练好的Random Forest对7月全量员工数据集完成预测?
解决7月全量员工预测覆盖问题的方案
一、检查并处理7月数据的缺失值/异常值
模型预测时会自动跳过含缺失值的样本,这是导致仅覆盖30%员工的常见原因。
- 先查看各特征的缺失值比例:
# 输出每个特征的缺失值数量及占比 print(merged_df_pred[ml_cols].isnull().sum()) print(merged_df_pred[ml_cols].isnull().sum() / len(merged_df_pred))
- 根据特征类型填充缺失值:
# 数值型特征用中位数填充 num_cols = ['age','months tenure','salary_deviation','review_rating','satisfaction score','ytd commission','Sales Activities','DurationOfSalesCall','MileageOfSalesCall','Referrals','Admits'] merged_df_pred[num_cols] = merged_df_pred[num_cols].fillna(merged_df_pred[num_cols].median()) # 类别型特征用众数填充 cat_cols = ['term reason enc','color_rating'] merged_df_pred[cat_cols] = merged_df_pred[cat_cols].fillna(merged_df_pred[cat_cols].mode().iloc[0])
二、确保7月数据与训练集特征完全对齐
训练时的特征列、数据类型、类别取值必须和7月数据完全匹配:
- 核对列名:检查
ml_cols中的列名是否和训练集X的列名完全一致(注意空格、大小写差异,比如months tenure是否被误写为months_tenure) - 核对数据类型:
# 对比训练集与7月数据的特征类型 print("训练集特征类型:\n", X.dtypes) print("7月数据特征类型:\n", merged_df_pred[ml_cols].dtypes)
若存在类型不匹配,统一转换为训练集的类型:
# 示例:将类别特征转换为整数类型 merged_df_pred['term reason enc'] = merged_df_pred['term reason enc'].astype(int)
- 核对类别特征取值:若7月数据出现训练集未见过的类别,模型会跳过该样本,需统一映射到已有类别:
# 获取训练集的类别取值范围 train_color_cats = X['color_rating'].unique() # 将7月数据中不在训练集的类别替换为众数 merged_df_pred['color_rating'] = merged_df_pred['color_rating'].apply(lambda x: x if x in train_color_cats else merged_df_pred['color_rating'].mode().iloc[0])
三、同步训练与预测的预处理流程
如果训练时对数据做了标准化、编码等预处理,7月数据必须使用同一套预处理规则(不能重新拟合):
比如训练时用了标准化:
# 训练时的预处理(仅拟合训练数据) from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_resampled = scaler.fit_transform(X_resampled) # 预测时直接复用训练好的scaler转换7月数据 X_pred = scaler.transform(merged_df_pred[ml_cols])
四、验证预测覆盖情况
处理完成后运行预测代码,验证样本数量是否匹配:
y_pred = rf.predict(X_pred) print(f"预测样本数:{len(y_pred)},7月总员工数:{len(merged_df_pred)}")
若两者数值相等,说明已覆盖全部180名员工。
内容的提问来源于stack exchange,提问作者Hardik Trivedi
相关产品推荐
相关产品推荐

