逻辑回归:详细建模流程与例子代码

《老饼讲解机器学习》icon-default.png?t=N7T8https://www.bbbdata.com/text/50


目录

一.变量选择与预处理

(一) 变量选择与预处理的意义

(二)逻辑回归的变量预处理流程

二.将数据归一化

三.用逐步回归,筛选变量

四.计算模型评估AUC

五.检验系数与实际业务是否符合逻辑

六.注意事项

1.正则项的尝试

2.关于测试数据


本文讲述逻辑回归完整的建模流程

本文只作流程介绍,完整代码见逻辑回归建模完整代码


一.变量选择与预处理

(一) 变量选择与预处理的意义

建模是一个混然一体的东西,如果直接丢一堆数据进模型训练,那么模型要面临处理的问题会非常多。
实际上,我们更多时候是将问题一层一层的处理,把能解决的问题移到前面的流程处理好,那么到模型训练阶段,模型所要解决的就是一个简单问题,


总的来说,最好不要把问题全交给模型处理,反而尽量让模型处理的问题越简单越纯粹越好。


例如,变量选择,如果我们能从业务层面,数据分析层面,把无用变量排除掉,那模型就不需要处理“去除无效变量”这个问题。等等。

(二)逻辑回归的变量预处理流程

对于逻辑回归,一般要处理的是:

1.入模的单变量对y是线性相关的(不是线性也至少是单调的)。
2.缺失值处理

即选出与y相关的变量,并将数据尽量转换成与y线性相关。


二.将数据归一化

逻辑回归使用类似梯度下降之类的算法进行求解,数据归一化对这类求解算法的速度与极大好处。
归一化直接使用如下公式对数据缩放到[0,1]即可:

x_{norm} = \dfrac{x-x_{min}}{x_{max}-x_{min}}

三.用逐步回归,筛选变量

1.逻辑回归避免过拟合的方法:逐步回归

逻辑回归的过拟合主要来源于过多的特征。在保障模型效果的前提下,尽量选择更少的特征,使模型更简单,避免模型过拟合。逐步回归可以起到这个作用。


2.逐步回归流程:

1.历遍所有变量,将单个变量与目标建模,把模型结果最好的变量作为第一轮选择变量。
2.在第一轮选择变量的基础上,添加第二个变量,历遍剩余变量,添加哪个变量能令模型结果最好,就将其作为第二轮选择变量。
3.在第二轮的基础上,添加第三个变量......
......
直到变量不再对拟合结果带来明显贡献时,就不再添加变量。

核心代码:

#-----逐步回归挑选变量--------------------
select_var   = []                                      # 已挑选的变量  
var_pool   = np.arange(X_norm.shape[1])                # 待挑选变量池
auc_rec    = []
print("\n===========逐回步归过程===============")
while(len(var_pool)>0):
    max_auc  = 0
    best_var = None
    #---选出剩余变量中能带来最好效果的变量--------
    for i in var_pool:
        # -------将新变量和已选变量一起训练模型------
        cur_x = X_norm[:,select_var+[i]]                # 新变量和已选变量作为建模数据                
        clf.fit(cur_x,y)                                # 训练模型
        pred_prob_y = clf.predict_proba(cur_x)[:,1]     # 预测概率
        cur_auc = metrics.roc_auc_score(y,pred_prob_y)  # 计算AUC
        # ------更新最佳变量---------------------------
        if(cur_auc>max_auc):
            max_auc =  cur_auc
            best_var = i
    #-------检验新变量能否带来显著效果---------------------------
    last_auc = auc_rec[-1] if len(auc_rec)>0 else 0.0001
    valid = True  if ((max_auc-last_auc)/last_auc>0.005) else False
    # 如果有显著效果,则将该变量添加到已选变量
    if(valid):
        print("本轮最佳AUC:",max_auc,",本轮最佳变量:",feature_names[best_var])
        auc_rec.append(max_auc)  
        select_var.append(best_var)  
        var_pool = var_pool[var_pool!=best_var]
    # 如果没有显著效果,则停止添加变量
    else:
        print("本轮最佳AUC:",max_auc,",本轮最佳变量:",feature_names[best_var],',效果不明显,不再添加变量')
        break
print("最终选用变量",len(select_var),"个:",feature_names[select_var])

运行结果:

===========逐回步归过程===============
本轮最佳AUC: 0.9754505575815231 ,本轮最佳变量: worst perimeter
本轮最佳AUC: 0.9849637968394904 ,本轮最佳变量: worst smoothness
本轮最佳AUC: 0.9903017810897944 ,本轮最佳变量: mean texture
本轮最佳AUC: 0.9925611754135617 ,本轮最佳变量: radius error ,效果不明显,不再添加变量
最终选用变量 3 个: ['worst perimeter' 'worst smoothness' 'mean texture']

四.计算模型评估AUC

将筛选出来的变量,进行最终建模,并计算模型AUC。

备注:
二分类逻辑回归一般选用AUC作为评价指标,关于AUC详细可看《二分类:ROC曲线与AUC值
一般来说,AUC达到0.65模型才开始有区分度,达到0.70以上才开始有价值(这只是一个大概,具体看业务)。

核心代码如下:

#------模型训练--------------------------------
clf.fit(X_norm[:,select_var],y)
#------模型预测-------------------------------
pred_y         = clf.predict(X_norm[:,select_var])
pred_prob_y    = clf.predict_proba(X_norm[:,select_var])[:,1]
auc            = metrics.roc_auc_score(y,pred_prob_y)   #
print("\n============建模结果=================")
print("选用变量",len(select_var),"个:",feature_names[select_var])
print("AUC:",auc)

五.检验系数与实际业务是否符合逻辑

最后,需要从业务角度去检验每个变量的系数是否符合业务逻辑。

=========对应归一化数据的模型参数========
模型系数(对应归一化数据): [-8.92825356 -3.87812186 -3.10331343]
模型阈值(对应归一化数据): [5.73863685]

=========对应原始数据的模型参数==========
模型系数(对应原始数据): [ -0.04446563 -25.60999711  -0.10494804]
模型阈值(对应原始数据): [10.82185811]
提取公式计算的概率与模型概率的最大误差 8.326672684688674e-16

备注:

本人曾有两次遇到系数与业务逻辑不符合,最后发现是因为没有对数据进行归一化,做了归一化后,训练出来的结果又符合业务逻辑了。

六.注意事项

1.正则项的尝试

sklearn训练时默认会加L2正则项,以避免系数过大。但这样会牺牲一定的求解精确度,因此我们最好把加L2和不加任何正则项都尝试一下(即参数penalty=’l2‘/'none'),哪种效果更好,就用哪种。

2.关于测试数据


要不要留测试数据验证模型泛化能力,对于逻辑回归,与正则项一样,是把双刃剑。
在变量选择较好,模型训练合理的情况下,逻辑回归几乎不会过拟合。留出数据验证模型是否过拟合,很多时候是多此一举(逻辑回归模型简单,就是一个S型的模型,没有任何跌宕可言),如果不留数据,有可能会造成过拟合(几率很小)而不知道,而留数据,则又减少了训练数据(训练数据越多,模型肯定越好),的确是一把双刃剑。
在此情况下,留不留检验数据,还依据建模师根据自己的实际情况选择。总而言之,逻辑回归不一定非要留检验数据不可。


相关文章

逻辑回归过拟合分析与解决方案

sklearn:一个简单的逻辑回归例子

sklearn提取逻辑回归模型系数

逻辑回归建模完整流程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值