分类问题的评估指标(Evaluation for Classifier)

机器学习开始学了回归问题的评估函数,经典的有RMSE(Root Mean Square Error)、MSE(Mean Square Error)、MAE(Mean Absolute Error)、RMSLE(Root Mean Square Logarithmic Error)等等。

 

但是分类问题不是拿这些来评估的。面试的时候还被问到了,只知道回归问题的评估标准是真的尴尬。

本文框架参考自:https://towardsdatascience.com/the-5-classification-evaluation-metrics-you-must-know-aa97784ff226

 

1. 准确率(Accuracy Rate)、精确率(Precision Rate)、召回率(Recall Rate,我也不知道为啥要称为recall):

先说上图这个表格,左边是预测结果,上面是实际结果。

准确率(Accuracy Rate):

很好理解,就是你预测对的概率,绿色的部分除以四个加起来。

Accuracy=\frac{TP+TN}{TP+TN+FP+FN}

精确率(Precision Rate):

就是你猜“正(Positive)”中,猜对的概率

Precision=\frac{TP}{TP+FP}

召回率(Recall Rate):

这是实际结果为“正(Positive)”中,你猜对的概率

Recall=\frac{TP}{TP+FN}

 

2. F1-score:

参考的文章中说,F1-score反应分类模型的精确率和召回率(Precision、Recall)的平衡问题。

F1=2*\frac{Precision*Recall}{Precision+Recall}

也就是:

F1=\frac{2}{\frac{1}{Precision}+\frac{1}{Recall}}

从式子中可以看出当Precision和Recall两者之一很小的时候,整个式子的就很大,F1就接近0。

所以Precision和Recall的关系如图:

将1中的式子代入计算,得到:

F1=\frac{1}{1+\frac{FP+FN}{2*TP}}

从这式子可以看出,当TP足够大时,F1会趋向于1;

而随着FP、FN的数量逐渐增大,挤兑TP的数量使其变小,则F1会逐渐增大;

当FP或FN中的任何一个数量变得很大的时候,\frac{FP+FN}{2*TP}的值会迅速增大,使得F1趋向于0;

但只要FP+FN的值不变,其实F1-score都不会变化。

也就是说,在F1-score中,精确率和召回率的比重(weight)是相同的。

所以也引入了

F1=(1+\beta ^{2})*\frac{Precision*Recall}{\beta ^{2}*Precision+Recall}

来调整精确率和召回率的比重关系。

 

3. 对数损失(或称,二元交叉熵)Logarithmic Loss/Binary Crossentropy

这种评估方法针对的是,模型的预测结果是概率值,而不是直接输出预测值的情况,因为下面展示的损失函数会用到概率值p,这是直接输出预测值的模型没有的。

通常适用于评估逻辑回归或者神经网络模型的结果。

损失函数:

在这个函数中,y代表实际结果,p代表预测的y=1的概率,也就是p=P(y=1)

当y=1时,如果预测结果显示y=1的概率很低,也就是预测很离谱的时候,log(p)的值就会趋于负无穷,导致损失函数非常大;

当y=0时,同样,如果预测结果显示y=1的概率很高,也就是预测很不正确的时候,(1-y)log(1-p)的值也会趋于负无穷,损失函数极大。

下图是y=1的情况下,损失函数随着p值的变化:

Python调用代码:

from sklearn.metrics import log_loss  
log_loss(y_true, y_pred, eps=1e-15)

# where y_pred are probabilities and y_true are binary class labels

关于log_loss的用法,documentation讲的太少,很多地方感觉没解释清楚,以下是我搜一些文章看来的,不一定正确

documentation:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.html

这里的y_true是实际预测值,也就是上面损失函数的y;如果实际值是个categorical量,那么会按字母拼音排序分配为0或者1。

y_pred是预测结果为对应y的概率,跟上面损失函数的p不太一样。

也就是如果你是一个二元分类预测,y_true=1,那么对应的y_pred就是P(y=1);如果y_true=0,则y_pred=P(y=0),这里有所不同。

y_true和y_pred的宽度要求一致。

 

4. 分类数据的交叉熵

就是第三节的多分类的拓展版

损失函数:

就是多个实际值以及他们对应的概率的熵值累加。

用法一样,不多赘述。

 

5. ROC曲线和AUC(AUC指ROC曲线的面积)

这里不得不呕血推荐,statquest:https://www.youtube.com/watch?v=4jRBRDbJemM

看下来之后我用一句话总结ROC的核心就是,“宁可犯错,绝不放过”。

ROC,中文为受试者工作特征曲线。

在ROC的曲线图中,我们需要知道横坐标和纵坐标代表的意思。

横坐标:False Postive Rate,指的是实际结果为Negative负的样本中,你预测错误,即你预测为Positive正的比率。

False Positive Rate=1-specificity=1-\frac{TN}{TN+FP}=\frac{FP}{TN+FP}

其中

specificity=\frac{TN}{TN+FP}

纵坐标:True Positive Rate,指的是实际结果为Postive正的样本中,你预测正确,即你你预测为Postive正的比率。

True Positive Rate=Sensitivity=\frac{TP}{TP+FN}

那讨论这两个量有什么意义呢?

假如你现在面对的一个预测问题是,病人被病毒感染的概率,那么从公共卫生安全的角度出发,我们所希望的是,即使误诊,也不要放过任何被感染个体的可能,防止出现大型的病毒传播事件。

在这里,就体现为:我们要尽可能地增大纵坐标的数值,确保阳性的患者被尽可能地一个不漏地诊断出来。

这个问题对应到我们训练模型的时候,就变成了阈值的取值问题。

比如一般情况下,我们在进行逻辑回归的时候,会将 P(y=1)>0.5的样本归类为类别1,反之将 P(y=1)<0.5的样本归类为类别0。

那么面对这个病毒感染问题的时候,我们宁可将0.5减少至比如0.1。即当这个样本有10%的机会感染的时候,我们也要把他归类为感染。

在这种情况下,

纵坐标的值会非常理想!但随着,横坐标的值,也就是原本没有被感染的人被误诊为感染的概率也可能会提升。

于是我们给横坐标与纵坐标的关系曲线,他是根据逐渐变化分类阈值而给出的曲线。

这就是ROC曲线

(说明: 根据训练集绘制ROC曲线的时候,将所有样本P(y=1)的概率排序后,按顺序选取他们的概率作为阈值,即可得出新的横坐标值和纵坐标值,得到和样本数一样多的点后,连成曲线,就得到了我们在实际训练中的ROC曲线。也就是说,ROC曲线不是又函数绘制出来的,而是由一个个点串连成的。)

那么根据ROC曲线,你就可以找到最合适的点,即找到分类模型最理想的阈值

 

AUC,Area Under Curve,翻译成中文就是“曲线下的面积”。

这就没什么好理解的,它就是一个评估ROC曲线好坏的方式。

比如你用逻辑回归的时候,可以得到一条ROC曲线;你用神经网络模型,会得到另一条ROC曲线。

而ROC曲线的面积越大,通常说明这个模型对于这种”宁错不放“的策略来说,是最好的。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值