模型常用评估指标详解

简介

模型评估通常作为建模的最后一步,用于评估模型效果,判别该模型是否达到预期。但实际模型评估指标需要在建模的第一步确定,即确定目标函数。凡事都得有个目标,才知道努力的(拟合)方向,否则枉然。
连续值或者分类型的预测最常用的说法就是模型精度,但实际精度一词有多重含义,例如连续性预测模型常用的是MAPE/RMSE,而分类常用AUC/accuracy/recall/specify等等。本文将介绍常用的评估指标,并对应下各指标的不同称呼。

0-1分类预测的评估

一般的分类都是二元分类,而最常用的则是ROC曲线下方的面积AUC值了。首先需要知道混淆矩阵的构成,以及其衍生的一系列评估指标,取其不同阈值下的两个评估指标,即可构成ROC曲线,而曲线下方的面积,即为AUC值。

混淆矩阵

对于而分类问题,记1为正例,0为负例,预测和实际的值则会出现4中组合,例如,对某一样本,预测值为1(Positive),而实际值也为1,说明预测正确,即为 True Positive(真正例),反之如果实际值为0,则预测错误,即为 False Positive(假正例)。根据4中组合,得到混淆矩阵如下:

预测-1 预测-0
实际-1 True Positive(TP) False Negative(FN) Actual Positive (P=TP+FN)
实际-0 False Positive(FP) True Negative(TN) Actual Negative (N=FP+TN)
Predicted Positive (P’=TP+FP) Predicted Negative (N’=FN+TN) TP+FP+FN+TN

衍生的各种评估指标如下:

  • 准确率(accuracy)
    • TP+TNTP+FP+FN+TNTP+TNTP+FP+FN+TN
  • 错误率
    • FP+FNTP+FP+FN+TNFP+FNTP+FP+FN+TN
  • 敏感度(sensitivity)、真正例率、召回率(recall)
    • TPTP+FNTPTP+FN
  • 特效性(specificity)、真负例率
    • TNFP+TNTNFP+TN
  • 精度(precision)
    • TPTP+FPTPTP+FP
  • F1F1、F分数(精度和召回率的调和均值)
    • 2×precision×recallprecision+recall=F1=2TP2TP+FP+FN2×precision×recallprecision+recall=F1=2TP2TP+FP+FN
    • 实际来自于: 2F1=1P+1R2F1=1P+1R

ROC曲线

分类模型的原始预测值是0~1之间的连续型数值,可理解为因变量取1的概率,一般取0.5作为阈值,即小于0.5记为预测的0,大于等于0.5记为预测的1;而实际上根据不同情况可以取不同的阈值。

例如,银行预测可能发生贷款逾期的账目,由于整体逾期率非常低,例如样本中100个只有1个逾期,如果只看准确率,那么全预测0(即,不逾期)则可达到99%的准确率,显然不妥,因此此时会秉着宁可错杀一千不可放过一个的原则,会将阈值适当降低,例如降到0.1,若大于0.1则预测为1。(实际上此时主要的评估指标会选择recall)。

