• 2.5 logistic 回归初认识


    2.5 logistic 回归初认识

    一 、数据不均衡的处理方式(补充)

    在这里插入图片描述

    1. 欠采样:

    潜在的问题出现在可能会抛弃一部分数据,使得拟合效果不好,但是可以使得数据总体均衡

    2. 过采样:

    潜在的问题出现可能会复制部分数据进行填充,使得训练拟合的时候过度集中于被复制的数据的规律中。但也可以使得数据总体均衡

    3. 找业务部门填充真实数据
    4. 不去处理,直接训练模型,有时候的训练效果要好很多
    5. 算法处理:class_weights

    eg: 男生 * 权重2 = 女生 * 权重1
    回归类的模型指标:
    评估模型好坏,使用score, MSE, MAE 是对分类的评判
    回归类的模型评估指标:
    方法1 : 原始评估方法就是使用score来判断模型好坏。
    方法2:加入了交叉验证,的MSE,MAE得到一个平均的score,这样的效果更好。
    是否拟合到了足够的信息,使用R²

    逻辑斯蒂回归的基础理解

    1. 逻辑斯蒂回归
    • 名字叫回归,实际上做分类。主要用于两分类问题

    • 逻辑斯蒂回归的回归 - 过程

    • 逻辑斯蒂的分类

    • 逻辑斯蒂回归会生成0-1之间的连续数字 — 数字表示可能性

    • 阈值 —> 阈值的作用:分类的判断

    按照以往的方式,使用最小二乘法拟合广告渠道投入金额与顾客是否购买的关系,效果不佳
    在这里插入图片描述

    • 这个函数必须连续函数,单调可导,
    2. 可能性与最大似然估计
    • 可能性:某件事情发生的可能性的大小

    • 似然函数:某件事情已经发生,反推在什么条件下,发生这个事件的可能性最大

      • 已知参数β的情况下,预测发生X的条件概率:P(X|β) ①

      • 已知已发生的事件X,未知的参数β的似然函数:L(β|X) ②

      • ① = ②

      • 一个参数β对应一个似然函数的值,如果β发生变化,那么似然函数的值也会变,当我们取得某个参数的时候,似然函数的值到达最大。就说明这个参数下最有可能会发生X事件,就意味着这个参数最合理

        最大似然估计:

        P(y=1) = p(y=1) ¹ p(y=0)
        在这里插入图片描述

    3. 逻辑斯蒂回归的scikit_Learn代码实现

    梯度下降的练习

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    %matplotlib inline
    plt.rcParams['font.sans-serif']=['SimHei',]
    plt.rcParams['axes.unicode_minus']= False
    
    #产生X,y,x预设范围-5,5
    X = np.linspace(-5,5,50)
    
    # 预设一个损失函数
    # 3x²+2x+3.2
    f = lambda x : 3*x**2 + x*2 +3.2
    y = f(X)  # y代表的损失函数的值
    
    # 看一下损失函数与x的图像
    plt.plot(X,y)
    plt.xlabel('w')
    plt.ylabel('loss')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    # 使用梯度下降来取得loss最小时的w值
    # F(x) = 3*x**2 + x*2 +3.2
    # 求导结果 g(x) = 6*x+2
    g = lambda x : 6*x+2
    """
    # 梯度下降的公式
    #w1 = w0 - step*g(w0)
    # w0 下降的起始点
    # w1 下降之后的点
    # step 相当于η 步长 学习率
    # g(x) 对损失函数求导之后的函数
    """
    w0 = np.random.randint(-5,5,1)[0]
    print('下降的起始位置点:%d'%(w0))
    
    step = 0.01
    
    # 初始化一个w1位置
    w1 = w0 +1
    # 学习率不能太大,太大跳过最优解 梯度震荡
    # 学习率太小:找不到最优点
    
    # 设置下降的精度
    precession = 0.001
    
    # 下降次数
    max_count = 3000
    
    # 当前下降的次数
    current_count = 1
    
    # 记录下降的位置
    point = []
    while True:
        # 如果大于之前预设的迭代次数,则直接跳出
        if current_count > max_count:
            break
            
        if np.abs(w0-w1) <= precession:
            break
        # 更新上一次点
        w0 = w1
        
        #计算新的下降点
        w1 = w0 -step *g(w0)
        point.append(w1)
        current_count += 1
        print('当前第%d次下降的位置: %.4f'%(current_count,w1))
    
    """
    下降的起始位置点:3
    当前第2次下降的位置: 3.7400
    当前第3次下降的位置: 3.4956
    ···
    
    当前第90次下降的位置: -0.3157
    当前第91次下降的位置: -0.3168
    当前第92次下降的位置: -0.3178
    
    """
    
    w = np.array(point)[::10]
    """
    array([ 3.74      ,  1.86062556,  0.84836609,  0.30314784,  0.00948504,
           -0.14868617, -0.23387958, -0.27976604, -0.30448118, -0.31779313])
    """
    value = f(w)
    
    # 绘图 ,看原来损失函数与下降位置,拿到10个下降位置
    x = np.linspace(-5,5,50)
    y = f(x)
    
    plt.figure(figsize=(24,6))
    plt.plot(x,y)
    plt.scatter(w,value,color='red')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    在这里插入图片描述

    4. 参数理解
    梯度下降最重要参数:max_iter梯度下降最重要参数:max_iter
    • L1
    • L2
      在这里插入图片描述
      sag :随机平均梯度下降是梯度下降的编制
      在这里插入图片描述
    5. 逻辑斯蒂回归解决多分类的方法

    三种方法:

    • 将sigmoid的函数换成softmax
    • OvR: 选择ovr, 4损失函数的优化方法liblinear,newton_cg,lbfgs,sag 都可以选择。
    • MVR:只能选择newton_cg,lbfgs,sag

    了解一下

    了解广义线性回归?
    逻辑斯蒂回归与线性回归有什么不同?

    逻辑斯蒂回归的分类使用

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    %matplotlib inline
    plt.rcParams['font.sans-serif']=['SimHei',]
    plt.rcParams['axes.unicode_minus']= False
    # 逻辑斯蒂回归 虽然名字叫回归 实际上解决分类问题
    
    from sklearn.linear_model import LogisticRegression # 制造假数据
    from sklearn.datasets import make_blobs # 制作假数据
    X,y = make_blobs(n_samples=150,n_features=2,centers=3)
    X.shape
    y.shape
    sns.set()
    sns.displot(y) # 查看y值的分布
    sns.countplot(x=y) 画出y值的分布图
    
    sns.countplot(x=y)
    
    # 绘图展示数据情况
    plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.Accent)
    
    #LR
    # 1.
    lr = LogisticRegression()
    # 
    lr.fit(X,y)
    
    # 绘制决策边界
    xmin,xmax = X[:,0].min(),X[:,0].max()
    ymin,ymax = X[:,1].min(),X[:,1].max()
    
    a = np.linspace(xmin,xmax,200)
    b = np.linspace(ymin,ymax,200)
    
    xx,yy = np.meshgrid(a,b)
    
    X_test = np.concatenate((xx.reshape(-1,1),yy.reshape(-1,1)),axis=1)
    # 3.预测
    y_= lr.predict(X_test)
    plt.scatter(X_test[:,0],X_test[:,1],c=y_,cmap=plt.cm.Accent)
    plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.BuGn)
    
    + 逻辑斯蒂回归对于线性不可分的数据划分不太好
    + 对于线性可分的数据划分比较优越
    
    + 概率估计模型,并且也具备所有线性模型的优点(高效,缩减)|
    #概率估计模型,并且也具备所有线性模型的优点(高效,缩减)|
    # lr.predict_proba()
    
    ### 逻辑斯蒂回归的概率估计
    # 预设:5个特征 10个样本
    X = np.random.random(size=(10,5))
    y = np.random.randint(0,2,10)
    lr = LogisticRegression()
    lr.fit(X,y)
    lr.predict(X)
    
    # 线性模型 
    lr.coef_
    # score
    lr.score(X,y)
    
    # 查看正负样本的概率
    # 第一列实际上是p(y=0)概率 第二列是P(y=1)的概率
    # 如果p(y=0)概率 >P(y=1)的概率,结果就是y=0,反之亦然
    
    # 如果将阈值调整就可以使得结果更加偏向于某一个类
    # eg:p(y=0)>0.5 改为0.4 即实际上就是y=0的概率变大
    lr.predict_proba(X)
    
    lr.predict(X)
    # 试验:如果我们需要调整阈值使得结果偏好发生变化
    (lr.predict_proba(X)[:,0]>0.6)*1
    # 查看
    (lr.predict_proba(X)[:,0]<0.4)*1
    (lr.predict_proba(X)[:,1]<0.4)*1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
  • 相关阅读:
    飞书开发学习笔记(六)-网页应用免登
    Jetpack 多个Activity共享ViewModel(AndroidViewModel)
    机器学习常识(二):7 个最常见的机器学习损失函数
    【数据库】详细讲解三大范式1NF、2NF、3NF
    晶圆盒RF载具ID读取器CK-S650-PA60E的1协议和N协议通信说明
    java算法 API
    Selenium 前世今生
    matlab如何遍历文件夹及子文件夹下的所有文件
    IDEA升级后老文件夹占用大量存储空间
    基于Java实现的Lex词法分析器
  • 原文地址:https://blog.csdn.net/woaixuexi6666/article/details/127723242