python数据挖掘学习笔记——logistic逻辑回归实现


Logistic模型是经典的用于分类问题的模型,通常用于判断一件事物的好坏或将其分类。本文着重介绍logistic模型的在二分类上的应用,对于数学的推导证明则省略,logistic模型还有很多拓展的使用,如正则化、通过惩罚项调整系数等都值得学习研究,但本文不做赘述只讨论最基本的应用。
本文仅用于个人学习笔记使用
Reference:《从零开始学习python数据分析和挖掘(第二版)》

logistic模型的基本介绍

本文研究的问题为二分类问题,一般研究的问题有两类:一是判断问题好与坏的情况;二是将某种物质进行分类。例如医学上,可通过某些体检指标来判断是否确证某种病症。若采用之前的回归模型来描述,将0.5作为阈值——函数值小于0.5则表示未得病;大于0.5则表示得病的话,可能会造成较大的误差。所以通常采用logit函数将函数值压缩到0-1之间,其表达式如下所示:
y = 1 1 + e − z y = \frac{1}{1 + e^{-z} } y=1+ez1
令: z = β 0 + β 1 x 1 + ⋯ + β p x p z = \beta_{0}+\beta _{1}x_{1} + \cdots + \beta_{p}x_{p} z=β0+β1x1++βpxp
则可以得到: p = h β ( x ) = 1 1 + e − ( β 0 + β 1 x 1 + ⋯ + β p x p ) p = h_{\beta} (x)= \frac{1}{1 + e^{-(\beta_{0}+\beta _{1}x_{1} + \cdots + \beta_{p}x_{p})}} p=hβ(x)=1+e(β0+β1x1++βpxp)1
此处的p表示正向的概率, h β ( x ) h_{\beta}(x) hβ(x)可称为logistic模型,即为本期文章的重点。继续看下面的公式:
p 1 − p = e β 0 + β 1 x 1 + ⋯ + β p x p \frac{p}{1-p} = e^{ \beta_{0}+\beta _{1}x_{1} + \cdots + \beta_{p}x_{p}} 1pp=eβ0+β1x1++βpxp
此时若我们将两边取对数,则可得:
l o g ( p 1 − p ) = β 0 + β 1 x 1 + ⋯ + β p x p log(\frac{p}{1 - p}) = \beta_{0}+\beta _{1}x_{1} + \cdots + \beta_{p}x_{p} log(1pp)=β0+β1x1++βpxp
此时又回到了线性回归的模型形式,这很神奇捏。 p 1 − p \frac{p}{1 - p} 1pp 称为发生比,表示发生正向事件的概率占发生反向事件的概率的百分比。logistic模型中的参数 β \beta β正是通过这个方程求解出来的,但是如使用一般的OLS算法无法求解,一般采用极大似然估计法以及梯度下降算法迭代进行求解。这个过程我们不做推导,可自行查阅相关文献。

python中实现logistic回归

接下来让我们来看看python是如何实现logistic模型的建立:
数据集:根据6个跟运动状态有关的自变量,三个与方向有关,三个与加速度有关,根据该数据集构建logistic模型用于判断该用户是跑步还是步行。
使用模块:sklearn的子模块:linear_model中的LogisticRegression类。
代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn import model_selection 

sports = pd.read_csv(r'Run or Walk.csv')
predictors = sports.columns[4:]
X = sports[:][predictors] 
y = sports.activity 
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, 
                y, test_size = 0.25, random_state = 1234) 
# 训练模型
sklearn_logistic = linear_model.LogisticRegression().fit(X_train, y_train)
# 返回模型的各个参数
print('logistic模型的β系数:\n',sklearn_logistic.intercept_, sklearn_logistic.coef_)

解析: 读取文件、分割选取自变量和因变量、分割训练集测试集的基本操作不做叙述,重点来看logistic模型的求解:
通过调用LogisticRegression()类中的函数fit()对训练集的因变量和自变量进行训练,得出模型的表达式的参数 β \beta β结果如下所示:

logistic模型的β系数:#常系数以及变量前的系数:
 [4.36637441] [[ 0.48695898  6.87517973 -2.44872468 -0.01385936 -0.16085022  0.13389695]] 

