1 背景
做完一个模型之后,无论是回归还是分类,均需要去评判这个模型的优劣!如何去判断呢?在统计上有很多指标去进行衡量,而且不同的场景下应用的指标也会有一些差异!下面就和小编的视角来一探究竟吧!
2 评价指标有哪些?
分类问题评价指标:
- 准确率(Accuracy)
斜对角线元素之和除以总数。
- 精确率(Precision)
竖着除!即预测为某一类中实际为该类的概率!以用户流失与否的场景为例,精确率应用的场景是尽可能不打扰用户,希望精确率尽可能高即预测流失的用户都尽可能预测对了!这样对流失用户做一些行为干扰都是ok的!也不会打扰本来就不会流失的用户!
- 召回率(Recall)
横着除!即实际为某一类的用户中被预测为该类的概率值!以警方抓逃犯的场景为例,我们总是希望尽可能多的实际逃犯被预测对,然后被抓住!也即实际为罪犯的被预测也为罪犯!即为召回率!能捞回来的人!
- F1
F1值是精确率和召回率的调和值,更接近于两个数较小的那个,所以精确率和召回率接近时,F1值最大。很多推荐系统的评测指标就是用F1值的。
2/F1 = 1/P + 1/R
- AUC
AUC(Area Under Curve)被定义为ROC曲线下的面积(ROC的积分),通常大于0.5小于1。随机挑选一个正样本以及一个负样本,分类器判定正样本的值高于负样本的概率就是 AUC 值。AUC值(面积)越大的分类器,性能越好
- ROC曲线
- K-S(一般用于信贷场景)
- PR 曲线
- 。。。。。。
上述几种:AUC ROC K-S PR曲线 后续再单独开博客继续补充!因为知识点较多~
回归问题评价指标:
- 残差平方和 mse
3 Python如何实现?
3.1 classification_report 如何解读?
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
lr = LogisticRegression()
lr.fit(X_train, y_train)
pre = lr.predict(X_test)
print(classification_report(y_test, pre))
结果如下:
3.2 混淆矩阵
混淆矩阵如下:
print(metrics.confusion_matrix(y_test, pre))
结果解读:一开始看到上面这个report返回结果有点懵逼,不知道该咋看,后来查了相关资料才弄懂,故记录一下。
- 精确率,召回率,F1都是会分类计算,即不同类别都会有一个结果。所以report上部分就好解释了。
- 在实际为横,预测为纵轴时,符合下述规律:精确率→竖着除;召回率→横着除;
- 比如 0类精确率0.82 = 1424/(1424+320) ;1类召回率0.01=4/(4+320) ;0类F1 0.9 = 20.821 / (0.82+1)
关键来了,下面三行代表啥呢?
- 第一行好理解,代表精确率,也即Accuracy, 0.81 = (1424+4)/ (1430+324)
- 第二行代表最上面代表的几个指标的均值,无权重,直接平均。
- 第三行代表最上面代表的几个指标的加权平均,权重等于各自类别的占比,比如0类权重就是1430/(1430+324)
3.3 计算AUC的两种方法
- 方法1 自己定义函数
def CalAuc(model, X_test, y_test):
# 看测试集AUC为多少
from sklearn import metrics
pred = model.predict_proba(X_test)[:,1]
fpr, tpr, thresholds = metrics.roc_curve(y_test, pred)
auc = metrics.auc(fpr, tpr)
print('模型在测试集上的AUC值为: %.4f' %(auc))
- 方法2 : sklearn自带
from sklearn import metrics print(metrics.roc_auc_score(pre, y_test))
- 疑问:两种方法计算出来的AUC结果不一样?这是为什么呢?有待进一步的思考!
- 疑问解答:上面的roc_auc_score用错了!应该是把实际值放在前面,pre的概率值放在后面!详情见小编的另一篇评价指标的博客!!!