逻辑回归(混淆矩阵与评估指标)

877 阅读7分钟

跟我一起机器学习系列文章将首发于公众号:月来客栈,欢迎文末扫码关注!

1 多变量逻辑回归

上一篇文章中笔者对于什么是逻辑回归,以及它能用来干什么做了一个详细的介绍;同时,对于如何通过开源库进行建模训练并预测也给出了详细的示例,并对训练得到的决策边界进行了可视化。因此,本篇文章将主要围绕多变量逻辑回归,多分类问题和分类评价指标这三个方面进行介绍。

所为多变量逻辑回归其实就是一个样本点有多个特征属性(feature),然后通过建立一个多变量的逻辑回归模型来完成分类任务。实质上在实际情况中,几乎没有一个模型是单变量的,即每个样本点都有多个特征。由于这是刚入门学习的第二个机器学习算法,所有在这里再单独做出一个小节来对多变量进行说明。因此在后续的算法介绍中,将不再单独提及“多变量模型”这一叫法,所有模型的输入都是一个向量(vector)。

\hat{y}=h(x)=g(w_1x_1+w_2x_2+\cdots+w_nx_n+b)\tag{1}

如公式(1) 所示便为一个多变量逻辑回归模型的假设函数(hypothesis),其后续的所有步骤(求解、预测等)并没有任何变化与不同,仅仅只是多了些特征属性。

2 分类评价指标

如同回归模型一样,对于分类模型来讲我们同样会通过一些评价指标来衡量模型的优与劣。在分类任务中,常见的评价指标(Metric)有:准确率(Accuracy)、精确率(Precision)、召回率(Recall)与F值(F-score),其中应用最为广泛的就是准确率,接着是召回率。为了能够清楚的介绍这四种指标,我们以一个猫狗图片识别的任务场景为例:现在假设有一个猫狗图片分类器对100张图片进行分类,分类结果显示有38张图片是猫,62张图片是狗,经与真实标签对比后发现,38张猫的图片中有20张是分类正确的,62张狗的图片中有57张是分类正确的。

根据这一情景,我们便能得到一张如下的表格,称为混淆矩阵(confusion matrix):

如何来读这个矩阵呢?以“分类结果显示有38张图片是猫”为例:纵向看为预测的结果,其中预测为猫的数量为20+18=38;横线为真实标签结果,其中真实猫的数量为20+5=25。同时,各个数值的具体含义为:

  • True Positive(TP):表示将正样本预测为正样本,即预测正确;
  • False Positive(FP):表示将负样本预测为正样本,即预测错误;
  • False Negative(FN):表示将负样本预测为正样本,即预测错误;
  • True Negative(TN):表示将负样本预测为负样本,即预测正确;

2.1 指标定义

\begin{aligned}
Accurcay&=\frac{TP+TN}{TP+FP+FN+TN}\\[2ex]
Precision&=\frac{TP}{TP+FP}\\[2ex]
Recall&=\frac{TP}{TP+FN}\\[2ex]
F-score&=(1+\beta^2)\frac{Precision\cdot Recall}{\beta^2\cdot Precision+Recall}
\end{aligned}\tag{2}

注:当F-score\beta=1时称为F_1值,同时F_1也是用得最多的F_{score}值。

可以看出准确率是最容易理解,即所有预测对的数量,除以总的数量。同时可以看到,精确率计算的是预测对的正样本在整个预测为正样本中的比重,而召回率计算的是预测对的正样本在整个真实正样本中的比重。因此一般来说,召回率越高也就意味着这个模型寻找正样本的能力越强(例如在判断是否为癌细胞的时候,寻找正样本癌细胞的能力就十分重要),而F_{score}则是精确率与召回率的调和平均。但值得注意的是,通常在实际任务中,大多数并不明确哪一类别是正样本,哪一类类别又是负样本,所以每个类别都可以计算其各项指标(但是准确率只有一个):

准确率:

Accuracy = \frac{20+57}{20+18+5+57}=0.77

对于猫来说:

