关于评估标准的理解(样本不平衡,准确率,召回率,ROC曲线等)

今天在分析数据的时候遇到一个样本数据不平衡的问题,以前在学习机器学习的时候有学到样本数据不平衡的原因和解决方法,不过因为那时候并不在意,觉得数据多得是嘛,不平横就随机训练和丢弃一些就好了,根本没仔细考虑到数据量小的情况。

有时候数据量呈现8比2的比例,也就是正样本与负样本的数量比为8:2,这时候在做机器学习就需要考虑如何合理的训练与分配数据了,值得一提的是,样本不平衡的情况十分常见。

不过样本不平衡会带来什么问题呢,这也是今天想讲的一点故事,举个十分简单又实际的例子

假设有10个人 8个好人和2个坏人
如果存在一个机器学习模型,遇到人就说好人,那么模型的预测结果将会是 好人, 好人, ......

利用准确率的计算方式 ACC = 8个好人预测正确/总共有10个人 = 0.8 得这个机器模型的预测准确率为80%
有没有感觉很奇怪,我猜硬币才只有50%正确率,怎么这个模型只说好人,准确率这么高的?
而且,这个模型是不是不能够识别坏人?

其实原因有两个 1. 数据不平衡 2. 准确率不适合数据不平横的情况

准确率是非常直观的度量指标,也是我们接触的最多的,不过在对付数据不平衡的问题下,准确率就难以反映真实情况。

准确率,在二分类任务中,因为总共只有好或者坏,所以 准确率 = 准确预测好人的能力 + 准确预测坏人的能力

不知道大家有没有发现,虽然不能够识别坏人,但是准确预测好人的能力这个可以拉分,只要好人多过坏人,那么我就可以保证我的预测能力大于50%,如果全是好人,那么我的准确率就100%。准确率就是这么被直接拉高了。因为在数据不平衡的情况下,预测好人的能力的占比可能大于一半,从而掩盖了预测坏人能力比较弱的事实。

这就是为什么在数据不平衡的情况下,准确率无法体现模型的真实水平。
不过还是有多人直接在数据不平衡下用准确率作为指标,在某些准确率高达95,96%的实验结果上,连样本数据都是不平横的。这样的准确率是无意义的。

对于上述情况,我们可以从两个方面解决 1. 解决数据不平衡问题 2. 细化评估指标

  • 解决数据不平衡问题
    最简单的方法就是补6个坏人平衡数据,那么总共就有16个人,模型的准确率就变为 8/16 = 0.5,一半准确率那就等于随便猜了。数据不平横的方法还有很多,以后会深入研究

  • 细化评估指标
    在现实生活中,解决数据不平衡数据是一个比较麻烦的问题,如果可以通过其他更详细的指标来评估,而不是去修改数据本身,那么是比较节省时间的。

于是乎才有我们今天要说的东西 - 评估指标 (这才是今天的重点)

我们知道 准确率 = 准确预测好人的能力 + 准确预测坏人的能力。把准确率细化为两个指标,分别是 指标1. 准确预测好人的能力 , 指标2. 准确预测坏人的能力

其实,准确预测好人的能力实际上就是敏感度,而准确预测坏人的能力就是特异度,都是机器学习上非常常用的度量指标

  1. 敏感度 sensitivity
    样本实际值为好人,模型把它预测为好人的正确率。公式: Sensitivity = True positives / (True positives + False negatives)

  2. 特异度 specificity
    样本实际值为坏人,模型把它预测为坏人的正确率。公式:Specificity = True negatives / (True negatives + False positives)

如果敏感度高,特异度低,那么模型只会看好人,不会看坏人。
如果敏感度低,特异度高,模型只会看坏人,不会看好人。
只有敏感度和特异度都比较高,模型既可以分辨好人也可以分辨坏人,才是一个有用的模型。

我们将这两个指标应用到上面的例子上,敏感度 = 8/8 = 1 ,特异度 = 0/2 = 0
可以看出,虽然敏感度特别高,但是特异度为0,说明这个模型不具备识别坏人的能力,所以这个模型是没有用的。

如果理解了敏感度和特异度,我们就可以开始了解一下混淆矩阵,解释一下上面的公式在说什么

m

左边 Real 表示实际值, Predict 表示预测值
我们把0看为好人,1看为坏人,那么

  • a:实际为好人,预测也为好人 - 叫作 真阳性 True Positive
  • b:实际为好人,预测为坏人 - 叫作假阴性 False Negative,也叫作误报 Type 1 error
  • c:实际为坏人,预测为好人 - 叫作假阳性 False Positive,漏报 Type 2 error
  • d:实际为坏人,预测为坏人 - 叫做真阴性 True Negative

### 准确率召回率和F1分数的概念 准确率(Precision),指的是预测为正类的样本实际为正类的比例。高精度意味着模型对于它所做出的积极预测非常有信心[^1]。 召回率(Recall),也被称为灵敏度或真正率,是指所有实际为正类的样本中有多少比例被成功识别出来。当希望尽可能多地找到所有的正实例时,较高的召回率是非常重要的[^2]。 F1分数是精确率和召回率的一个调和平均数,提供了一个单一指标来衡量二者的平衡情况。特别是在类别均衡的数据集中,F1得分能更好地反映出模型的整体性能。 ### 绘制 Precision-Recall 曲线的方法 为了绘制 Precision-Recall (P-R) 曲线,在同阈值下计算一系列的精准率和召回率点,并将这些点连成一条曲线。随着阈值的变化,曲线上每一点都对应着特定条件下的模型表现: ```python from sklearn.metrics import precision_recall_curve import matplotlib.pyplot as plt def plot_precision_recall(y_true, y_scores): precisions, recalls, thresholds = precision_recall_curve(y_true, y_scores) plt.figure(figsize=(8, 6)) plt.plot(thresholds, precisions[:-1], "b--", label="Precision") plt.plot(thresholds, recalls[:-1], "g-", label="Recall") plt.xlabel("Threshold") plt.legend(loc='best') plt.ylim([0, 1]) # Plot P-R curve without threshold dependency plt.figure(figsize=(8, 6)) plt.plot(recalls, precisions, 'r-', lw=2) plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('Recall') plt.ylabel('Precision') plt.title('Precision vs Recall Curve') plt.show() ``` 这段代码展示了如何基于给定的真实标签 `y_true` 和概率估计 `y_scores` 来创建 Precision-Recall 图表。 ### ROC曲线AUC的理解 接收者操作特性(ROC曲线通过改变决策边界来展示分类器的表现。该曲线以假阳性率(FPR)作为横坐标,真阳性率(TPR),即召回率为纵坐标。理想情况下,一个好的分类器应该具有靠近左上角的ROC曲线,这意味着即使在较低的误报水平下也能保持高的检测成功率[^3]。 面积在ROC下方的部分定义为 AUC 值;理论上讲,完美的分类器会得到一个等于1的最大可能AUC值。而随机猜测则会产生大约0.5左右的AUC值。因此,较大的AUC表明更好的区分能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值