参考资料:用python动手学统计学
逻辑回归即logistic回归。概率分布为二项分布、联系函数为logit函数的广义线性模型叫作logistic回归。解释变量可以有多个,连续型和分类型的解释变量也可以同时存在。
1、logit函数
logit函数的数学式如下,对数的底为e:
2、反函数
已知函数f(a)=b,交换a与b的关系,得到g(b)=a,g(x)就是f(x)的反函数。
3、logistic函数
logistic函数时logit函数的反函数,设Logit函数为f(x),logistic函数为g(x),则g(f(x))=x。
logistic函数的数学式如下:
4、logistic函数的性质
指数函数exp(-y)不可能小于0,所以logistic函数的分布不可能小于1。y越小,exp(-y)越大。当分母很大时,logistic函数的值趋向于0。总结如下
当y趋向于正无穷时,g(y)趋向于1;当y趋向于负无穷时,g(y)趋向于0。
logistic函数的值永远介于0和1之间。
5、logistic回归的推导
logistic回归的概率分布为二项分布,联系函数为logit函数。
设成功概率(即考试合格率)为p,联系函数为logit函数,则考试合格率与学习时间的关系如下:(本例将研究考试合格情况与学习时间的逻辑回归关系)
将两边转化为logistic函数,得到:
这就是用于预测合格率的数学式。
6、python实现
6.1 导入库
# 导入库
# 用于数值计算的库
import numpy as np
import pandas as pd
import scipy as sp
from scipy import stats
# 导入绘图的库
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
# 用于估计统计模型的库
import statsmodels.formula.api as smf
import statsmodels.api as sm
6.2 数据准备
test_result=pd.read_csv(r"文件目录")
6.3 数据展示
以横轴为学习时间(hour)、纵轴为合格率(result),绘制出学习时间与合格率关系的条形图。
sns.barplot(x='hours',y='result',data=test_result)
在条形图中,纵轴的值为均值。合格为1,不合格为0,因此均值可看作合格率。由图形可以看出,学习时间越长,合格率越高。
6.4 拟合logistic回归
mod_glm=smf.glm(formula='result~hours',
data=test_result,
family=sm.families.Binomial()).fit()
在进行广义线性模型估计时,不管是不是logistic回归模型,都需要使用smf.glm函数。参数介绍如下:
(1)formula参数与估计正态线性模型时所用的一样。参数值为“result ~ hours”,代表响应变量为result,解释变量为hours。当存在多个解释变量时,使用加号连接。
(2)data参数代表数据源,要求为dataframe格式。
(3)family参数代表概率分布。sm.families.Binomial()为二项分布,sm.families.Poisson()为泊松分布。本例没有指定联系函数。当概率分布为二项分布时,联系函数默认为logit函数。不同的概率分布默认的联系函数也不同。泊松分布默认的联系函数为对数函数。我们也可以通过sm.families.Binomial(link=sm.families.links.logit)显式指定联系函数。
6.5 logistic回归的结果
mod_glm.summary()
Method中的IRLS为迭代加权最小二乘法的英文 Iterative Reweighted Least Squares的缩写。算法中的迭代次数为No.Iterations。
Deviance与Pearson chi2是表示模型拟合程度的指标。
Wald检验用于对系数的解读。
6.6 模型的选择
下面使用AIC对比空模型和包含解释变量(学习时间)的模型哪个更合适。
# 估计空模型
mod_glm_null=smf.glm('result~1',
data=test_result,
family=sm.families.Binomial()).fit()
# 对比AIC
print('空模型:',mod_glm_null.aic.round(3))
print('包含解释变量的模型:',mod_glm.aic.round(3))
包含解释变量的模型的AIC更小,说明在预测合格率是需要学习时间这个解释变量。由6.5的结果可知学习时间的系数为正数,说明学习时间越长,合格率越高。
6.7 回归曲线
以横轴为学习时间、纵轴为合格情况(二值变量)绘制散点图,并在其上绘制有logistic回归所得的理论合格率。设置函数seaborn.lmplot的参数logistic=True,即可绘制出指定图形。
sns.lmplot(x='hours',y='result',
data=test_result,
logistic=True,
x_jitter=0.1,y_jitter=0.02)
合格的数据全是0或1,在图形上会重合,因而这里制订了x_jitter与y_jitter,以让散点图的数据在图形上稍微分散一些。
6.8 预测
# 建立0-9的公差为1的等差数列
exp_val=pd.DataFrame({
'hours':np.arange(0,10,1)
})
# 成功概率的预测值
pred=mod_glm.predict(exp_val)
pred
由预测结果可以看出,不学习的合格率只有1%,学习9小时的合格率接近为98%。得到要么为0要么为1的值,只需要对小数点后1位四舍五入,数值只要不小于0.5就是合格。
7、优势
要解读logistic回归模型中估计的参数,还需要掌握一个术语。
成功概率与失败概率的比值叫做优势,它表示是否容易成功,其数学式表示为:优势=p/(1-p)。其中p为成功概率。当p=0.5时,有时为1,表示成功和失败的容易程度相当;当p=0.75时,优势为3,表示成功比失败容易3被。
优势的对数叫作对数优势,logit函数也可以看作将成功概率转换为对数优势的函数。
优势的比值叫做优势比。优势比的对数叫作对数优势比。
8、logistic回归的系数与优势比的关系
当联系函数为logit函数时,logistic回归的系数与有时密切相关。具体来说解释变量改变一个单位时的对数优势比就是回归系数。