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

如何调整决策树分类器的阈值以提升召回率?

解决决策树模型的精确率-召回率阈值调整问题

为什么precision_recall_curve只返回3个元素?

这是完全正常的。和线性模型(比如SGDClassifier)不同,决策树的预测得分本质是样本所属类别的概率(或叶节点的类别占比),而树模型的输出是离散的——每个样本只会落到一个叶节点,对应的类别概率是固定的几个值(比如二分类下,可能只有0.3、0.7、1.0这类离散值)。

precision_recall_curve的输出节点数等于模型输出的不同得分值的数量+1,所以如果你的决策树结构简单,输出的概率值种类少,曲线节点自然就少。比如二分类下,若树只分裂几次,可能只有3种不同的概率输出,对应曲线就只有3个节点。

如何获取决策树的"得分"来调整阈值?

决策树没有decision_function,但可以用predict_proba()方法获取样本属于正类的概率,以此作为阈值调整的依据:

# 假设你的Pipeline命名为pipe,X是特征数据
y_proba = pipe.predict_proba(X)[:, 1]  # 取正类的概率

之后用这个y_proba来计算精确率-召回率曲线:

from sklearn.metrics import precision_recall_curve

precision, recall, thresholds = precision_recall_curve(y_true, y_proba)

怎么选择阈值提升召回率?

召回率的定义是正确预测的正样本数 / 所有真实正样本数,要提升召回率,需要降低分类阈值——让更多样本被判定为正类。具体步骤:

  1. 先画出精确率-召回率曲线,直观观察两者的权衡关系:
import matplotlib.pyplot as plt

plt.plot(recall, precision)
plt.xlabel("召回率")
plt.ylabel("精确率")
plt.title("精确率-召回率曲线")
plt.show()
  1. 根据你的业务需求(比如希望召回率达到0.9),找到对应阈值:
# 找到召回率首次大于等于0.9的阈值
target_recall = 0.9
idx = next(i for i, r in enumerate(recall) if r >= target_recall)
best_threshold = thresholds[idx]
  1. 用这个阈值重新分类:
y_pred = (y_proba >= best_threshold).astype(int)

结合分层交叉验证的注意事项

在交叉验证过程中,要确保每个fold的阈值都是基于该fold的验证集计算,避免数据泄露:

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5)
y_proba_cv = []
y_true_cv = []

for train_idx, val_idx in skf.split(X, y):
    X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
    y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
    pipe.fit(X_train, y_train)
    y_proba_val = pipe.predict_proba(X_val)[:, 1]
    y_proba_cv.extend(y_proba_val)
    y_true_cv.extend(y_val)

# 用交叉验证得到的所有概率计算曲线
precision, recall, thresholds = precision_recall_curve(y_true_cv, y_proba_cv)

内容的提问来源于stack exchange,提问作者Andre Luiz Moura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:25:06