Logistic回归

在回归分析中,因变量 y y y可能有两种情形:① y y y是定量变量,这时就用线性回归regress函数对 y y y进行回归;② y y y是一个定性变量,比如 y = 0 或 y = 1 y=0或y=1 y=0y=1,这时就要使用逻辑回归。

  • 逻辑回归主要应用于研究某些现象发生的概率 P P P,比如股票涨还是跌,公司成功还是失败,常用于二分类

逻辑回归的原理

  • 逻辑回归的原理是用逻辑函数把线性回归的结果(-∞,∞)映射到(0,1)

线性回归函数

  • 线性回归函数的数学表达式是:

y i = θ 0 + θ 1 x 1 i + . . . + θ n x n i = θ T x i ( i = 1 , . . . , m ) y_i=\theta_0+\theta_1x_{1i}+...+\theta_nx_{ni}=\boldsymbol\theta^T\boldsymbol x_i\quad(i=1,...,m) yi=θ0+θ1x1i+...+θnxni=θTxi(i=1,...,m)
θ 0 \theta_0 θ0是常数项, θ i ( i = 1 , . . . , n ) \theta_i(i=1,...,n) θi(i=1,...,n)是代求系数,不同的权重 θ i \theta_i θi反映了自变量对因变量的贡献大小

逻辑函数(Sigmoid函数)

  • 我们设连接函数为 F ( x , θ ) = F ( θ T x ) F(\boldsymbol x,\boldsymbol\theta)=F(\boldsymbol\theta^T\boldsymbol x) F(x,θ)=F(θTx),它将解释变量 x \boldsymbol x x和被解释变量 y y y连接起来,在给定 x \boldsymbol x x的情况下,考虑 y y y的两点分布:

P ( y = 1 ∣ x ) = F ( x , θ ) P ( y = 0 ∣ x ) = 1 − F ( x , θ ) P(y=1|\boldsymbol x)=F(\boldsymbol x,\boldsymbol\theta)\\ P(y=0|\boldsymbol x)=1-F(\boldsymbol x,\boldsymbol\theta) P(y=1∣x)=F(x,θ)P(y=0∣x)=1F(x,θ)
易知 F ( x , θ ) F(\boldsymbol x,\boldsymbol\theta) F(x,θ)的值域是 [ 0 , 1 ] [0,1] [0,1]

  • Sigmoid函数 S ( x ) = e x p ( x ) 1 + e x p ( x ) S(x)=\frac{exp(x)}{1+exp(x)} S(x)=1+exp(x)exp(x),其图像为

  • 这里我们选取 F ( x , θ ) F(\boldsymbol x,\boldsymbol\theta) F(x,θ)为Sigmoid函数,即 F ( x , θ ) = S ( θ T x ) = e x p ( θ T x ) 1 + e x p ( θ T x ) F(\boldsymbol x,\boldsymbol\theta)=S(\boldsymbol\theta^T\boldsymbol x)=\frac{exp(\boldsymbol\theta^T\boldsymbol x)}{1+exp(\boldsymbol\theta^T\boldsymbol x)} F(x,θ)=S(θTx)=1+exp(θTx)exp(θTx)

逻辑回归模型

