如何合并XGBoost与协同过滤KNNWithMeans的预测输出DataFrame
解决方案
步骤1:生成全量item的XGB预测映射表
你当前重合度低的核心原因是仅用XGB模型预测了自身的测试集数据,实际可以直接用训练好的XGB模型对所有有属性数据的item做全量预测,同时保留itemId做关联键。
先修正你XGB侧的冗余代码+补充全量预测逻辑:
import xgboost as xgb from sklearn.model_selection import train_test_split from xgboost import XGBClassifier import pandas as pd # 保留带itemId的原始物品属性表副本 df_item_features = df.copy() # 拆分特征和标签时不提前删除itemId,避免后续无法关联 cols_to_drop = ['itemId', 'Decision'] X = df.drop(cols_to_drop, axis=1) y = df['Decision'] # 训练模型(删除你原代码中冗余的、写在数据集拆分前的那行model.fit) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=5) model = XGBClassifier() model.fit(X_train, y_train) # 生成全量item的XGB预测映射表,只要是第一个数据集里存在的item都有预测结果 item_xgb_map = df_item_features[['itemId']].copy() # 输出0/1分类结果 item_xgb_map['xgb_pred'] = model.predict(df_item_features.drop(cols_to_drop, axis=1)) # 如果后续需要做模型融合,建议输出概率值更灵活: # item_xgb_map['xgb_pred_prob'] = model.predict_proba(df_item_features.drop(cols_to_drop, axis=1))[:, 1]
步骤2:合并到协同过滤输出表
直接通过itemId做左连接即可,协同过滤测试集中存在、但第一个数据集没有的item,XGB预测字段会返回空值:
# 先修正你协同过滤代码里的笔误:itenId改成itemId test_merged = test.merge(item_xgb_map, on='itemId', how='left')
步骤3:处理缺失值(可选)
对没有XGB预测结果的新增item,可根据业务需求选择兜底方案:
- 直接用协同过滤的
cf_predictions值填充 - 填充全局平均值/分类众数
- 新增字段标识该item无属性侧预测结果,用于后续模型融合
内容的提问来源于stack exchange,提问作者futuredataengineer
相关产品推荐
相关产品推荐