\begin{aligned}Precision&=\frac{20}{20+18}=0.53\\[1ex]Recall &= \frac{20}{20+5}=0.8\\[1ex]F_1&=\frac{2\times 0.53\times 0.8}{0.53+0.8}=0.63\end{aligned}

对于狗来说:

\begin{aligned}Precision&=\frac{57}{57+5}=0.92\\[1ex]Recall &= \frac{57}{57+18}=0.76\\[1ex]F_1&=\frac{2\times 0.92\times 0.76}{0.92+0.76}=0.83\end{aligned}

2.2 示例

  • 载入数据集

    def load_data():
        data = load_breast_cancer()
        x = data.data# (569,30)
        y = data.target
        label_names = list(data.target_names)
        return x, y, label_names
    

    这个数据集为癌细胞的二分类识别,包含良性与恶性两种分类结果。同时,对于每个样本来说都有20个特征维度。

  • 评估分类结果

    def train(x, y, label_names):
        model = LogisticRegression()
        model.fit(x, y)
        accuracy = model.score(x, y)
        y_pre = model.predict(x)
        print("Accuracy: ", accuracy)
        print(classification_report(y, y_pre, target_names=label_names))
    if __name__ == '__main__':
        x, y, label_names = load_data()
        train(x, y, label_names)
    
    #输出结果
    Accuracy:  0.9472759226713533
             precision recall f1-score support
    malignant    0.95   0.91   0.93     212
    benign       0.95   0.97   0.96     357
    

    从模型的的输出结果可以看出,模型的准确率为 94.7\% ,同时其恶性细胞识别的召回率为91\%,良性细胞识别的召回率为97\%等等。

到这里就介绍完了分类模型中常用的四种分类评价指标,并且这四种指标基本可以覆盖分类场景中90\%以上评估。但现在留一个问题给大家:**为什么有了准确率后还会出现其它三个指标?**由于文章篇幅有限,这个问题等后面专门写一篇文章进行介绍,读者可以先进行思考。

3 多分类

在此之前对于逻辑回归的介绍都仅仅局限在二分类任务中(binary classification)中,但是在实际任务中,更多则是多分类的任务场景,也就是说最终的分类结果中类别数会大于二。对于这样的问题该如何解决呢?

3.1 One-vs-all

One-vs-all也称为One-vs-rest,两者的缩写分别为'ova'与'ovr'。其核心思想都是每次将其中一个类和剩余其他的类看作是一个二分类任务进行训练,最后在预测过程中选择输出概率值最大那个类标作为该样本点所属的类别。

如上图所示为一个三分类的数据集,one-vs-all的分类思想如下图所示:

以从左往右的划分方式划分数据集,然后分别训练三个二分类的逻辑回归模型h_0(x),h_1(x),h_2(x),分别表示样本x属于第0,1,2三个类别的概率,在预测的时候只要选择概率最大时所对应的类别即可。

3.2 示例

def load_data():
    data = load_iris()
    x, y = data.data, data.target
    return x, y

def train(x, y):
    model = LogisticRegression(multi_class='ovr')
    model.fit(x,y)
    print("Accuracy: ", model.score(x, y))
#结果:
Accuracy:  0.95

其实从这个示例中也看不出来什么和上面的一样,由于都是框架封装好的,所以具体的细节自然是看不到的。等下一篇文章我们再来自己手动实现多分类的实例。当然,多分类方法也不止这一种,比如还有softmax多分类方法、神经网络等,这些都会在后面陆续进行介绍。

4 总结

在本篇文章中,笔者首先介绍了什么是多变量逻辑回归,同时还提到对于“多变量”这个说法在以后均不会刻意提及,因为几乎不存在一个只包含一个变量的任务场景。其次,笔者还对分类场景中常见的4种评价指标进行了介绍,演示了如何通过sklearn来实现相应的结果计算,并留了一个问题让读者思考。最后,笔者还通过以图示的方式介绍了逻辑回归如何来处理多分类问题。本次内容就到此结束,感谢阅读!

若有任何疑问,请发邮件至moon-hotel@hotmail.com并附上文章链接,青山不改,绿水长流,月来客栈见!

引用

  • 示例代码:关注公众号回复“示例代码”即可直接获取!