用不同的阀值,统计出每组不同阀值下的精确率和召回率,

  • 横坐标:假正率(FPR,即 1-specificity,1-真负例率)
    • FPR = FP /(FP + TN)
  • 纵坐标:真正例率(TPR, 即 recall
    • TPR = TP /(TP + FN)

即可画出ROC曲线(受试者工作特征曲线,receiver operating characteristic curve),示例(图片来源于他处)如下

模型常用评估指标详解_第1张图片

ROC曲线优势就是,当正负样本的分布发生变化时,其形状能够基本保持不变,因此其面积AUC值,可以说是极度适用于不平衡样本(例如以上的银行逾期数据,正负比极度不均衡)的建模评估了。AUC越大,模型分类效果越好,一般来说,AUC低于0.7的模型基本上是个废柴了。(若在正负样本比1:1情况下全预测为0或者1,AUC即为0.5)

R语言实现

可使用ROCR包计算AUC值,混淆矩阵自己写即可,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
library(ROCR)
get_confusion_stat <- function(pred,y_real,threshold=0.5){
  # auc
  tmp <- prediction(as.vector(pred),y_real)
  auc <- unlist(slot(performance(tmp,'auc'),'y.values'))
  # statistic
  pred_new <- as.integer(pred>threshold) 
  tab <- table(pred_new,y_real)
  if(nrow(tab)==1){
    print('preds all zero !')
    return(0)
  }
  TP <- tab[2,2]
  TN <- tab[1,1]
  FP <- tab[2,1]
  FN <- tab[1,2]
  accuracy <- round((TP+TN)/(TP+FN+FP+TN),4)
  recall_sensitivity <- round(TP/(TP+FN),4)
  precision <- round(TP/(TP+FP),4)
  specificity <- round(TN/(TN+FP),4)
  # 添加,预测的负例占比(业务解释:去除多少的样本,达到多少的recall)
  neg_rate <- round((TN+FN)/(TP+TN+FP+FN),4)
  re <- list('AUC' = auc,
             'Confusion_Matrix'=tab,
             'Statistics'=data.frame(value=c('accuracy'=accuracy,
                                             'recall_sensitivity'=recall_sensitivity,
                                             'precision'=precision,
                                             'specificity'=specificity,
                                             'neg_rate'=neg_rate)))
  return(re)
}

引用上篇lasso-R示例博文的评估结果示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# $AUC
# [1] 0.8406198

# $Confusion_Matrix
        # y_real
# pred_new   0   1
       # 0  20   8
       # 1  32 131

# $Statistics
                    # value
# accuracy           0.7906
# recall_sensitivity 0.9424
# precision          0.8037
# specificity        0.3846
# neg_rate           0.1466

连续值预测的评估

连续型变量的预测,通常使用MAPE和RMSE。对于回归问题的模型还经常使用拟合优度 R2R2 作为评估指标。

MAPE

MAPE(mean absolute percentage error)为平均百分比误差,预测连续型数据的准确率一般指1-MAPE,例如预测未来10个月的GDP数据,准确率达到98%,即代表该模型的预测 MAPE 为2%。

MAPE=∑t=1n∣∣∣observedt−predictedtobservedt∣∣∣×100nMAPE=∑t=1n|observedt−predictedtobservedt|×100n

MSE/RMSE

RMSE(root mean square error)为均方根误差,相应的MSE(mean square error)即为误差的平方和,两者含义一致,指标越小则模型效果越好。

RMSE=1N∑t=1N(observedt−predictedt)2−−−−−−−−−−−−−−−−−−−−−−−−−⎷RMSE=1N∑t=1N(observedt−predictedt)2

拟合优度

拟合优度(Goodness of Fit)是指回归直线对观测值的拟合程度。

R²/可决系数

度量拟合优度的统计量是可决系数(亦称确定系数)R²。R²的值越接近1,说明回归直线对观测值的拟合程度越好;反之,R²的值越小,说明回归直线对观测值的拟合程度越差。R²等于回归平方和( explained sum of squares)在总平方和( total sum of squares)中所占的比率,即回归方程所能解释的因变量变异性的百分比。

注意,回归问题才能用R²衡量

R2=SSregSStss=1−SSrssSStss=1−∑i(yi−fi)2∑i(yi−y¯)2R2=SSregSStss=1−SSrssSStss=1−∑i(yi−fi)2∑i(yi−y¯)2

由以上公式实际上可知,在带有截距项的线性最小二乘多元回归中(注意这个前提条件),R2R2就是预测值和实际值相关系数的平方,即(注意,一定是线性回归模型才行):

R2=cor(yreal,yfit)2R2=cor(yreal,yfit)2

调整的R²

在模型中增加多个变量(即使是无实际意义的变量)也能小幅度提高R平方的值,因此需要考虑模型的变量数作为相应惩罚,于是得到调整的R²如下:

R2adjusted=1−SSrss/(n−p−1))SStss/(n−1)Radjusted2=1−SSrss/(n−p−1))SStss/(n−1)

R语言实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# MAPE
get_mape <- function(fit,y){
  # 实际值为0的,直接不纳入计算
  re <- round(mean(ifelse(y==0,NA,abs(y-fit)/y),na.rm=T)*100,1)
  return(re)
}

# R方,可决系数,coefficient of determination
get_rsq <- function(preds,actual,p=1){
  rss <- sum((actual - preds) ^ 2)
  tss <- sum((actual - mean(actual)) ^ 2)
  rsq <- round(1 - rss/tss,3)
  n <- length(preds)
  # 调整的R方 1-(1-rsq)*(n-1)/(n-1-1) 也一样
  rsq_ad <- round(1 - (rss/(n-p-1))/(tss/(n-1)),3)
  return(list('rsq'=rsq,
              'rsq_ad'=rsq_ad))
}

你可能感兴趣的:(回归分析(logistic,cox),机器学习,人工智能,python)