• 机器学习基础之《回归与聚类算法(4)—逻辑回归与二分类(分类算法)》


    一、什么是逻辑回归

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

    2、叫回归,但是它是一个分类算法

    二、逻辑回归的应用场景

    1、应用场景
    广告点击率:预测是否会被点击
    是否为垃圾邮件
    是否患病
    金融诈骗:是否为金融诈骗
    虚假账号:是否为虚假账号

    均为二元问题

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

    三、逻辑回归的原理

    1、逻辑回归的输入
    线性回归的输出,就是逻辑回归的输入

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

    2、怎么用输入来分类
    要进行下一步处理,带入到sigmoid函数当中,我们把它叫做激活函数

    3、sigmoid函数

    可以理解为,f(x)=1/(1+e^(-x)),1加上e的负x次方分之1

    sigmoid函数又称S型函数,它是一种非线性函数,可以将任意实数值映射到0-1之间的值,通常用于分类问题。它的表达式为:f(x)=1/(1+e^(-x)),其中e为自然对数的底数。它的输出值均位于0~1之间,当x趋向正无穷时,f(x)趋向1;当x趋向负无穷时,f(x)趋向0

    4、分析
    将线性回归的输出结果,代入到x的部分
    输出结果:[0, 1]区间中的一个概率值,默认为0.5为阈值
    逻辑回归最终的分类是通过属于某个类别的概率值来判断是否属于某个类别,并且这个类别默认标记为1(正例),另外的一个类别会标记为0(反例)。(方便损失计算)

    5、假设函数/线性模型
    1/(1 + e^(-(w1x1 + w2x2 + w3x3 + ... + wnxn +b)))
    如何得出权重和偏置,使得这个模型可以准确的进行分类预测呢?

    6、损失函数(真实值和预测值之间的差距)
    我们可以用求线性回归的模型参数的方法,来构建一个损失函数

    线性回归的损失函数:(y_predict - y_true)平方和/总数,它是一个值
    而逻辑回归的真实值和预测值,是否属于某个类别
    所以就不能用均方误差和最小二乘法来构建
    要使用对数似然损失

    7、优化损失(正规方程和梯度下降)
    用一种优化方法,将损失函数取得最小值,所对应的权重值就是我们求的模型参数

    四、对数似然损失

    1、公式
    逻辑回归的损失,称之为对数似然损失

    (1)它是一个分段函数
    (2)如果y=1,真实值是1,属于这个类别,损失就是 -log(y的预测值)
    (3)如果y=0,真实值是0,不属于这个类别,损失就是 -log(1-y的预测值)

    2、怎么理解单个的式子呢?这个要根据log的函数图像来理解
    当y=1时:(横坐标是y的预测值)

    前提真实值是1,如果预测值越接近于1,则损失越接近0。如果预测值越接近于0,则损失越大

    当y=0时:(横坐标是y的预测值)

    前提真实值是0,如果预测值越接近1,则损失越大

    3、综合完整损失函数

    损失函数:-(y真实*logy预测+(1-y真实)*log(1-y预测)),求和

    是线性回归的输出,经过sigmoid函数映射之后的一个概率值

    4、计算样例

    五、优化损失

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

    六、逻辑回归API

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

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

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

    1、数据集
    数据:
    https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data
    数据的描述:
    https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.names

    2、数据的描述

    1. # Attribute Domain
    2. -- -----------------------------------------
    3. 1. Sample code number id number
    4. 2. Clump Thickness 1 - 10
    5. 3. Uniformity of Cell Size 1 - 10
    6. 4. Uniformity of Cell Shape 1 - 10
    7. 5. Marginal Adhesion 1 - 10
    8. 6. Single Epithelial Cell Size 1 - 10
    9. 7. Bare Nuclei 1 - 10
    10. 8. Bland Chromatin 1 - 10
    11. 9. Normal Nucleoli 1 - 10
    12. 10. Mitoses 1 - 10
    13. 11. Class: (2 for benign, 4 for malignant)

    第一列:样本的编号
    第二到十列:特征
    第十一列:分类(2代表良性,4代表恶性)

    3、流程分析
    (1)获取数据
        读取的时候加上names
    (2)数据处理
        处理缺失值
    (3)数据集划分
    (4)特征工程
        无量纲化处理—标准化
    (5)逻辑回归预估器
    (6)模型评估

    4、代码

    1. import pandas as pd
    2. import numpy as np
    3. # 1、读取数据
    4. column_name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
    5. 'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
    6. 'Normal Nucleoli', 'Mitoses', 'Class']
    7. data = pd.read_csv("breast-cancer-wisconsin/breast-cancer-wisconsin.data", names=column_name)
    8. data
    9. # 2、缺失值处理
    10. # 1)?替换为np.nan
    11. data = data.replace(to_replace="?", value=np.nan)
    12. # 2)删除缺失样本
    13. data.dropna(inplace=True)
    14. data
    15. # 不存在缺失值
    16. data.isnull().any()
    17. # 3、划分数据集
    18. from sklearn.model_selection import train_test_split
    19. # 筛选特征值和目标值
    20. x = data.iloc[:, 1:-1] # 行都要,列从1到-1
    21. y = data["Class"]
    22. x.head()
    23. y.head()
    24. x_train, x_test, y_train, y_test = train_test_split(x, y)
    25. # 4、标准化
    26. from sklearn.preprocessing import StandardScaler
    27. transfer = StandardScaler()
    28. x_train = transfer.fit_transform(x_train)
    29. x_test = transfer.transform(x_test)
    30. x_train
    31. from sklearn.linear_model import LogisticRegression
    32. # 5、预估器流程
    33. estimator = LogisticRegression()
    34. estimator.fit(x_train, y_train)
    35. # 逻辑回归的模型参数:回归系数和偏置
    36. # 有几个特征,就有几个回归系数
    37. estimator.coef_
    38. estimator.intercept_
    39. # 6、模型评估
    40. # 方法1:直接比对真实值和预测值
    41. y_predict = estimator.predict(x_test)
    42. print("y_predict:\n", y_predict)
    43. print("直接比对真实值和预测值:\n", y_test == y_predict)
    44. # 方法2:计算准确率
    45. score = estimator.score(x_test, y_test)
    46. print("准确率为:\n", score)

    5、运行结果

  • 相关阅读:
    java分数线查询系统(0)计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    kubernetes的多租户管理实践
    JIT介绍
    单目标应用:基于成长优化算法(Growth Optimizer,GO)的微电网优化调度MATLAB
    【SQL】Mysql 时区设置解决--20230928
    废弃的kotlin-android-extensions,是时候接受ViewBinding了
    ATSS介绍
    Java之分支结构
    金融反欺诈常用特征处理方法
    Linux操作系统基础 – 正则表达式快速入门
  • 原文地址:https://blog.csdn.net/csj50/article/details/133904904