人工智能-机器学习笔记-002-分类评估方法(Confusion Matrix)

Confusion Matrix-混淆矩阵(分类评估方法)


T=True F=False P=Positive(正例:符合目标) N=Negative(反例)

目标:找女生

TP=20,选对的正例:选的50个人中,选对了20个女生

FP=30,选错的正例:选的50个人中,有30个不是女生

TN=50,选对的反例:总共一百个人,选了五十个女生,剩下五十个被分类为男生,且剩下的五十个都为男生

FN=0,选错的反例:总共一百个人,选了五十个女生,剩下五十个被分类为男生,且剩下的五十个都为男生,剩下的反例没有选错的

from sklearn.model_selection import cross_val_predict
y_train_pred = cross_val_predict(sgd_clf,X_train,y_train_5,cv=3)
#此处的predict为交叉验证的预测,如数据集设置为3折,拆分出的验证集为x1,x2.x3,代入学习器后,则cross_val_predict的值就为y1,y2,y3=f(x1),f(x2),f(x3)=>(合并)z
y_train_pred.shape
(60000,)
X_train.shape
(60000, 784)
from sklearn.metrics import confusion_matrix
confusion_matrix(y_train_5,y_train_pred)
array([[53272,  1307],
       [ 1077,  4344]], dtype=int64)

negative class [[ true negatives , false positives ],

positive class [ false negatives , true positives ]]

  • true negatives: 53,272个数据被正确的分为非5类别

  • false positives:1307张被错误的分为5类别

  • false negatives:1077张错误的分为非5类别

  • true positives: 4344张被正确的分为5类别

一个完美的分类器应该只有true positivestrue negatives, 即主对角线元素不为0,其余元素为0

Precision and Recall
p r e c i s i o n = T P T P + F P precision = \frac {TP} {TP + FP} precision=TP+FPTP

r e c a l l = T P T P + F N recall = \frac {TP} {TP + FN} recall=TP+FNTP

精确率(Precision)与召回率(Recall):
精确率:你认为对的里面真正是对的概率
召回率:本来就是对的,你找对的概率

#---通过sklearn的函数直接计算精确率和召回率

from sklearn.metrics import precision_score,recall_score
precision_score(y_train_5,y_train_pred)
0.7687135020350381
recall_score(y_train_5,y_train_pred)
0.801328168234643

PrecisionRecall结合到一个称为F1 score 的指标,调和平均值给予低值更多权重。 因此,如果召回和精确度都很高,分类器将获得高F 1分数。

—F1-score

F1-score(F1得分)是一个用于衡量二分类模型性能的指标,它综合考虑了精确度(Precision)和召回率(Recall)。F1-score是这两者的调和平均数。

F1-score的取值范围在0到1之间,值越接近1表示模型性能越好。

F 1 = 2 1 precision + 1 recall = 2 × precision × recall precision + recall = TP TP + FN + FP 2 F_1 = \frac{2}{\frac{1}{\text{precision}} + \frac{1}{\text{recall}}} = 2 \times \frac{\text{precision} \times \text{recall}}{\text{precision} + \text{recall}} = \frac{\text{TP}}{\text{TP} + \frac{\text{FN} + \text{FP}}{2}} F1=precision1+recall12=2×precision+recallprecision×recall=TP+2FN+FPTP

from sklearn.metrics import f1_score
f1_score(y_train_5,y_train_pred)
0.7846820809248555

decision_function 是机器学习中多种分类模型中的一个方法,特别是在基于线性模型的分类器中非常常见,如支持向量机(SVM)、逻辑回归以及一些集成方法。

decision_function 是什么?

  1. 定义:分类器的 decision_function 方法返回一个分数,这个分数反映了模型对每个样本属于某个类别的信心程度。
  2. 作用:在二分类问题中,decision_function 通常返回一个实数,该数值表示样本属于正类的证据强度。对于多类分类问题,它可能返回每个类别相应的分数。这个分数可以用来做进一步的阈值处理或概率估计。
  3. 与预测概率的关系:在一些模型中,比如逻辑回归,decision_function 的输出可以转换为属于某个类别的概率。在支持向量机中,这个函数的输出更多地被用于判断样本位于决策边界的哪一侧,以及它们与决策边界的距离。
  4. 应用decision_function 的输出可以用来调整分类阈值,以此改变分类器的性能,例如,提高召回率或精确率。这在处理不平衡数据集或具有特定业务需求的情况下特别有用。

decision_function实际上就是在训练完成后不通过predict函数(计算为固定值)进行正确率的直接计算,而是直接通过decision_function函数将x放入学习器,得出x所得分数,然后可以自身设定阈值,根据实际应用场景选择偏向于召回率或精确率

阈值对结果的影响

y_scores = sgd_clf.decision_function([X[35000]])
y_scores
array([43349.73739616])
t = 50000
y_pred = (y_scores > t)
y_pred
array([False])

Scikit-Learn不允许直接设置阈值,但它可以得到决策分数,调用其decision_function()方法,而不是调用分类器的predict()方法,该方法返回每个实例的分数,然后使用想要的阈值根据这些分数进行预测:

