模型评价

R语言
机器学习
作者

不止BI

发布于

2024年4月11日

修改于

2024年6月11日

评估模型

二分类模型

对于二分类模型,评估模型的分类效果,两个办法。

  1. 可以用 AUC 指标或者 ROC 曲线。
  2. 可以用 Wilcoxon 检验,越显著表示分类效果越好。

先用mlr3构建模型

代码
library(mlr3verse)
# 创建任务
tsk_german_credit = tsk("german_credit")
# 选择学习器
lrn_ranger = lrn("classif.ranger",predict_type = "prob")
# 划分训练集测试集
split <- partition(tsk_german_credit, ratio = 0.6, stratify = T)
lrn_ranger$train(tsk_german_credit, row_ids = split$train)
prediction <- lrn_ranger$predict(tsk_german_credit, row_ids = split$test)

混淆矩阵

混淆矩阵(Confusion Matrix)是评估分类模型性能的一种工具,特别是在二分类和多分类问题中。它通过总结模型的预测结果与真实标签之间的关系,帮助我们理解模型的表现。

在二分类问题中,混淆矩阵通常有以下四个部分:

  1. 真正例(True Positive, TP):模型正确预测为正类的样本数量。

  2. 假正例(False Positive, FP):模型错误预测为正类的样本数量(实际上是负类)。

  3. 真负例(True Negative, TN):模型正确预测为负类的样本数量。

  4. 假负例(False Negative, FN):模型错误预测为负类的样本数量(实际上是正类)。

混淆矩阵的结构通常如下:

真实
预测 正类 负类
正类 TP FP
负类 FN TN
代码
prediction$confusion
        truth
response good bad
    good  262  75
    bad    18  45

从混淆矩阵中,我们可以计算出以下指标:

  • 准确率\(\frac{TP + TN}{TP+FN+FP+TN}\)

  • 精确率 (Precision) :\(\frac{TP }{TP+FP}\)。精确率帮助我们判断在模型预测为正类时,有多少比例是正确的。这对于需要高精确度的场景尤其重要,例如疾病筛查、垃圾邮件识别等。

  • 召回率 (Recall 或 Sensitivity):\(\frac{TP }{TP+FN}\),表示所有实际正类中被正确分类的比例。

  • 特异度 (Specificity):\(\frac{TN }{TN+FP}\),是真负类率(True Negative Rate),即正确预测为负的样本占所有实际负例的比例。它衡量了模型识别负类的能力。

  • 假正类率(False Positive Rate, FPR):\(\frac{FP }{TN+FP}\),表示所有实际负类中被错误分类为正类的比例。

tpr、fpr、tnr 、fnr的分母都是实际值(实际正类或实际负类)

代码
measures <- msrs(c("classif.acc", "classif.tpr","classif.fpr","classif.tnr",
                   "classif.fnr","classif.precision", "classif.recall","classif.sensitivity", "classif.specificity"))
prediction$score(measures)
        classif.acc         classif.tpr         classif.fpr         classif.tnr 
         0.76750000          0.93571429          0.62500000          0.37500000 
        classif.fnr   classif.precision      classif.recall classif.sensitivity 
         0.06428571          0.77744807          0.93571429          0.93571429 
classif.specificity 
         0.37500000 

ROC 曲线和 AUC 值

  • ROC 曲线

    • ROC 曲线是一种图形表示,用于展示不同划分阈值设置下分类器的性能。它是真正类率(True Positive Rate, TPR)和假正类率(False Positive Rate, FPR)之间的二维图。

    • ROC 曲线从左下角(0,0)开始,向右上方(1,1)结束。FPR=1-TNR,自然地,真正率和真负率越高,模型越好,即模型曲线越往左上凸,曲线下的面积越大,表示分类器的性能越好。

代码
autoplot(prediction,type = 'roc')

  • AUC 值

    • AUC 是 area under curve 的缩写,是 ROC 曲线下的面积,范围从 0 到 1。AUC 值越高,表示模型的分类性能越好。

    • 一个完美的分类器将具有 AUC 值为 1 的 ROC 曲线,而一个没有区分能力的分类器的 AUC 值接近 0.5,相当于随机猜测。

代码
prediction$score(msr("classif.auc"))
classif.auc 
  0.7815774 

ROC 是 Receiver Operating Characteristic 简写。随机抽取 2000 个样本作为训练集,余下的数据作为测试集。

Wilcoxon 检验

Wilcoxon 检验是一种非参数统计方法,用于比较两组相关或独立样本的中位数。它常用于不符合正态分布假设的数据。根据样本的类型,Wilcoxon 检验主要有两种形式:

  • Wilcoxon 符号秩检验(Wilcoxon Signed-Rank Test)

    • 适用于配对样本或相关样本的情况。

    • 例如,比较同一组样本在不同时间点的测量值。

    • 该检验通过计算每个样本差值的秩,求出这些差值的符号秩和,从而判断中位数的差异。

  • Wilcoxon 秩和检验(Wilcoxon Rank-Sum Test)

    • 适用于独立样本的情况。

    • 例如,比较两个不同组之间的测量值。

    • 该检验将所有样本的值排序,然后计算两个组的秩和,并通过秩和的差异来判断组间中位数是否存在显著性差异。

  • 使用情景:

  • 当数据不满足正态分布假设,且样本量较小或者标度数据。

  • 比较两组之间的中位数差异。

在处理二分类问题时,Wilcoxon 检验特别适合于小样本或者非正态分布的场景。

代码
wilcox.test(pred ~ real, data = data.frame(pred = prediction$prob[,1],real = prediction$truth))

    Wilcoxon rank sum test with continuity correction

data:  pred by real
W = 26261, p-value < 2.2e-16
alternative hypothesis: true location shift is not equal to 0
回到顶部