【机器学习】(二十三)评估指标:Dummy分类器;混淆矩阵;AUC指标

二分类指标

正类:要寻找的类,标记为True。与之相对的称为反类,标记为False。

错误类型:假正例/第一类错误(FP),假反例/第二类错误(FN)。
正确类型:真正例(TP),真反例(TN)

不平衡数据集:一个类别比另一个类别出现次数多很多

Dummy分类器

基于digit数据集构建不平衡数据集

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.dummy import DummyClassifier
import numpy as np
from sklearn.linear_model import LogisticRegression

digits = load_digits()
y = digits.target == 9 # 数字9作为正类

# 创建一个9:1的不平衡数据集
x_train, x_test, y_train, y_test = train_test_split(digits.data, y, random_state=0)

# 虚拟分类器:预测多数类(非9)
dummy_majority = DummyClassifier(strategy='most_frequent').fit(x_train, y_train)
pred_most_frequent = dummy_majority.predict(x_test)
print(np.unique(pred_most_frequent)) # 预测类别:[False]
print(dummy_majority.score(x_test, y_test)) # 模型精度:0.8955555555555555

# 虚拟分类器:随机预测
dummy = DummyClassifier().fit(x_train, y_train)
pred_dummy = dummy.predict(x_test)
print(dummy.score(x_test, y_test)) # 0.8355555555555556

# 真实分类器:随机预测
logreg = LogisticRegression(C=0.1).fit(x_train, y_train)
pred_logreg = logreg.predict(x_test)
print(logreg.score(x_test, y_test)) # 0.9844444444444445

DummyClassfier是一种使用简单规则进行预测的分类器。通常该分类器作为一个简单的基线与其他(真实)分类器进行比较。most_frequent: 预测值是出现频率最高的类别。stratified : 根据训练集中的频率分布给出随机预测。uniform: 使用等可能概率给出随机预测。constant: 根据用户的要求, 给出常数预测。

产生随机输出的虚拟分类器是所有分类器中最差的(精度最低),但也超过了百分之80。同时很难判断哪些结果是真正有帮助的(真正例)。

dummy.DummyClassifier()

混淆矩阵:精度、准确率、召回率、f-分数

from sklearn.metrics import confusion_matrix
from sklearn.metrics import f1_score

confusion = confusion_matrix(y_test, pred_logreg)
print(confusion)
print(f1_score(y_test, pred_logreg)) # 0.9213483146067415

sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None,sample_weight=None):检查预测结果。输出一个数组,每个元素给出属于该对应类别的样本数。横轴预测分类(0->n),纵轴真实分类,对角线上元素对应于正确的分类。
y_true: 是样本真实分类结果,y_pred: 是样本预测分类结果,labels:是所给出的类别,通过这个可对类别进行选择 ,sample_weight : 样本权重。
对于二分类,输出2*2数组,依次代表TN、FP、FN、TP。

混淆矩阵及confusion_matrix函数的使用

分类报告

精度:预测正确的数量除以所有样本的数量。
准确率/阳性预测值(PPV):真正例的数量除以被预测为正例的样本数量。
召回率/灵敏度/命中率/真正例率(TPR):真正例数量除以真实为正例的样本数量。
f-分数/f-度量:准确率与召回率的调和平均(2*乘积/和)

分类报告:
在这里插入图片描述
classification_report函数用于显示主要分类指标的文本报告。classification_report(y_true, y_pred, target_names=target_names)
参数:y_true:1维数组,目标值。 y_pred:1维数组,或标签指示器数组/稀疏矩阵,分类器返回的估计值。 target_names:字符串列表,与标签匹配的可选显示名称。

机器学习classification_report()用法及micro avg、macro avg讲解
机器学习classification_report方法及precision精确率和recall召回率 说明

调节给定分类器的准确率和召回率:更改阈值

大多数分类器都提供decision_function或predict_proba方法评估预测的不确定度。
预测可以看作某个固定点作为方法输出的阈值。二分类问题中使用0作为决策函数的阈值(任意),0.5作为predict_proba的阈值(0-1)。
增大阈值意味着需要更加确信才能作出正类判断。
减小阈值召回率增大(更多点划分为类别1),准确率减小。

在svc模型上改变决策函数阈值:

from mglearn.datasets import make_blobs
from sklearn.svm import SVC

