机器学习开始学了回归问题的评估函数,经典的有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):
很好理解,就是你预测对的概率,绿色的部分除以四个加起来。
精确率(Precision Rate):
就是你猜“正(Positive)”中,猜对的概率
召回率(Recall Rate):
这是实际结果为“正(Positive)”中,你猜对的概率
2. F1-score:
参考的文章中说,F1-score反应分类模型的精确率和召回率(Precision、Recall)的平衡问题。
也就是:
从式子中可以看出当Precision和Recall两者之一很小的时候,整个式子的就很大,F1就接近0。
所以Precision和Recall的关系如图:
将1中的式子代入计算,得到:
从这式子可以看出,当TP足够大时,F1会趋向于1;
而随着FP、FN的数量逐渐增大,挤兑TP的数量使其变小,则F1会逐渐增大;
当FP或FN中的任何一个数量变得很大的时候,的值会迅速增大,使得F1趋向于0;
但只要FP+FN的值不变,其实F1-score都不会变化。
也就是说,在F1-score中,精确率和召回率的比重(weight)是相同的。
所以也引入了
来调整精确率和召回率的比重关系。
3. 对数损失(或称,二元交叉熵)Logarithmic Loss/Binary Crossentropy
这种评估方法针对的是,模型的预测结果是概率值,而不是直接输出预测值的情况,因为下面展示的损失函数会用到概率值p,这是直接输出预测值的模型没有的。
通常适用于评估逻辑回归或者神经网络模型的结果。
损失函数:
在这个函数中,y代表实际结果,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正的比率。
其中
纵坐标:True Positive Rate,指的是实际结果为Postive正的样本中,你预测正确,即你你预测为Postive正的比率。
那讨论这两个量有什么意义呢?
假如你现在面对的一个预测问题是,病人被病毒感染的概率,那么从公共卫生安全的角度出发,我们所希望的是,即使误诊,也不要放过任何被感染个体的可能,防止出现大型的病毒传播事件。
在这里,就体现为:我们要尽可能地增大纵坐标的数值,确保阳性的患者被尽可能地一个不漏地诊断出来。
这个问题对应到我们训练模型的时候,就变成了阈值的取值问题。
比如一般情况下,我们在进行逻辑回归的时候,会将 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曲线的面积越大,通常说明这个模型对于这种”宁错不放“的策略来说,是最好的。