P ( y = 1 ∣ x 1 , x 2 , . . . , x n ) = e x p ( θ 0 + θ 1 x 1 + . . . + θ n x n ) 1 + e x p ( θ 0 + θ 1 x 1 + . . . + θ n x n ) P(y=1|x_1,x_2,...,x_n)=\frac{exp(\theta_0+\theta_1x_1+...+\theta_nx_n)}{1+exp(\theta_0+\theta_1x_1+...+\theta_nx_n)} P(y=1∣x1,x2,...,xn)=1+exp(θ0+θ1x1+...+θnxn)exp(θ0+θ1x1+...+θnxn)
进行对数变换,可得
ln ⁡ P 1 − P = θ 0 + θ 1 x 1 + . . . + θ n x n \ln\frac{P}{1-P}=\theta_0+\theta_1x_1+...+\theta_nx_n ln1PP=θ0+θ1x1+...+θnxn
由于P只能取0或1,这就导致等式左端没有意义,所以先定义一种单调连续的概率函数 π \pi π,令
π = P ( y = 1 ∣ x 1 , x 2 , . . . , x n ) , 0 < π < 1 \pi=P(y=1|x_1,x_2,...,x_n),\quad 0<\pi<1 π=P(y=1∣x1,x2,...,xn),0<π<1
P = { 0 π ≤ 0.5 1 π > 0.5 P= \begin{cases} 0 & \pi\le0.5\\ 1 & \pi>0.5 \end{cases} P={01π0.5π>0.5
于是
ln ⁡ π 1 − π = θ 0 + θ 1 x 1 + . . . + θ n x n \ln\frac{\pi}{1-\pi}=\theta_0+\theta_1x_1+...+\theta_nx_n ln1ππ=θ0+θ1x1+...+θnxn
虽然形式相同,但此时的 π \pi π是连续函数。然后只需要对原始数据进行合理的映射处理,既可以用线性回归方法得到回归系数。再有 π \pi π P P P的映射关系得到 P P P的值。

求参

  • 非线性模型使用极大似然估计方法(MLE)对参数进行估计

{ P ( y = 1 ∣ x ) = S ( θ T x ) P ( y = 0 ∣ x ) = 1 − S ( θ T x ) ⇒ f ( y i ∣ x i , θ ) = { S ( θ T x i ) , y i = 1 1 − S ( θ T x i ) , y i = 0 \begin{cases} P(y=1|\boldsymbol x)=S(\boldsymbol\theta^T\boldsymbol x)\\ P(y=0|\boldsymbol x)=1-S(\boldsymbol\theta^T\boldsymbol x) \end{cases} \Rightarrow f(y_i|\boldsymbol{ x_i,\theta})= \begin{cases} S(\boldsymbol\theta^T\boldsymbol x_i)&,y_i=1\\ 1-S(\boldsymbol\theta^T\boldsymbol x_i)&,y_i=0 \end{cases} {P(y=1∣x)=S(θTx)P(y=0∣x)=1S(θTx)f(yixi,θ)={S(θTxi)1S(θTxi),yi=1,yi=0

  • 写成更紧凑的格式:

f ( y i ∣ x i , θ ) = [ S ( θ T x i ) ] y i [ 1 − S ( θ T x i ) ] 1 − y i f(y_i|\boldsymbol{ x_i,\theta})= [S(\boldsymbol\theta^T\boldsymbol x_i)]^{y_i} [1-S(\boldsymbol\theta^T\boldsymbol x_i)]^{1-y_i} f(yixi,θ)=[S(θTxi)]yi[1S(θTxi)]1yi

  • 对数似然函数:

ln ⁡ L ( θ ∣ y , x ) = ∑ i = 1 m y i ln ⁡ [ S ( θ T x i ) ] + ∑ i = 1 m ( 1 − y i ) ln ⁡ [ 1 − S ( θ T x i ) ] \ln L(\boldsymbol\theta|\boldsymbol {y,x})= \sum_{i=1}^m{y_i}\ln[S(\boldsymbol\theta^T\boldsymbol x_i)]+\sum_{i=1}^m(1-y_i)\ln[1-S(\boldsymbol\theta^T\boldsymbol x_i)] lnL(θy,x)=i=1myiln[S(θTxi)]+i=1m(1yi)ln[1S(θTxi)]

  • 我们可以最大化似然函数或最小化损失函数求参

J ( θ ) = − 1 m ln ⁡ L ( θ ) J(\boldsymbol\theta)=-\frac{1}{m}\ln L(\boldsymbol\theta) J(θ)=m1lnL(θ)
min ⁡ J ( θ ) ⇔ max ⁡ ln ⁡ L ( θ ) \min J(\boldsymbol\theta)\Leftrightarrow \max\ln L(\boldsymbol\theta) minJ(θ)maxlnL(θ)

  • 使用梯度下降法求最小化损失函数

    z = θ 0 + θ 1 x 1 + . . . + θ n x n z=\theta_0+\theta_1x_1+...+\theta_nx_n z=θ0+θ1x1+...+θnxn
    易知, z > 0 z>0 z>0时, F ( x , θ ) > 0.5 F(\boldsymbol x,\boldsymbol\theta)>0.5 F(x,θ)>0.5,就将 x \boldsymbol x x归为 y = 1 y=1 y=1这个类别; z < 0 z<0 z<0时, F ( x , θ ) < 0.5 F(\boldsymbol x,\boldsymbol\theta)<0.5 F(x,θ)<0.5,就将 x \boldsymbol x x归为 y = 0 y=0 y=0这个类别。 z < 0 z<0 z<0时, F ( x , θ ) > 0.5 F(\boldsymbol x,\boldsymbol\theta)>0.5 F(x,θ)>0.5,就将 x \boldsymbol x x归为 y = 1 y=1 y=1这个类别。所以我们找到的 θ = ( θ 0 , θ 1 , . . . , θ n ) \boldsymbol\theta=(\theta_0,\theta_1,...,\theta_n) θ=(θ0,θ1,...,θn)是使得 z = 0 z=0 z=0这个决策边界能较好的把两类样本正确分开。
    使用梯度下降法迭代求最优的系数:
    a. 初始化 θ \boldsymbol\theta θ
    b. 更新 θ = θ − α ∗ d J ( θ ) d θ \boldsymbol\theta=\boldsymbol\theta-\alpha*\frac{dJ(\boldsymbol\theta)}{d\boldsymbol\theta} θ=θαdθdJ(θ)
    c. 迭代到一定次数或到一定阈值
    在这里插入图片描述

迭代过程图解:在不断减小损失函数的过程中,求得最优的分界线
在这里插入图片描述

分类

  • 因为

E ( y ∣ x ) = 1 × P ( y = 1 ∣ x ) + 0 × P ( y = 0 ∣ x ) E(y|\boldsymbol x)=1\times P(y=1|\boldsymbol x)+0\times P(y=0|\boldsymbol x) E(yx)=1×P(y=1∣x)+0×P(y=0∣x)
所以我们可以将 y ^ \hat{y} y^理解为 y = 1 y=1 y=1发生的概率,如果 y i ^ ≥ 0.5 \hat{y_i}\ge0.5 yi^0.5,则认为其对应的 y = 1 {y}=1 y=1

使用Spss求解逻辑回归

  • 加入自变量有分类变量:

方法一:先创建虚拟变量,然后删除任意一列以排除完全多重共线性的影响
方法二:直接点击分类,然后定义分类协变量,Spss会自动生成

  • 预测结果较差:

可以在逻辑回归模型中加入平方项、交互项

  • 如何确定合适的模型:

把数据分成训练组和测试组,用训练组的数据估计出模型,再用测试组的数据进行测试.(8:2)
为了消除偶然因素的影响,可以对该步骤进行多次,最终对每个模型求一个平均的准确率,即交叉验证

python预测癌症

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, classification_report, roc_auc_score
import pandas as pd
import numpy as np
# 构造列标签名字
column = ['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=column)
# 缺失值进行处理
data = data.replace(to_replace='?', value=np.nan)
#直接删除,哪一行有空值,就删除对应的样本
data = data.dropna()
# 进行数据的分割
x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]], test_size=0.25,
                                                    random_state=1)
# 进行标准化处理
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
# 逻辑回归预测
# C正则化力度,alpha
# solver = 'liblinear' 学习率优化算法,就是学习率会随着迭代次数的变化而变化
lg = LogisticRegression(C=0.8, solver='newton-cg')
lg.fit(x_train, y_train)
y_predict = lg.predict(x_test)
print(y_predict)
print("准确率:", lg.score(x_test, y_test))
print(lg.predict_proba(x_test))  #得出对应分类的概率
# 为什么还要看下召回率,labels和target_names对应
# macro avg 平均值  weighted avg 加权平均值
print("召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"]))
#AUC计算要求是二分类,不需要是0和1
print("AUC指标:", roc_auc_score(y_test, y_predict))

结果:
[2 2 2 4 2 4 2 2 4 4 2 2 4 2 2 4 2 2 2 2 2 2 2 4 4 2 2 2 4 4 2 2 4 4 2 4 2
 2 4 4 4 2 2 4 2 2 2 2 4 2 2 2 4 2 2 2 4 2 2 2 2 4 2 2 2 4 2 4 4 2 2 4 2 2
 4 2 2 2 2 2 2 2 4 2 4 4 2 2 2 4 2 2 4 2 2 4 4 2 2 4 2 2 4 4 2 2 2 2 4 2 4
 4 2 4 2 4 2 2 2 2 4 2 4 2 2 2 2 2 4 2 2 2 2 2 2 2 4 2 4 4 2 2 4 2 2 2 2 4
 2 2 2 2 2 4 2 4 2 4 2 2 4 2 4 2 4 4 2 4 2 2 2]
准确率: 0.9824561403508771
[[9.51949774e-01 4.80502260e-02]
 [9.95813925e-01 4.18607470e-03]
             ......
 [9.93252705e-01 6.74729485e-03]]
召回率:               
                    precision    recall  f1-score   support

          良性       0.97      1.00      0.99       111
          恶性       1.00      0.95      0.97        60

    accuracy                           0.98       171
   macro avg       0.99      0.97      0.98       171
weighted avg       0.98      0.98      0.98       171

AUC指标: 0.975
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_961876584

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值