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

如何聚合多个分类器经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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:39:04