1. 原理
它是一个返回对数几率,在线性数据上表现优异的分类器,它主要被应用在金融领域。其数学目的是求解能够让模型对数据拟合程度最高的参数的值,以此构建预测函数 ,然后将特征矩阵输入预测函数来计算出逻辑回归的结果y。注意,虽然我们熟悉的逻辑回归通常被用于处理二分类问题, 但逻辑回归也可以做多分类。
1.1 损失函数
衡量参数优劣的评估指标,用来求解最优参数的工具 损失函数小,模型在训练集上表现优异,拟合充分,参数优秀 损失函数大,模型在训练集上表现差劲,拟合不足,参数糟糕 我们追求,能够让损失函数最小化的参数组合 注意:没有”求解参数“需求的模型没有损失函数,比如KNN,决策树
在学习决策树和随机森林时,我们曾经提到过两种模型表现:在训练集上的表现,和在测试集上的表现。我们建 模,是追求模型在测试集上的表现最优,因此模型的评估指标往往是用来衡量模型在测试集上的表现的。然而,逻 辑回归有着基于训练数据求解参数 的需求,并且希望训练出来的模型能够尽可能地拟合训练数据,即模型在训练 集上的预测准确率越靠近100%越好。 因此,我们使用”损失函数“这个评估指标,来衡量参数为 的模型拟合训练集时产生的信息损失的大小,并以此衡 量参数 的优劣。如果用一组参数建模后,模型在训练集上表现良好,那我们就说模型拟合过程中的损失很小,损 失函数的值很小,这一组参数就优秀;相反,如果模型在训练集上表现糟糕,损失函数就会很大,模型就训练不 足,效果较差,这一组参数也就比较差。即是说,我们在求解参数 时,追求损失函数最小,让模型在训练数据上 的拟合效果最优,即预测准确率尽量靠近100%。
1.2 重要参数penalty C
正则化是用来防止模型过拟合的过程,常用的有L1正则化和L2正则化两种选项,分别通过在损失函数后加上参数向 量 的L1范式和L2范式的倍数来实现。这个增加的范式,被称为“正则项”,也被称为"惩罚项"。损失函数改变,基 于损失函数的最优化来求解的参数取值必然改变,我们以此来调节模型拟合的程度。其中L1范式表现为参数向量中 的每个参数的绝对值之和,L2范数表现为参数向量中的每个参数的平方和的开方值。
首先进行实例化,其中参数penalty默认取’l2’,对应的solver为lbfgs,一般如下使用。
1 | lr1 = LogisticRegression(penalty='l1',C=0.05,solver='liblinear') |
可通过coef_查看各个参数的属性值,你会发现L1正则化会将参数压缩为0,L2正则化只会让参数尽量小,不会取到0。
两种正则化下C的取值,都可以通过学习曲线来进行调整。(又到了画学习曲线(白色相薄)的时候(季节)了)
1 | from sklearn.linear_model import LogisticRegression |

2. 预处理
嵌入法,L1正则化会使部分特征对应的参数为0,因此L1正则化可以用来做特征选择,结合嵌入法模块SelectFromModel。此外,因为PCA和SVD降维后会变得不可解释不可读,且不可逆,不能保留原数据上的信息,所以不考虑PCA与SVD。
X_embedding = SelectFromModel(lr,norm_order=1).fit_transform(X,y)
然后1)调整SelectFromModel类的threshold参数,删除所有参数的绝对值低于这个阈值的特征。
注意threshold默认为None,此时SelectFromModel只能根据L1正则化的结果选择特征,即会删除所有L1正则化后参数为0的特征,当调整threshold值时,就不再是使用L1正则化选择特征,而是模型的coef_属性,coef_返回各个特征的系数,这与决策树中feature_importances 以及降维算法中的explained_vairance相似,将SelectFromModel中threshold设置为coef_的阈值,即可剔除系数小于threshold中输入的数字的所有特征。
2)第二种调整方法,是调逻辑回归的类LR_,通过画C的学习曲线来实现:
这样我们就实现了在特征选择的前提下,保持模型拟合的高效,现在,如果有一位医生可以来为我们指点迷津,看 看剩下的这些特征中,有哪些是对针对病情来说特别重要的,也许我们还可以继续降维。当然,除了嵌入法,系数 累加法或者包装法也是可以使用的。
1 | fullx = [] |
对于调整SelectFromModel函数中threshold参数,无法提升模型特征选择效果,以及改变LogisticRegression中C参数的值,让X与降维后的特征跑这个模型,降维后都跑过过,我也是玄学了。
1 | from sklearn.linear_model import LogisticRegression as LR |
1 | data = load_breast_cancer() |
1 | X.shape |
(569, 30)
1 | # 特征选择 |
0.9508150908244062
1 | X_embedding = SelectFromModel(lr,norm_order=1).fit_transform(X,y) |
1 | X_embedding.shape |
(569, 9)
1 | cross_val_score(lr,X_embedding,y,cv=5).mean() |
0.9349945660611707
1 | fullx = [] |
0.0 30
0.10332957864533338 18
0.20665915729066675 12
0.3099887359360001 10
0.4133183145813335 8
0.5166478932266669 8
0.6199774718720003 5
0.7233070505173336 5
0.826636629162667 5
0.9299662078080004 5
1.0332957864533339 5
1.136625365098667 3
1.2399549437440005 3
1.343284522389334 3
1.4466141010346671 2
1.5499436796800006 1
1.653273258325334 1
1.7566028369706674 1
1.8599324156160009 1
1.963261994261334 1
<matplotlib.legend.Legend at 0x7ff4c7261310>

1 | # 效果很不好 降维后不仅没达到未做处理的精确度 反而降了 画LR的C的学习曲线 |
0.9561090225563911 7.01
1 | plt.figure(figsize=[20,5]) |

1 | # 可以看到 有部分超过 继续细化 |
0.9578481602235678 7.994999999999958
1 | plt.figure(figsize=[20,5]) |

1 | lr = LR(C=7.994999999999958,solver='liblinear') |
0.9508150908244062
1 | lr = LR(C=7.994999999999958,solver='liblinear') |
0.9578481602235678
1 | X.shape |
(569, 30)
1 | X_embedding.shape # 特征个数减少了 准确度反而增加了 |
(569, 10)
3.梯度下降:重要参数max_iter
回归的数学目的是求解能够让模型最优化,拟合程度最好的参数的值,即求解能够让损失函数 J() 最小化的值。对于二元逻辑回归来说,有多种方法可以用来求解参数,最常见的有梯度下降法(Gradient Descent),坐标下降法(Coordinate Descent),牛顿法(Newton-Raphson method)等,其中又以梯度下降法最为著名。每种方法都 涉及复杂的数学原理,但这些计算在执行的任务其实是类似的。
$c(u)=\begin{cases} \sqrt\frac{1}{N},u=0\ \sqrt\frac{2}{N}, u\neq0\end{cases} $