易懂:逻辑回归

介绍

  • 首先要了解线性回归(你一定要看)线性回归与岭回归
  • 逻辑回归(分类算法):以线性回归的式子作为公式基础,接受特征值并输入后,通过sigmoid函数可将目标值值转化为0~1之间的某一个值,即为逻辑回归的公式。所以你可以理解逻辑回归公式为:ho(x) = sigmoid(f(x)),(f(x) = w’x 是线性回归公式),通俗来说:逻辑回归比线性回归多了一个sigmoid函数。
  • sigmoid函数介绍
    • 公式
      sigmoid公式函数
    • 公式介绍:g(z)为sigmoid函数,ho(x)为逻辑回归公式,e为常量2.71,z为线性回归的结果。
    • sigmoid函数图像:z是自变量,g(z)是因变量。
      sigmoid函数
  • 逻辑回归应用场景:广告点击率,是否为垃圾邮件,是否患病,金融诈骗,虚假账号,(只能解决二分类问题,亦是解决二分类问题的利器)。
  • 逻辑回归特点
    1、通过公式计算,能够得出样本对应目标值的概率值
    2、逻辑回归仍然会有过拟合问题;也有自己的权重值;也有自己的损失函数(ps:虽说与线性回归原理相同,但是由于是分类问题,损失函数不一样,所以其损失函数只能通过梯度下降求解)。
    3、逻辑回归预测的概率为样本中占少数的类别的概率,此时此类别为正例。
  • 损失函数(误差大小):对数似然损失函数介绍
    • 公式1
      对数似然损失函数
    • 公式1参数解释:ho(x)(逻辑回归公式的预测结果(此时假设ho(x)代表了属于1类的概率))为自变量,cost为因变量(损失值)。
    • if y=1(目标值为1类)的函数图像
    • if y=1(目标值为1类)的总结:样本的目标值属于1类的概率越大,ho(x)越大,cost损失值越小,样本的目标值越接近1类。
      对数似然损失函数图像
    • if y=0(目标值为0类)的函数图像
    • if y=0(目标值为0类)的总结:样本的目标值属于1类的概率越大,ho(x)越大,cost损失值越大,样本的目标值越接近1类(换言之:样本的目标值数以0类的概率越大,属于1类的概率越小,ho(x)越小,cost损失值越小,样本的目标值越接近0类)。
      对数似然损失函数
    • 公式1 的总结
      1、对于逻辑回归公式而言,只会判断一个类别,即:“是1类为1类,非1类即0类”
      2、损失值越小,越接近目标值。
      3、公式1是公式2的铺垫,因为公式2求的是总损失值最小情况。
    • 公式2(完整的损失函数)
      在这里插入图片描述
    • 公式介绍:cost值越小,那么预测的类别的精准度就越高。
    • 公式2参数解释(假设ho(x)为预测为1类的概率):ho(x):为预测为1类的概率,yi:为样本的目标值,此计算的过程为:通过求出最小的cost,而确定每个训练样本的ho(x)的概率。
    • 公式2理解:其实就是将每个样本的损失值相加起来,求出最终的损失值,当cost的结果最小的时候,代表精度最高。
      • 问题1:为什么cost最小的时候,精度越高?
      • 回答1:因为“对数似然损失函数”公式的特性(类似于求信息熵的过程),所以可以参考信息熵(仅参考)理解:信息熵越小说明数据越稳定,逻辑回归的损失函数其实类似信息熵的计算,所以数值越小,代表精度越高。
      • 问题2:如何通过确定每个训练样本的ho(x)的概率(确定训练样本的概率的过程其实是确定每个特征值的最优权重的过程(因为逻辑回归公式依赖于线性回归公式和sigmoid函数)),而求出最小的最小的损失值cost?
      • 回答2:通过梯度下降,不断的尝试每个样本的权重,然后转换为ho(x)的概率,进而不断的计算出最小的cost ,当cost最小的时候,样本权重即被计算出来。
      • 进而引出了逻辑回归预测目标值的原理:当通过损失函数得知每个特征的权重时,通过线性回归公式,配合sigmoid函数,可计算出每个样本的概率,然后就可将测试集样本的预测转换为二分类问题,指定一个阈值(一般为0.5),那样本的概率与阈值对比,大于这个阈值为一类,小于这个阈值为另一类。

python实现逻辑回归的Api介绍:

  • API: from sklearn.linear_model import LogisticRegression
  • 重要参数介绍penalty:正则化方案(l2或者l1正则化); C:正则化力度。
  • 特点:可解决过拟合问题。

案例

  • 需求:良恶性肿瘤检测。
  • 数据集预测案例数据集
  • 数据描述
    1、699条样本,共11列数据,第一列用于检索的id,后9列分别是与肿瘤
    相关的医学特征,最后一列表示肿瘤类型的数值。
    2、包含16个缺失值,用”?”标出。
    3、目标值:(2为良性,4为恶性)
    4、良性和恶性的数据分布为:良性:458(65.5%);恶性:241(34.5%),根据逻辑回归算法的第三个特点,得出:此案例,逻辑回归预测的样本概率为是恶性的概率,即恶性为正例。
  • 案例流程
    1、获取数据
    2、缺失值 ,标准化处理…
    3、估计器估计流程
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
# Author  : rusi_

import os
import numpy as np
import pandas as pd

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report


def log_cancer():
    """
    逻辑回归预测良性恶性案例(特征为细胞的属性)
    :return:None
    """
    # structure columns
    columns = ['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(
        "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",
        names=columns
    )
    # data processing
    data = data.replace(to_replace="?", value=np.nan)
    data = data.dropna()
    x_train, x_test, y_train, y_test = train_test_split(data[columns[1:-1]], data[columns[-1]], test_size=0.25)

    # Feature processing
    std = StandardScaler()
    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)

    # estimator
    lg = LogisticRegression(C=1.0)
    lg.fit(x_train, y_train)
    print(f"回归系数:{os.linesep}", lg.coef_)
    y_predict = lg.predict(x_test)
    print(f"准确率:{os.linesep}", lg.score(x_test, y_test))
    print(f"召回率:{os.linesep}", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"]))
    return None


if __name__ == '__main__':
    log_cancer()

补充

  • 没有阀值的概念,这是个错词,只有阈值
  • 写go写多了,顺手图像的单词写错了,不改了,正确的为:cost
  • 逻辑森林可以做多分类问题。但是没人会去那样干,因为相当于把一个三分类问题化为两个二分类问题,这样很无聊。
发布了55 篇原创文章 · 获赞 3 · 访问量 2715

猜你喜欢

转载自blog.csdn.net/rusi__/article/details/103979653