易懂:逻辑回归

介绍
  • 首先要了解线性回归(你一定要看)线性回归与岭回归
  • 逻辑回归(分类算法):以线性回归的式子作为公式基础,接受特征值并输入后,通过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、逻辑回归预测的概率为样本中占少数的类别的概率,此时此类别为正例。(这样是方便模型构建,如果预测为样本多数类别的概率,那么参与计算的数据就会更多)
  • 逻辑回归预测目标值的原理:通过线性回归公式,配合sigmoid函数,可计算出每个样本的概率,然后就可将测试集样本的预测转换为二分类问题,指定一个阈值(一般为0.5),那样本的概率与阈值对比,大于这个阈值为一类,小于这个阈值为另一类。
  • 损失函数(误差大小):对数似然损失函数介绍
    • 公式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的结果最小的时候,代表精度最高(具体要参考对数函数在a>1时的函数图像来理解)。
    • 损失函数求解:梯度下降:最通俗理解梯度下降
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
  • 逻辑森林可以做多分类问题。但是没人会去那样干,因为相当于把一个三分类问题化为两个二分类问题,这样很无聊。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值