最终可建立模型:
h β ( x ) = 1 1 + e − ( 4.37 + 0.49 x 1 + 6.86 x 2 − 2.45 x 3 − 0.01 x 4 − 0.16 x 5 + 0.13 x 6 ) h_{\beta}(x) = \frac{1}{1 + e^{-(4.37 + 0.49x_{1} + 6.86x_{2} - 2.45x_{3} - 0.01x_{4} - 0.16x_{5} + 0.13x_{6})}} hβ(x)=1+e(4.37+0.49x1+6.86x22.45x30.01x40.16x5+0.13x6)1
模型系数的意义
x 1 x_{1} x1为例,其系数为0.49,表示在其他因素均不变的情况下, x 1 x_{1} x1的数值每增加一个单位,会使得跑步发生比变化0.49倍。
模型的预测:

sklearn_predict = sklearn_logistic.predict(X_test)
res = pd.Series(sklearn_predict).value_counts()
print('预测结果:\n', res) 

输出结果

预测结果:
0    12119
1    10028
dtype: int64

使用predict()函数进行预测,得到的结果分别显示被判断为了跑步或走路的样本的个数。

模型的评价

混淆矩阵

定义:
混淆矩阵是2×2的矩阵,其基本形式如下所示。

实际为0实际为1
预测为0A, 预测正确为0B, 错将1预测为0
预测为1C, 错将0预测为1D, 预测正确为1

A可用TN表示,B可用FN表示;C可用FP表示,D可用TP表示。定义了这些数值,我们可以定义如下几个指标:
A c c u r a c y = A + D A + B + C + D , 衡 量 模 型 对 整 体 数 据 的 预 测 效 果 Accuracy =\frac{A + D}{A + B + C + D},衡量模型对整体数据的预测效果 Accuracy=A+B+C+DA+D
S e n s i t i v i t y = D B + D , 正 例 覆 盖 率 Sensitivity = \frac{D}{B + D},正例覆盖率 Sensitivity=B+DD
S p e c i f i c i t y = A A + C , 反 例 覆 盖 率 Specificity = \frac{A}{A + C},反例覆盖率 Specificity=A+CA
P r e c i s i o n = D C + D , 正 例 命 中 率 Precision = \frac{D}{C + D}, 正例命中率 Precision=C+DD
代码:

# 混淆矩阵
cm = metrics.confusion_matrix(y_test, sklearn_predict, labels = [0, 1])
print('混淆矩阵:\n', cm)


# 混淆矩阵热力图
import seaborn as sns
sns.heatmap(cm, annot=True, fmt = '.2e', cmap = 'GnBu')

输出结果:混淆矩阵的热力图如下所示。该热力图颜色越深的地方其数值越大,且图中对角线上的颜色最深,表明预测正确的占比较大。
在这里插入图片描述

ROC曲线,AUC值

ROC曲线则是通过可视化结果来判断模型的好坏。它的指标有两个:一是x轴的1 - Specificity;二是y轴的Sensitivity。利用python我们可以轻松地绘制出ROC曲线以及其面积AUC数值如下所示:
代码

# ROC曲线和AUC数值
# y得分为模型预测正例的概率
plt.figure()
y_score = sklearn_logistic.predict_proba(X_test)[:, 1]

fpr, tpr, threshold = metrics.roc_curve(y_test, y_score)
# 计算AUC的值
roc_auc = metrics.auc(fpr, tpr)

import matplotlib.pyplot as plt
#绘制面积图
plt.stackplot(fpr, tpr, colors='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加ROC曲线的轮廓
plt.plot(fpr, tpr, color = 'black', lw = 1)
# 添加对角线
plt.plot([0, 1], [0, 1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5, 0.3, 'ROC curve (area = %0.2f)' % roc_auc)

plt.xlabel('1-Specificity')
plt.ylabel('Specificity')

plt.show()

输出结果:该ROC曲线下的面积即为AUC的数值,为0.93。其值越接近1表明该模型的拟合效果越好。
在这里插入图片描述
后记
分类模型除logistic模型外,fisher判别分析、SVM支持向量机、决策树等大量的机器学习算法都可解决分类问题。在真实的项目中或数学建模竞赛时,通常是利用python自动化编程的优势,将所有可能用到的模型进行训练、测试,并使用模型评估的方法对该算法下的结果进行评估,最终选择最为优秀的模型进行应用,这也是机器学习算法选择的基本思路。

  • 5
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值