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

如何利用三类分类器的实例置信度提升预测分数?

如何利用分类器置信度提升预测分数?

看起来你已经通过网格搜索完成了三个分类器(RandomForest、KNN、SVM)的参数调优,接下来要利用它们的置信度/概率输出提升预测效果,这里有几个我在实际项目中验证过的实用方法:

首先明确:你的三个分类器都支持输出置信度相关的结果——RandomForest和KNN可以直接用predict_proba()输出类别概率,你的SVM已经设置了probability=True,同样可以通过predict_proba()获取概率值。


1. 置信度加权投票(替代简单硬投票)

普通的硬投票是每个分类器一票,加权投票则根据每个分类器对当前实例的置信度分配权重,让更“确定”的分类器拥有更高的话语权:

  • 对每个测试实例,提取三个分类器预测类别对应的概率值(比如二分类场景下取正类的概率作为置信度)
  • 以置信度为权重,计算每个候选类别的加权得分,最终选择得分最高的类别
  • 代码示例(二分类场景):
import numpy as np

# 获取每个分类器的预测概率与预测结果
rf_proba = rf_clf.predict_proba(X_test)[:, 1]  # 取正类概率作为置信度
knn_proba = knn_clf_sl_GS.predict_proba(X_test)[:, 1]
svm_proba = svm_clf_sl_GS.predict_proba(X_test)[:, 1]

rf_pred = rf_clf.predict(X_test)
knn_pred = knn_clf_sl_GS.predict(X_test)
svm_pred = svm_clf_sl_GS.predict(X_test)

# 计算加权投票得分
weighted_scores = (rf_pred * rf_proba) + (knn_pred * knn_proba) + (svm_pred * svm_proba)
final_pred = np.where(weighted_scores >= 0.5, 1, 0)

2. 低置信度实例特殊处理

对置信度低于阈值的实例(比如概率<0.6),放弃硬预测,改用更稳妥的策略:

  • 过滤重预测:只保留高置信度的自动预测,低置信度实例要么用多个分类器的概率平均值判断,要么交给人工审核(如果场景允许)
  • 动态切换策略:对低置信度实例,优先选择在该类样本上表现最好的分类器的结果
  • 示例逻辑:
confidence_threshold = 0.6

# 整理所有分类器的置信度和预测结果
all_probas = np.array([rf_proba, knn_proba, svm_proba])
all_preds = np.array([rf_pred, knn_pred, svm_pred])

final_pred = []
for i in range(len(X_test)):
    current_probas = all_probas[:, i]
    current_preds = all_preds[:, i]
    
    # 筛选出置信度达标的分类器
    high_conf_mask = current_probas >= confidence_threshold
    if np.any(high_conf_mask):
        # 用高置信度分类器的投票结果
        final_pred.append(np.bincount(current_preds[high_conf_mask]).argmax())
    else:
        # 低置信度场景:用概率平均值判断
        avg_proba = np.mean(current_probas)
        final_pred.append(1 if avg_proba >= 0.5 else 0)

3. 基于置信度的堆叠(Stacking)模型

把三个分类器的概率输出作为新特征,训练一个元分类器(比如逻辑回归、LightGBM)来学习如何整合这些置信度信息:

  • 先将训练集拆分为基础训练集和验证集,用基础训练集训练三个分类器,然后在验证集上输出概率作为堆叠特征
  • 用堆叠特征训练元分类器,最后在测试集上用三个分类器输出概率,再输入元分类器得到最终预测
  • 代码示例:
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# 拆分训练集,用于生成堆叠特征
X_train_base, X_val, y_train_base, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=41)

# 基分类器在验证集上输出概率特征
rf_val_proba = rf_clf.fit(X_train_base, y_train_base).predict_proba(X_val)
knn_val_proba = knn_clf_sl_GS.fit(X_train_base, y_train_base).predict_proba(X_val)
svm_val_proba = svm_clf_sl_GS.fit(X_train_base, y_train_base).predict_proba(X_val)

# 合并概率特征作为堆叠输入
stacked_val_features = np.hstack([rf_val_proba, knn_val_proba, svm_val_proba])

# 训练元分类器
meta_clf = LogisticRegression(random_state=41)
meta_clf.fit(stacked_val_features, y_val)

# 在测试集上生成堆叠特征并预测
rf_test_proba = rf_clf.predict_proba(X_test)
knn_test_proba = knn_clf_sl_GS.predict_proba(X_test)
svm_test_proba = svm_clf_sl_GS.predict_proba(X_test)
stacked_test_features = np.hstack([rf_test_proba, knn_test_proba, svm_test_proba])
final_pred = meta_clf.predict(stacked_test_features)

4. 针对KNN的置信度优化

你的KNeighborsClassifier当前配置可以调整来提升置信度的可靠性:

  • 设置weights='distance',让距离更近的邻居对预测的影响更大,这样predict_proba()输出的概率会更贴合真实的置信度
  • 调整n_neighbors参数(你的配置里该参数被截断了):更小的n值会让置信度的区分度更高,但要注意避免过拟合

额外提示

  • 校准概率输出:SVM的probability=True是基于Platt缩放生成的概率,可能需要用CalibratedClassifierCV进一步校准;KNN的概率也建议校准,RandomForest的概率通常相对可靠
  • 所有策略都要在验证集上测试,比如调整置信度阈值、加权系数等,找到最适配你数据集的参数

内容的提问来源于stack exchange,提问作者SMAmir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:32:05