• Python实现逻辑回归模型教程


    理解多个预测变量与连续响应变量之间关系通常适用线性回归,但当响应变量为类别变量时需要适用逻辑回归。
    逻辑回归是尝试从数据集中把W观测记录分为不同类别的分类算法。

    常见的分类回归场景有:

    • 通过信用分和账户余额预测客户贷款是否违约
    • 通过篮球比赛中平均抢得篮板球次数及平均每场得分预测是否被NBA选中
    • 通过特定城市的房屋大小及盥洗室数量预测房价是否为200w以上

    相比于线性回归的响应值是连续变量,上述示例的响应变量仅包括两个值中的一个。

    逻辑回归方程

    逻辑回归使用最大似然估计方法寻找下面方程:

    l o g [ p ( X ) / ( 1 − p ( X ) ) ] = β 0 + β 1 X 1 + β 2 X 2 + … + β p X p {log^{[p(X) / (1-p(X))]} = β_0 + β_1X_1 + β_2X_2 + … + β_pX_p} log[p(X)/(1p(X))]=β0+β1X1+β2X2++βpXp

    参数说明:

    • X j : 第 j t h 个预测变量 {X_j: 第 j^{th} 个预测变量} Xj:jth个预测变量

    • β j : 第 j t h 个预测变量的预测系数 {β_j: 第 j^{th} 个预测变量的预测系数} βj:jth个预测变量的预测系数

    方程右边的公式预测了响应变量取值为1的对数概率。因此,当我们拟合逻辑回归模型时,我们可以使用以下公式来计算给定观测值为1的概率:

    p ( X ) = e β 0 + β 1 X 1 + β 2 X 2 + … + β p X p / ( 1 + e β 0 + β 1 X 1 + β 2 X 2 + … + β p X p ) {p(X) = e^{β_0 + β_1X_1 + β_2X_2 + … + β_pX_p} / (1 + e^{β_0 + β_1X_1 + β_2X_2 + … + β_pX_p)}} p(X)=eβ0+β1X1+β2X2++βpXp/(1+eβ0+β1X1+β2X2++βpXp)

    然后使用特定概率阈值对观测值进行分类:1或0。举例:观测概率大等于0.5则为1,反之为0。

    如何解释逻辑回归响应值

    假设我们使用逻辑回归模型来预测一个给定的篮球运动员是否会被NBA选中,基于他们的场均篮板和场均得分。

    下面是逻辑回归模型的输出:

    ItemCoefficientStd. ErrorZ-statisticP-value
    Intercept-2.86900.1485-19.3199<0.0001
    Rebounds0.06980.01614.3235<0.0001
    Points0.16940.02995.6734<0.0001

    使用上述系数,我们可以计算指定运动员被选人NBA的概率:

    P ( D r a f t e d ) = e − 2.8690 + 0.0698 ∗ ( r e b s ) + 0.1694 ∗ ( p o i n t s ) / ( 1 + e − 2.8690 + 0.0698 ∗ ( r e b s ) + 0.1694 ∗ ( p o i n t s ) ) {P(Drafted) = e^{-2.8690 + 0.0698*(rebs) + 0.1694*(points)} / (1+e^{-2.8690 + 0.0698*(rebs) + 0.1694*(points)})} P(Drafted)=e2.8690+0.0698(rebs)+0.1694(points)/(1+e2.8690+0.0698(rebs)+0.1694(points))

    假设某运动员场均为8个篮板、得15分,则计算结果为0.557,既然大于0.5,则预测结果为被选入NBA;

    相比另一个运动员场均3个篮板、得7分,则计算结果为0.186,既然小于0.5,则预测结果不会被选人NBA.

    逻辑回归假设前提

    逻辑回归需遵循下面一些假设:

    1. 响应变量为二值,即响应变量只能有两种可能。
    2. 观测数据集是相互独立的。即观察结果不应该来自于对同一个体的重复测量,也不应该以任何方式相互关联。
    3. 预测变量之间不存在严重的多重共线性,即假设预测变量之间不存在高度相关。
    4. 没有极端的异常值。假设在数据集中没有极端的异常值或有影响的观察结果。
    5. 预测变量与响应变量的logit之间存在线性关系。这个假设可以使用Box-Tidwell测试进行测试。
    6. 样本量足够大。作为经验法则,每个解释变量应该有至少10个最不常见的结果。例如,如果你有3个解释变量,而最不常见结果的期望概率是0.20,那么你的样本量应该至少为(10*3)/ 0.20 = 150。

    示例

    载入必要的包

    import pandas as pd
    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LogisticRegression
    from sklearn import metrics
    import matplotlib.pyplot as plt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    加载数据

    使用下面代码加载数据:

    data = pd.read_csv("data/default.csv")
    
    # view first six rows of dataset
    print(data[0:6])
    
    # find total observations in dataset
    print(len(data.index))
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果:

       default  student      balance        income
    0        0        0   729.526495  44361.625074
    1        0        1   817.180407  12106.134700
    2        0        0  1073.549164  31767.138947
    3        0        0   529.250605  35704.493935
    4        0        0   785.655883  38463.495879
    5        0        1   919.588530   7491.558572
    10000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    数据集包含10000条客户信息,共四列:

    default: 响应变量,是否违约.
    student: 是否为学生.
    balance: 平均余额.
    income: 收入情况.

    我们将使用其他三个变量预测是否违约:default字段。

    创建测试集和训练集

    下面把原数据集分为测试集和训练集:

    # 定义预测变量和响应变量
    x = data[['student', 'balance', 'income']]
    y = data['default']
    
    # split the dataset into training (70%) and testing (30%) sets
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=0)  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    拟合逻辑回归模型

    我们使用LogisticRegression()函数拟合模型:

    # 实例化模型对象
    log_regression = LogisticRegression()
    
    # 使用训练数据拟合模型
    log_regression.fit(x_train, y_train)
    
    # 使用测试数据进行预测
    y_pred = log_regression.predict(x_test)
    
    
    # 输出模型参数
    print(log_regression.intercept_, log_regression.coef_, log_regression.score(x_train, y_train))
    # [-2.86843745] [[-3.79999456e+00  4.03495132e-03 -1.36823955e-04]] 0.9691428571428572
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    模型诊断

    测试完成后,我们需要分析模型表现. 首先创建混淆矩阵:

    cnf_matrix = metrics.confusion_matrix(y_test, y_pred)
    
    print(cnf_matrix)
    
    • 1
    • 2
    • 3

    结果如下:

    [[2870   17]
     [  93   20]]
    
    • 1
    • 2
    • 正确预测不违约: 2870
    • 正确预测真违约: 20
    • 错误预测不违约: 93
    • 错误预测真违约: 17

    下面获取模型准确率,它表示模型的正确预测率:

    print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
    
    # Accuracy: 0.9633333333333334
    
    • 1
    • 2
    • 3

    通过结果可以说明模型可以正确预测客户违约率为96.2% .

    最后,我们可以绘制ROC (Receiver Operating Characteristic)曲线,该曲线显示模型预测的真阳性的百分比,随着预测概率的截止点从1降低到0。AUC(曲线下面积)越高,我们的模型预测结果就越准确:

    在这里插入图片描述

  • 相关阅读:
    三天打鱼两天晒网
    同态加密简介HE
    内江科技杂志内江科技杂志社内江科技编辑部2024年第13期目录
    HIVE常见面试题以及实战练习(六)
    Live555库结构及其核心概念
    docker专题-数据管理
    selenium+python自动化安装驱动 碰到的问题
    云计算项目九:K8S安装
    【Python性能优化实例】计算 numpy 数组首尾为 0 的数量
    Windows 10 IoT Enterprise 2019 LTSC High End OEM Software 详细介绍
  • 原文地址:https://blog.csdn.net/neweastsun/article/details/126584713