1、评价指标
分类算法常见的评估指标如下:
对于二类分类器/分类算法,评价指标主要有accuracy, [Precision,Recall,F-score,Pr曲线],ROC-AUC曲线。
对于多类分类器/分类算法,评价指标主要有accuracy, [宏平均和微平均,F-score]。
对于回归预测类常见的评估指标如下:
平均绝对误差(Mean Absolute Error,MAE),均方误差(Mean Squared Error,MSE),平均绝对百分误差(Mean Absolute Percentage Error,MAPE),均方根误差(Root Mean Squared Error), R2(R-Square)
平均绝对误差(Mean Absolute Error,MAE):能更好地反映预测值与真实值误差的实际情况,其计算公式如下:
M
A
E
=
1
N
∑
i
=
1
N
∣
y
i
−
y
^
i
∣
MAE=\frac{1}{N} \sum_{i=1}^{N}\left|y_{i}-\hat{y}_{i}\right|
MAE=N1i=1∑N∣yi−y^i∣
均方误差(Mean Squared Error,MSE)计算公式为:
M
S
E
=
1
N
∑
i
=
1
N
(
y
i
−
y
^
i
)
2
MSE=\frac{1}{N} \sum_{i=1}^{N}\left(y_{i}-\hat{y}_{i}\right)^{2}
MSE=N1i=1∑N(yi−y^i)2
(MAE, MSE与回归模型中的ridge regression和LASSO regression正则化项相对应, 说到根本, 回归模型的误差就是预测样本点与真实样本点距离的衡量. 同样的, 计算机视觉领域十分重要的一个研究点是模板匹配, 所以可以考虑将模版匹配中使用的距离计算公式应用到回归模型的评价指标. 评价指标属于策略, 可以作为目标函数.)
R2(R-Square)的公式由两部分组成为:
(1) 残差平方和:
S
S
r
e
s
=
∑
(
y
i
−
y
^
i
)
2
SS_{res}=\sum\left(y_{i}-\hat{y}_{i}\right)^{2}
SSres=∑(yi−y^i)2
(2) 总平均值:
S
S
t
o
t
=
∑
(
y
i
−
y
‾
i
)
2
SS_{tot}=\sum\left(y_{i}-\overline{y}_{i}\right)^{2}
SStot=∑(yi−yi)2
得到 R2 表达式为:
R
2
=
1
−
S
S
r
e
s
S
S
t
o
t
=
1
−
∑
(
y
i
−
y
^
i
)
2
∑
(
y
i
−
y
‾
)
2
R^{2}=1-\frac{SS_{res}}{SS_{tot}}=1-\frac{\sum\left(y_{i}-\hat{y}_{i}\right)^{2}}{\sum\left(y_{i}-\overline{y}\right)^{2}}
R2=1−SStotSSres=1−∑(yi−y)2∑(yi−y^i)2
R
2
R^2
R2用于度量因变量的变异中可由自变量解释部分所占的比例,取值范围是 0-1;
R
2
R^2
R2越接近1,表明回归平方和占总平方和的比例越大,回归线与各观测点越接近,用x的变化来解释y值变化的部分就越多,回归的拟合程度就越好。所以R^2也称为拟合优度(Goodness of Fit)的统计量。
y
i
y_{i}
yi表示真实值,
y
^
i
\hat{y}_{i}
y^i表示预测值,
y
‾
i
\overline{y}_{i}
yi表示样本均值。得分越高拟合效果越好。
分类指标平价计算示例
混淆矩阵:
1、accuracy
import numpy as np
from sklearn.metrics import accuracy_score
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 1]
print('ACC:',accuracy_score(y_true, y_pred)) # 输入为list
2、Precision,Recall,F1-score(classification_report)
from sklearn import metrics
y_pred = [0, 1, 0, 0]
y_true = [0, 1, 0, 1]
print('Precision',metrics.precision_score(y_true, y_pred)) #list
print('Recall',metrics.recall_score(y_true, y_pred))
print('F1-score:',metrics.f1_score(y_true, y_pred))
3、 AUC
import numpy as np
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print('AUC socre:',roc_auc_score(y_true, y_scores))# ndarray
AUC (Area Under Curve) 被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围一般在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。
既然已经这么多评价标准,为什么还要使用ROC和AUC呢?因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。下图是ROC曲线和Precision-Recall曲线的对比:
在上图中,(a)和©为ROC曲线,(b)和(d)为Precision-Recall曲线。(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,©和(d)是将测试集中负样本的数量增加到原来的10倍后,分类器的结果。可以明显的看出,ROC曲线基本保持原貌,而Precision-Recall曲线则变化较大。
(作者:zhwhong 链接:https://www.jianshu.com/p/c61ae11cc5f6 来源:简书 著作权归作者所有。)
回归指标平价计算示例
1、MSE、RMSE、MAE、MAPE(ndarray)
# coding=utf-8
import numpy as np
from sklearn import metrics
# MAPE需要自己实现
def mape(y_true, y_pred):
return np.mean(np.abs((y_pred - y_true) / y_true))
y_true = np.array([1.0, 5.0, 4.0, 3.0, 2.0, 5.0, -3.0])
y_pred = np.array([1.0, 4.5, 3.8, 3.2, 3.0, 4.8, -2.2])
# MSE
print('MSE:',metrics.mean_squared_error(y_true, y_pred))
# RMSE
print('RMSE:',np.sqrt(metrics.mean_squared_error(y_true, y_pred)))
# MAE
print('MAE:',metrics.mean_absolute_error(y_true, y_pred))
# MAPE
print('MAPE:',mape(y_true, y_pred))
2、R2-score
from sklearn.metrics import r2_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
print('R2-score:',r2_score(y_true, y_pred))#list
2、经验总结
作为切入一道赛题的基础,赛题理解是极其重要的,对于赛题的理解甚至会影响后续的特征工程构建以及模型的选择,最主要是会影响后续发展工作的方向,比如挖掘特征的方向或者存在问题解决问题的方向,对了赛题背后的思想以及赛题业务逻辑的清晰,也很有利于花费更少时间构建更为有效的特征模型,赛题理解要达到的地步是什么呢,把一道赛题转化为一种宏观理解的解决思路。 以下将从多方面对于此进行说明:
(1) 赛题理解究竟是理解什么
理解赛题是不是把一道赛题的背景介绍读一遍就OK了呢?并不是的,理解赛题其实也是从直观上梳理问题,分析问题是否可行的方法,有多少可行度,赛题做的价值大不大,理清一道赛题要从背后的赛题背景引发的赛题任务理解其中的任务逻辑.
a. 可能对于赛题有意义的外在数据有哪些
b. 知道现在和任务的相关数据有哪些,其中数据之间的关联逻辑是什么样的。
c. 该赛题符合的问题是什么问题?
大概要去用哪些指标?
哪些指标是否会做到线上线下的一致性?
是否有效的利于我们进一步的探索更高线上分数的线下验证方法?
(2) 有了赛题理解后能做什么
在对于赛题有了一定的了解后,分析清楚了问题的类型性质和对于数据理解的这一基础上,是不是赛题理解就做完了呢? 并不是的,就像摸清了敌情后,我们至少就要有一些相应的理解分析:
a. 这题的难点可能在哪里,关键点可能在哪里
b. 哪些地方可以挖掘更好的特征
c. 用什么样的线下验证方式更为稳定
d. 出现了过拟合或者其他问题,估摸可以用什么方法去解决这些问题
e. 哪些数据是可靠的
f. 哪些数据是需要精密的处理的,哪部分数据应该是关键数据(背景的业务逻辑下,比如CTR的题,一个寻常顾客大体会有怎么样的购买行为逻辑规律,或者风电那种题,如果机组比较邻近,相关一些风速,转速特征是否会很近似)
这时是在一个宏观的大体下分析的,有助于摸清整个题的思路脉络,以及后续的分析方向。
(3) 赛题理解的-评价指标
为什么要把这部分单独拿出来呢,因为这部分会涉及后续模型预测中两个很重要的问题:
a. 本地模型的验证方式,很多情况下,线上验证是有一定的时间和次数限制的,所以在比赛中构建一个合理的本地的验证集和验证的评价指标是很关键的步骤,能有效的节省很多时间。
b. 不同的指标对于同样的预测结果是具有误差敏感的差异性的,比如AUC,logloss, MAE,RSME,或者一些特定的评价函数。是会有很大可能会影响后续一些预测的侧重点。
(4) 赛题背景中可能潜在隐藏的条件
其实赛题中有些说明是很有意义-都可以在后续答辩中以及问题思考中所体现出来的,比如高效性要求,比如对于数据异常的识别处理,比如工序流程的差异性,比如模型运行的时间,比如模型的鲁棒性,有些的意识是可以贯穿问题思考,特征,模型以及后续处理的,也有些会对于特征构建或者选择模型上有很大益处,反过来如果在模型预测效果不好,其实有时也要反过来思考,是不是赛题背景有没有哪方面理解不清晰或者什么其中的问题没考虑到。
参考文章:
1、https://tianchi.aliyun.com/notebook-ai/detail?postId=95456
2、https://www.jianshu.com/p/c61ae11cc5f6