y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3,
                             method="decision_function")
y_scores[:10]
array([ -434076.49813641, -1825667.15281624,  -767086.76186905,
        -482514.55006702,  -466416.8082872 ,  -311904.74603814,
        -582112.5580173 ,  -180811.15850786,  -442648.13282116,
         -87710.09830358])
from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)
'''
precision_recall_curve 主要接收两个输入参数:
真实标签(y_true):
这是一个一维数组或类似数组的结构,包含了测试集中每个样本的真实标签。
在二分类问题中,标签通常是二进制的,即 0 和 1,其中 1 表示正类,0 表示负类。

概率估计或分数(probas_pred):
这同样是一个一维数组,包含了模型为测试集中每个样本预测的正类的概率估计或通过 decision_function 方法得到的分数。
对于概率估计,这通常是模型预测样本为正类的概率。对于使用 decision_function 的模型,这是一个分数,分数越高表示模型越倾向于将样本分类为正类。

输出参数
precision_recall_curve 返回三个数组:
精确率(Precision):
精确率是一个一维数组,表示在不同阈值下的精确率。
精确率是指在模型预测为正类的样本中,实际为正类的比例。
召回率(Recall):
召回率也是一个一维数组,表示在不同阈值下的召回率。
召回率是指在所有实际为正类的样本中,模型正确预测为正类的比例。
阈值(Thresholds):
这是一个一维数组,包含了用于计算上述精确率和召回率的决策阈值。
注意,返回的阈值数组的长度通常比精确率和召回率数组的长度少1,因为最高的阈值被用来确保能达到召回率为1。

'''
y_train_5.shape
(60000,)#总样本数量	
thresholds.shape#thresholds存储了当前样本所有的阈值(y_score的值域)
(59698,) #共五万多个不同的分数,无重复值		
precisions[:10]
array([0.09080706, 0.09079183, 0.09079335, 0.09079487, 0.09079639,
       0.09079792, 0.09079944, 0.09080096, 0.09080248, 0.090804  ])
precisions.shape
(59699,)#阈值数组的长度通常比精确率(Precision)和召回率(Recall)数组的长度少 1。这是因为阈值数组中的最后一个阈值是一个特殊值,被添加以确保召回率为 1。
recalls.shape
(59699,)
def plot_precision_recall_vs_threshold(precisions,recalls,thresholds):
    plt.plot(thresholds,
             precisions[:-1],
            "b--",
            label="Precision")
    
    plt.plot(thresholds,
             recalls[:-1],
            "g-",
            label="Recall")
    plt.xlabel("Threshold",fontsize=16)
    plt.legend(loc="upper left",fontsize=16)
    plt.ylim([0,1])
    
plt.figure(figsize=(8, 4))
plot_precision_recall_vs_threshold(precisions,recalls,thresholds)#显示出阈值变化对precision和recall的影响程序
plt.xlim([-700000, 700000])
plt.show()

在这里插入图片描述

def plot_precision_vs_recall(precisions, recalls):
    plt.plot(recalls, 
             precisions, 
             "b-", 
             linewidth=2)
    
    plt.xlabel("Recall", fontsize=16)
    plt.ylabel("Precision", fontsize=16)
    plt.axis([0, 1, 0, 1])

plt.figure(figsize=(8, 6))
plot_precision_vs_recall(precisions, recalls)#recall和predict的相关联图
plt.show()

ROC curves

receiver operating characteristic (ROC) 曲线是二元分类中的常用评估方法

  • 它与精确度/召回曲线非常相似,但ROC曲线不是绘制精确度与召回率,而是绘制true positive rate(TPR)false positive rate(FPR)

  • 要绘制ROC曲线,首先需要使用roc_curve()函数计算各种阈值的TPR和FPR

TPR = TP / (TP + FN) (Recall)

FPR = FP / (FP + TN)

from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)
def plot_roc_curve(fpr, tpr, label=None):
    plt.plot(fpr, tpr, linewidth=2, label=label)
    plt.plot([0, 1], [0, 1], 'k--')
    plt.axis([0, 1, 0, 1])
    plt.xlabel('False Positive Rate', fontsize=16)
    plt.ylabel('True Positive Rate', fontsize=16)

plt.figure(figsize=(8, 6))
plot_roc_curve(fpr, tpr)
plt.show()

虚线表示纯随机分类器的ROC曲线; 一个好的分类器尽可能远离该线(朝左上角),朝右下角也可以,模型预测的结果取反即可,曲线越偏离中线模型性能越好。

比较分类器的一种方法是测量曲线下面积(AUC)。完美分类器的ROC AUC等于1(即FPR=0时,TPR=1),而纯随机分类器的ROC AUC等于0.5(实际上只命中了一半,不如瞎猜)。 Scikit-Learn提供了计算ROC AUC的函数:

from sklearn.metrics import roc_auc_score

roc_auc_score(y_train_5, y_scores)
0.9624496555967156 #趋向于1,模型还不错
  • 26
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值