别再只盯着准确率了!用sklearn实战搞懂分类模型的Precision、Recall和F1
别再只盯着准确率了用sklearn实战搞懂分类模型的Precision、Recall和F1当你第一次用sklearn训练完分类模型看到测试集上90%的准确率时是不是觉得稳了但实际部署后才发现这个高准确率模型根本抓不住关键事件——比如把癌症误诊为健康或者让垃圾邮件塞满收件箱。这时候你需要的不是accuracy而是三个更犀利的武器精确率、召回率和F1分数。1. 为什么准确率会骗人上周帮朋友分析一个信用卡欺诈检测模型测试集准确率高达99.5%但银行风控团队却抱怨完全抓不到骗子。打开混淆矩阵一看就明白了——在10000笔交易中欺诈交易只有50笔模型只要把所有交易都预测为正常就能轻松获得9950/1000099.5%的准确率。这种情况在类别不平衡的场景中尤为常见医疗诊断健康样本远多于患病样本异常检测正常事件占绝大多数推荐系统用户未点击商品远多于点击from sklearn.datasets import make_classification from sklearn.dummy import DummyClassifier # 生成极度不平衡数据集正负样本比例1:99 X, y make_classification(n_samples10000, weights[0.99], flip_y0, random_state42) # 使用总是预测多数类的策略 dummy DummyClassifier(strategymost_frequent).fit(X, y) print(f准确率: {dummy.score(X, y):.2%}) # 输出: 准确率: 99.00%提示当正样本比例低于5%时准确率指标基本失效此时需要关注precision和recall2. 三大核心指标实战解析2.1 精确率Precision宁缺毋滥精确率回答的问题是模型预测为正的样本中有多少是真的正样本这在误判成本高的场景至关重要。比如法律量刑预测错判比漏判更严重电商推荐用户对误推商品更敏感from sklearn.metrics import precision_score # 真实标签1代表重要邮件0代表普通邮件 y_true [1, 0, 0, 1, 1, 0, 1, 1] # 模型预测第2、5个预测错误 y_pred [1, 1, 0, 1, 0, 0, 1, 1] precision precision_score(y_true, y_pred) print(f精确率: {precision:.2f}) # 输出: 精确率: 0.80计算过程解析TP真正例 4第1、4、7、8个样本FP假正例 1第2个样本Precision TP / (TP FP) 4/(41) 0.82.2 召回率Recall宁可错杀召回率关注实际为正的样本中模型抓住了多少适用于漏网之鱼代价大的场景癌症筛查宁可误诊也不能漏诊安全监控不能放过任何潜在威胁from sklearn.metrics import recall_score recall recall_score(y_true, y_pred) print(f召回率: {recall:.2f}) # 输出: 召回率: 0.80计算逻辑FN假负例 1第5个样本Recall TP / (TP FN) 4/(41) 0.82.3 F1分数精准与召回的艺术平衡F1是precision和recall的调和平均数在两者需要兼顾时使用。比如搜索引擎结果排序既要相关度高又要覆盖广客服机器人既要准确回答又要覆盖多问题类型from sklearn.metrics import f1_score f1 f1_score(y_true, y_pred) print(fF1分数: {f1:.2f}) # 输出: F1分数: 0.80计算公式F1 2 × (precision × recall) / (precision recall)3. 多分类场景下的指标计算当类别超过两类时sklearn提供了多种平均策略策略类型计算方式适用场景macro各类别指标的算术平均重视所有类别平等micro全局统计TP/FP/TN/FN关注样本量大的类weighted按类别样本量加权平均考虑类别不平衡from sklearn.metrics import precision_score y_true [0, 1, 2, 0, 1, 2] y_pred [0, 2, 1, 0, 0, 1] print(macro精度:, precision_score(y_true, y_pred, averagemacro)) # 0.22 print(micro精度:, precision_score(y_true, y_pred, averagemicro)) # 0.33 print(加权精度:, precision_score(y_true, y_pred, averageweighted)) # 0.22 print(各类别精度:, precision_score(y_true, y_pred, averageNone)) # [0.67, 0. , 0. ]4. 实际项目中的指标选择策略在金融风控项目中我们这样制定评估策略确定业务优先级反欺诈高Recall宁可误拦也不能漏掉欺诈信用评分高Precision拒绝好客户比放过坏客户更糟调整分类阈值from sklearn.linear_model import LogisticRegression from sklearn.metrics import precision_recall_curve model LogisticRegression().fit(X_train, y_train) y_scores model.predict_proba(X_test)[:, 1] precisions, recalls, thresholds precision_recall_curve(y_test, y_scores) # 找到满足recall90%的最低阈值 threshold_90recall thresholds[np.argmax(recalls 0.90)]绘制P-R曲线import matplotlib.pyplot as plt plt.plot(recalls, precisions, linewidth2) plt.xlabel(Recall) plt.ylabel(Precision) plt.title(Precision-Recall Tradeoff)选择最佳平衡点医疗诊断选择recall突然下降的拐点内容审核选择precision陡降前的阈值最后在客户流失预测项目中我们发现单纯追求recall会导致给太多客户发放优惠成本激增只看precision又会漏掉高价值客户收入损失最终选择F1最高的阈值使保留客户数提升37%
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2578356.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!