# 设置数据集:400个反类,50个正类
x, y = make_blobs(n_samples=(400,50), centers=2, cluster_std=[7.0, 2], random_state=22)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0)
svc = SVC(gamma=.5).fit(x_train, y_train)
print(classification_report(y_test, svc.predict(x_test)))

# 期望更多类别划分为1,需要减小阈值
y_pred_lower_threshold = svc.decision_function(x_test)>-.8
print(classification_report(y_test, y_pred_lower_threshold))

在这里插入图片描述
宏(macro)平均:计算为加权的按类别f-分数。对所有类别给出相同的权重。
加权(weighted)平均:以每个类别的支持作为权重来计算按类别f-分数的平均值。
微(micro)平均:计算所有类别中的假正例、假反例和真正例总树,利用这些计数计算准确率、召回率和f-分数。

在测试集上设置决策函数可能会导致过于乐观的结果,可以使用验证集或者交叉验证来代替。

准确率-召回率曲线:平均准确率

根据商业目标,找到合适的阈值,例如希望召回率能达到90%。
对分类器的设置要求通常被称为设置工作点

SVC模型中的准确率-召回率曲线:

from sklearn.metrics import precision_recall_curve
import numpy as np
import matplotlib.pyplot as plt

# 创建更多数据点来得到更加平滑的曲线
x, y = make_blobs(n_samples=(4000, 500), centers=2, cluster_std=[7.0, 2], random_state=22)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0)
svc = SVC(gamma=.05).fit(x_train, y_train)

precision, recall, thresholds = precision_recall_curve(y_test, svc.decision_function(x_test))

# 找到最接近0的阈值(默认阈值)
close_zero = np.argmin(np.abs(thresholds))
plt.plot(precision[close_zero], recall[close_zero], 'o', label='threshold zero')

plt.plot(precision, recall, label='precision recall curve')
plt.xlabel('precision')
plt.ylabel('recall')
plt.legend(loc='best')

precision_recall_curve函数:接收真实标签和预测的不确定度(decision_function(x_test)或者predict_proba(x_test)[:,1]即属于类别1的概率)。返回一个列表,包含按顺序排序的所有可能值,(准确率,召回率,对应的阈值)
在这里插入图片描述
曲线上的每一个点都对应decision_function的一个可能的阈值。曲线越靠近右上角,则分类器越好。

总结准确率-召回率曲线:计算该曲线下的积分或面积/平均准确率

from sklearn.metrics import average_precision_score
print(average_precision_score(y_test, svc.decision_function(x_test))) # 0.6663140319391998
受试者工作特征曲线(ROC曲线):AUC指标

ROC曲线:假正例率(FPR)-真正例率(TPR)
总结ROC曲线:即曲线下的面积(AUC)

AUC是一个比精度好的指标。可以被截石位评估正例样本的排名。它等价于,从正类样本中随机挑选一个点由分类器给出的分数,比从反类样本中随机挑选一个点分数更高的概率。
随机预测得到的AUC总是等于0.5,无论数据集中的类别多么不平衡。因此在不平衡数据集上评估模型时使用AUC。
AUC没有默认阈值,

SVM的ROC曲线

from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score

fpr, tpr, thresholds = roc_curve(y_test, svc.decision_function(x_test))

plt.plot(fpr, tpr, label='ROC Curve')
plt.xlabel('FPR')
plt.ylabel('TPR(RECALL)')

close_zero = np.argmin(np.abs(thresholds))
plt.plot(fpr[close_zero], tpr[close_zero], 'o', label='threshold zero')
plt.legend(loc=4)

print(roc_auc_score(y_test, svc.decision_function(x_test))) # 0.9162935036712654

在这里插入图片描述

多分类指标

和二分类指标一样,常用工具:精度、混淆矩阵、分类报告。

对于多分类的不平衡数据集,常用的指标是多版本的f-分数。
若对每个样本等同看待,使用微平均f-分数。f1_score(y_test,pred,average='micro')
若对每个类别等同看待,使用宏平均f-分数。f1_score(y_test,pred,average='macro')

回归指标

默认使用score方法给出的R^2。

在模型选择中使用评估指标

scoring参数用一个字符串指定选择所使用评估指标grid=GridSearchCV(SVC(), param_grid=param_grid,scoring='roc_auc')。同样适用于cross_val_score。

可选指标:在这里插入图片描述

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值