zoukankan      html  css  js  c++  java
  • 分类算法-逻辑回归与二分类

    逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归,但是它与回归之间有一定的联系。由于算法的简单和高效,在实际中应用非常广泛。

    逻辑回归的应用场景

    • 广告点击率
    • 是否为垃圾邮件
    • 是否患病
    • 金融诈骗
    • 虚假账号

    看到上面的例子,我们可以发现其中的特点,那就是都属于两个类别之间的判断。逻辑回归就是解决二分类问题的利器

    逻辑回归的原理

    输入

     逻辑回归的输入就是一个线性回归的结果。

    激活函数

    • sigmoid函数

    • 分析
      • 回归的结果输入到sigmoid函数当中
      • 输出结果:[0, 1]区间中的一个概率值,默认为0.5为阈值

    逻辑回归最终的分类是通过属于某个类别的概率值来判断是否属于某个类别,并且这个类别默认标记为1(正例),另外的一个类别会标记为0(反例)。(方便损失计算)

    输出结果解释(重要):假设有两个类别A,B,并且假设我们的概率值为属于A(1)这个类别的概率值。现在有一个样本的输入到逻辑回归输出结果0.6,那么这个概率值超过0.5,意味着我们训练或者预测的结果就是A(1)类别。那么反之,如果得出结果为0.3那么,训练或者预测结果就为B(0)类别。

    所以接下来我们回忆之前的线性回归预测结果我们用均方误差衡量,那如果对于逻辑回归,我们预测的结果不对该怎么去衡量这个损失呢?我们来看这样一张图

     

     那么如何去衡量逻辑回归的预测结果与真实结果的差异呢?

    损失以及优化

    损失

    逻辑回归的损失,称之为对数似然损失,公式如下:

    • 分开类别:

    怎么理解单个的式子呢?这个要根据log的函数图像来理解

     

    • 综合完整损失函数

    看到这个式子,其实跟我们讲的信息熵类似。

    接下来我们呢就带入上面那个例子来计算一遍,就能理解意义了。

     我们已经知道,log(P), P值越大,结果越小,所以我们可以对着这个损失的式子去分析

    优化

    同样使用梯度下降优化算法,去减少损失函数的值。这样去更新逻辑回归前面对应算法的权重参数,提升原本属于1类别的概率,降低原本是0类别的概率。

    逻辑回归API

    sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)

    • solver:优化求解方式(默认开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数)
      • sag:根据数据集自动选择,随机平均梯度下降
    • penalty:正则化的种类
    • C:正则化力度

    默认将类别数量少的当做正例

    LogisticRegression方法相当于 SGDClassifier(loss="log", penalty=" "),SGDClassifier实现了一个普通的随机梯度下降学习,也支持平均随机梯度下降法(ASGD),可以通过设置average=True。而使用LogisticRegression(实现了SAG)

    案例:癌症分类预测-良/恶性乳腺癌肿瘤预测

    • 数据介绍

     原始数据的下载地址:https://archive.ics.uci.edu/ml/machine-learning-databases/

    数据描述

    (1)699条样本,共11列数据,第一列用语检索的id,后9列分别是与肿瘤

    相关的医学特征,最后一列表示肿瘤类型的数值。

    (2)包含16个缺失值,用”?”标出。

    分析

    • 缺失值处理
    • 标准化处理
    • 逻辑回归预测

    代码

    import pandas as pd
    import numpy as np
    # 1、读取数据
    path = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
    column_name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
                       'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
                       'Normal Nucleoli', 'Mitoses', 'Class']
    
    data = pd.read_csv(path, names=column_name)
    data.head()

    # 2、缺失值处理
    # 1)替换-》np.nan
    data = data.replace(to_replace="?", value=np.nan)
    # 2)删除缺失样本
    data.dropna(inplace=True)
    data.isnull().any() # 不存在缺失值

    # 3、划分数据集
    from sklearn.model_selection import train_test_split
    data.head()

    # 筛选特征值和目标值
    x = data.iloc[:, 1:-1]
    y = data["Class"]
    x.head()

    y.head()

    x_train, x_test, y_train, y_test = train_test_split(x, y)
    x_train.head()

    # 4、标准化
    from sklearn.preprocessing import StandardScaler
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    x_train

    from sklearn.linear_model import LogisticRegression
    # 5、预估器流程
    estimator = LogisticRegression()
    estimator.fit(x_train, y_train)
    # 逻辑回归的模型参数:回归系数和偏置
    estimator.coef_

    estimator.intercept_

    # 6、模型评估
    # 方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:
    ", y_predict)
    print("直接比对真实值和预测值:
    ", y_test == y_predict)
    
    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:
    ", score)

    结果:

    y_predict:
     [2 2 2 2 4 4 2 2 2 2 4 4 2 4 2 2 4 2 4 4 2 2 4 4 2 4 2 2 4 2 2 2 2 4 2 4 4
     4 2 2 4 2 4 4 2 2 2 4 4 2 2 2 2 2 2 4 4 2 2 2 4 4 4 2 4 2 4 2 2 2 2 2 4 2
     4 4 2 2 4 2 2 2 2 2 2 4 4 4 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 2 2 2 2 2 2 4 2
     2 4 4 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2 2 2 4 2 4 4 2 4 2 2 4 4 4 4
     2 4 2 2 4 4 2 2 2 4 2 2 2 4 4 2 2 2 2 2 2 4 2]
    直接比对真实值和预测值:
     432     True
    256     True
    203     True
    281     True
    588     True
    590     True
    66      True
    473     True
    637     True
    537     True
    103     True
    334     True
    8       True
    44      True
    141     True
    90      True
    329     True
    454     True
    440     True
    200     True
    665     True
    495     True
    279     True
    272     True
    43     False
    282     True
    22      True
    548     True
    330     True
    654     True
           ...  
    340     True
    470     True
    343     True
    253     True
    264     True
    262     True
    132     True
    51     False
    42      True
    250     True
    651     True
    232    False
    581     True
    94      True
    385     True
    566     True
    386     True
    234     True
    189     True
    556     True
    605     True
    112     True
    529     True
    345     True
    410     True
    327     True
    480     True
    350     True
    381     True
    545     True
    Name: Class, Length: 171, dtype: bool
    准确率为:
     0.9649122807017544

    分类的评估方法

    精确率与召回率

    混淆矩阵

    在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)

    精确率(Precision)与召回率(Recall)

    • 精确率:预测结果为正例样本中真实为正例的比例(了解)
    • 召回率:真实为正例的样本中预测结果为正例的比例(查的全,对正样本的区分能力)

    那么怎么更好理解这个两个概念

     

     还有其他的评估标准,F1-score,反映了模型的稳健型

    分类评估报告API

    • sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
      • y_true:真实目标值
      • y_pred:估计器预测目标值
      • labels:指定类别对应的数字
      • target_names:目标类别名称
      • return:每个类别精确率与召回率
    # 查看精确率、召回率、F1-score
    from sklearn.metrics import classification_report
    report = classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"])
    print(report)

    假设这样一个情况,如果99个样本癌症,1个样本非癌症,不管怎样我全都预测正例(默认癌症为正例),准确率就为99%但是这样效果并不好,这就是样本不均衡下的评估问题

    问题:如何衡量样本不均衡下的评估?

    ROC曲线与AUC指标

    知道TPR与FPR

    • TPR = TP / (TP + FN)
      • 所有真实类别为1的样本中,预测类别为1的比例
    • FPR = FP / (FP + FN)
      • 所有真实类别为0的样本中,预测类别为1的比例

    ROC曲线

    • ROC曲线的横轴就是FPRate,纵轴就是TPRate,当二者相等时,表示的意义则是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的,此时AUC为0.5

    AUC指标

    • AUC的概率意义是随机取一对正负样本,正样本得分大于负样本的概率
    • AUC的最小值为0.5,最大值为1,取值越高越好
    • AUC=1,完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
    • 0.5<AUC<1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。

    最终AUC的范围在[0.5, 1]之间,并且越接近1越好

    AUC计算API

    from sklearn.metrics import roc_auc_score

    • sklearn.metrics.roc_auc_score(y_true, y_score)
      • 计算ROC曲线面积,即AUC值
      • y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
      • y_score:每个样本预测的概率值
    y_test.head()

    # y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
    # 将y_test 转换成 0 1
    y_true = np.where(y_test > 3, 1, 0)
    y_true

    from sklearn.metrics import roc_auc_score
    roc_auc_score(y_true, y_predict)

  • 相关阅读:
    JDK 14的新特性:更加好用的NullPointerExceptions
    技术回顾系列:最新最热门的技术大事-第一周
    JDK 14的新特性:instanceof模式匹配
    JDK 15 JAVA 15的新特性展望
    怎么break java8 stream的foreach
    java 8 stream中的Spliterator简介
    怎么在java中创建一个自定义的collector
    java 8 stream reduce详解和误区
    java stream中Collectors的用法
    java关于throw Exception的一个小秘密
  • 原文地址:https://www.cnblogs.com/a155-/p/14412975.html
Copyright © 2011-2022 走看看