按条件切换模型:协同过滤与XGBoost评分预测融合方案咨询
实现方案
核心原则
需要将两个模型封装为输出格式一致的调用函数,避免后续融合逻辑混乱,同时方便统一评估准确率。
分步实现
1. 预处理全局统计量,修正XGBoost数据结构
首先预计算每个被评分对象的总评分次数,作为模型选择的判断依据;同时修正原有XGBoost代码直接删除rated_object的问题,保留对象和特征的映射关系,方便后续按对象查询特征:
# 预计算每个被评分对象的总评分次数 object_rating_count = df.groupby('rated_object')['rating'].count().to_dict() # 保留XGBoost的对象-特征映射,不要直接删除rated_object列 xgb_feature_map = df2.set_index('rated_object').drop('rating', axis=1)
2. 封装统一输出格式的预测函数
两个函数统一输入worker、rated_object两个参数,输出0/1的预测结果,无对应数据时返回None:
def cf_predict(worker, rated_object): # 调用协同过滤模型预测 try: pred = algo.predict(worker, rated_object).est return 1 if pred > 0.5 else 0 except: # 无对应worker或对象记录时返回空 return None def xgb_predict(worker, rated_object): # XGBoost仅依赖对象特征预测,和worker无关 if rated_object not in xgb_feature_map.index: return None # 特征预处理逻辑和训练时保持一致即可,这里以填充0为例 features = xgb_feature_map.loc[rated_object].fillna(0).values.reshape(1, -1) return model.predict(features)[0]
3. 实现融合逻辑
按需求优先级实现判断逻辑:
def combine_predict(worker, rated_object): cf_res = cf_predict(worker, rated_object) xgb_res = xgb_predict(worker, rated_object) # 优先规则:对象评分≥3且CF有结果,用CF结果 if cf_res is not None and object_rating_count.get(rated_object, 0) >= 3: return cf_res # 次优先:XGB有结果用XGB结果 elif xgb_res is not None: return xgb_res # 兜底:XGB无结果但CF有结果,用CF结果 elif cf_res is not None: return cf_res # 两个模型都无结果,可按业务需求返回默认值 else: return 0
4. 融合模型准确率评估
构造带真实标签的测试集,批量预测后计算准确率即可:
from sklearn.metrics import accuracy_score # 测试集格式为[worker, rated_object, 真实评分],需保证和训练集无数据泄露 test_samples = [ ("w1", "o1", 0), ("w2", "o5", 1), # 更多测试样本 ] y_true = [] y_pred = [] for worker, obj, actual in test_samples: y_true.append(actual) y_pred.append(combine_predict(worker, obj)) print("融合模型准确率:", accuracy_score(y_true, y_pred))
注意事项
- 统计
object_rating_count时只能使用训练集数据,不能引入测试集的评分数据,避免数据泄露 - XGBoost的特征预处理逻辑要和训练时完全一致,包括缺失值处理、编码规则等
内容的提问来源于stack exchange,提问作者futuredataengineer
相关产品推荐
相关产品推荐

