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

留一法随机森林网格搜索后如何获取precision、recall绘制PR曲线

第一步:修正现有代码的笔误

你给出的原始代码存在两处语法/参数错误,先修正才能正常执行:

  • cv = LeaveOneOut() 行尾缺少逗号
  • 评估指标参数名是scoring而非score,二分类任务下f1分数的参数值为'f1'
    修正后的网格搜索初始化代码为:
grid_search = GridSearchCV(RF, 
                       param_grid=param_grid, 
                       cv = LeaveOneOut(),
                       scoring='f1')

执行grid_search.fit(X, y)后即可得到最优超参数的随机森林模型。

第二步:获取无泄露的交叉验证预测结果

不要直接用最优模型在全量X上预测,那样得到的评估指标存在数据泄露问题,我们采用留一法的 out-of-fold 预测结果计算指标:

from sklearn.model_selection import cross_val_predict
from sklearn.metrics import confusion_matrix, precision_score, recall_score, precision_recall_curve
import matplotlib.pyplot as plt

# 提取网格搜索得到的最优模型
best_rf = grid_search.best_estimator_

# 用留一法获取每个样本的预测标签
y_pred = cross_val_predict(best_rf, X, y, cv=LeaveOneOut())
# 获取正类的预测概率,用于后续绘制PR曲线
y_proba = cross_val_predict(best_rf, X, y, cv=LeaveOneOut(), method='predict_proba')[:, 1]

第三步:计算所需评估指标

1. 混淆矩阵(TP、FP、TN、FN,你提到的NP应为FP的笔误)

tn, fp, fn, tp = confusion_matrix(y, y_pred).ravel()
print(f"TP:{tp}, FP:{fp}, TN:{tn}, FN:{fn}")

2. 精确率和召回率

precision = precision_score(y, y_pred)
recall = recall_score(y, y_pred)
print(f"精确率:{precision:.4f}, 召回率:{recall:.4f}")

第四步:绘制Precision-Recall曲线

# 获取不同阈值下的精确率、召回率序列
precisions, recalls, thresholds = precision_recall_curve(y, y_proba)

# 绘图
plt.plot(recalls, precisions)
plt.xlabel('召回率 (Recall)')
plt.ylabel('精确率 (Precision)')
plt.title('随机森林模型精确率-召回率曲线')
plt.grid(alpha=0.3)
plt.show()

注意事项

  • 如果是多分类任务,计算精确率、召回率时需要指定average参数(可选'macro'/'weighted'等),PR曲线需要针对每个类别单独绘制
  • 留一法的计算量和样本量正相关,样本量过大时可换成K折交叉验证提升效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 22:54:02