如何聚合多个分类器经StratifiedKFold拆分后的预测结果实现模型融合
问题排查与修复
- 核心错误1:存在严重数据泄露。你在KFold循环内训练模型时,调用的是
model.fit(df.drop("Response", 1), df.Response),每次都用全量数据集训练,没有用到拆分后的xtrain和ytrain,会导致验证分数完全不可信,后续交叉验证预测结果也没有意义,需要先把训练数据集改为拆分后的训练集。 - 核心错误2:直接平均硬分类标签效果差。你之前的计算方式直接对0/1的分类标签做平均,损失了模型的置信度信息,正确做法是先输出分类概率,再做聚合后转成最终标签。
正确实现步骤
1. 修复训练逻辑,输出预测概率
fold = StratifiedKFold(10, shuffle=True, random_state=42) score = [] # 存储各模型每折的正类预测概率 cat_pred_prob = [] lgbm_pred_prob = [] forest_pred_prob = [] rgf_pred_prob = [] # 对应你原来的rgb_prediction,为RGF模型笔误修正 for train_s, test_s in tqdm(fold.split(X, Y)): xtrain, ytrain = X.iloc[train_s], Y.iloc[train_s] xtest, ytest = X.iloc[test_s], Y.iloc[test_s] # RGF模型 model = RGFClassifier(algorithm="RGF_Sib", test_interval=100, normalize=True) model.fit(xtrain, ytrain) # 改用拆分后的训练集训练 val_pred = model.predict(xtest) score.append(f1_score(ytest, val_pred)) # 存储测试集正类预测概率 rgf_pred_prob.append(model.predict_proba(tt)[:, 1]) # 随机森林模型 model = RandomForestClassifier(class_weight=class_weight) model.fit(xtrain, ytrain) val_pred = model.predict(xtest) score.append(f1_score(ytest, val_pred)) forest_pred_prob.append(model.predict_proba(tt)[:, 1]) # CatBoost模型 model = CatBoostClassifier(iterations=400, class_weights=class_weight, silent=True) model.fit(xtrain, ytrain) val_pred = model.predict(xtest) score.append(f1_score(ytest, val_pred)) cat_pred_prob.append(model.predict_proba(tt)[:, 1]) # LGBM模型 model = LGBMClassifier(class_weight=class_weight) model.fit(xtrain, ytrain) val_pred = model.predict(xtest) score.append(f1_score(ytest, val_pred)) lgbm_pred_prob.append(model.predict_proba(tt)[:, 1])
2. 聚合预测结果
两种常用融合方式可选:
等权平均融合
先对每个模型的10折概率取平均,再对四个模型的平均概率做等权融合,最后转成分类标签:
# 单模型10折结果平均 avg_rgf = np.mean(rgf_pred_prob, axis=0) avg_forest = np.mean(forest_pred_prob, axis=0) avg_cat = np.mean(cat_pred_prob, axis=0) avg_lgbm = np.mean(lgbm_pred_prob, axis=0) # 多模型等权融合 ensemble_prob = (avg_rgf + avg_forest + avg_cat + avg_lgbm) / 4 # 转成最终分类标签,阈值默认0.5,可根据业务场景调整 ensemble_pred = (ensemble_prob >= 0.5).astype(int)
加权平均融合(效果通常更优)
根据每个模型的验证集F1得分计算权重,得分越高的模型权重越大:
# 计算四个模型各自的平均验证F1得分 rgf_score = np.mean(score[::4]) # 每4个score中第一个为RGF模型得分 forest_score = np.mean(score[1::4]) cat_score = np.mean(score[2::4]) lgbm_score = np.mean(score[3::4]) total_score = rgf_score + forest_score + cat_score + lgbm_score # 按得分占比分配权重 ensemble_prob = (avg_rgf * rgf_score + avg_forest * forest_score + avg_cat * cat_score + avg_lgbm * lgbm_score) / total_score ensemble_pred = (ensemble_prob >= 0.5).astype(int)
内容的提问来源于stack exchange,提问作者Onwuka Daniel
相关产品推荐
相关产品推荐

