逻辑回归其实是一个线性分类器,其本质是由线性回归变化而来,是一种广泛使用于分类问题中的广义回归算法。其中线性回归模型如下图(向量形式):
模型的求解方法有最小二乘法
而逻辑回归则是将线性回归通过Sigmoid函数映射到(0,1)之间如图:
Tips:最小二乘法和梯度下降的区别
最小二乘法求解系数theta主要数学上的求极值的方法,求偏导然后使偏导为零。
梯度下降法,首先目标函数(假设只有theta0和theta1):
然后其求解的迭代公式:
将线性回归模型带入Sigmoid函数得到逻辑回归的一般形式:
其取值在(0,1)之间,并且y(x)和1-y(x)相加必然为1,令y(x)除以1-y(x)并取对数,计算推导最终得到线性回归z的函数:
y(x)表示事件发生的概率,1-y(x)表示事件不发生的概率。y(x)/(1-y(x))表示事件的Odds。
Odds的概念:Odds的意思是几率、可能性。在统计学里,概率(Probability)和Odds都是用来描述某件事情发生的可能性。概率是事件发生的次数和所有事件发生的总次数之比。Odds指的是事件发生的概率与事件不发生的概率之比。所以,逻辑回归又叫对数几率回归
线性回归对数据的要求很严格,比如标签必须满足正态分布,特征之间的多重共线性需要消除等,而现实中很多真实情景的数据无法满足这些要求,因此线性回归在很多现实情境的应用效果有限。逻辑回归是由线性回归变化而来,因此它对数据也有一些要求。并且要很好的了解逻辑回归需要理解损失函数、正则化、梯度下降、海森矩阵(Hessian)等等概念,才能很好的对逻辑回归进行调优。
多重共线指的是自变量(解释变量)之间彼此相关的现象,即一个解释变量的变化引起另一个解释变量的变化。当线性回归出现严重共线性问题时,则会出现意想不到的问题。一般使用VIF值检测自变量是否有多重共线性,一般认为VIF>10(严格是5),代表模型存在严重的共线问题。
处理方法:1、相关性分析,计算相关系数,一般>0.7的可以移除其中一个自变量。2、逐步回归法。3、增加样本容量。4、使用岭回归。
一般离散变量的分类任务都用朴素贝叶斯、支持向量机、决策树、随机森林等。连续变量的分类任务会用到逻辑回归。
逻辑回归的优点:
- 逻辑回归对线性关系的拟合效果非常好。特征与标签之间的线性关系极强的数据,比如金融领域中的信用卡欺诈,评分卡制作,电商中的营销预测等等相关的数据,都是逻辑回归的强项。即使现在有了梯度提升树GDBT。
- 逻辑回归计算非常快。对于线性数据,逻辑回归的拟合和计算都非常快,计算效率优于SVM和随机森林。尤其是在大数据集训练中,区别很明显。
- 逻辑回归返回的分类结果不是固定的0或1,而是以小数形式呈现的类概率值。
- 逻辑回归的抗噪能力强。
逻辑回归的损失函数是用来衡量参数θ的模型拟合训练集时产生的信息损失的大小,并以此衡量参数θ的优劣。
损失函数:
很亮参数θ的优劣的评估指标,用来求解最优参数的工具
损失函数小,模型在训练集上表现优异,拟合充分,参数优秀
损失函数大,模型在训练集上表现差劲,拟合不足,参数槽糕
我们追求能够让损失函数最小化的参数组合
注意: 没有“求解参数”需求的模型没有损失函数,比如KNN,决策树等
逻辑回归的损失函数是由极大似然估计推导出来的,具体过程如下(权重w就是参数θ):
为了训练权重(w)和偏置量(b),需要定义一个代价函数。如下:
预测值表达式:
损失函数测量的是预测值和样本真实值之间的差异。计算单个样本。
代价函数测量的是整个数据集损失函数的平均值,目的是为了找到参数w和b,使得代价函数最小化。
损失函数推导过程:
class sklearn.linear_model.LogisticRegression (penalty='l2', dual=False, tol=0.0001,
C=1.0,fit_intercept=True, intercept_scaling=1,
class_weigt=None, random_state=None, solver='warn',
max_iter=100, multi_class='warn', verbose=0,
warm_start=False, n_jobs=None)
在L1正则化在逐渐加强的过程中,携带信息量小的、对模型贡献不大的特征的参数,会比携带大量信息的、对模型有巨大贡献的特征的参数更快地变成0,所以L1正则化本质是一个特征选择的过程,掌管了参数的“稀疏性”。L1正则化越强,参数向量中就越多的参数为0,参数就越稀疏,选出来的特征就越少,以此来防止过拟合。因此,如果特征量很大,数据维度很高,我们会倾向于使用L1正则化。由于L1正则化的这个性质,逻辑回归的特征选择可以由Embedded嵌入法来完成。
相对的,L2正则化在加强的过程中,会尽量让每个特征对模型都有一些小的贡献,但携带信息少,对模型贡献不大的特征的参数会非常接近于0。通常来说,如果我们的主要目的只是为了防止过拟合,选择L2正则化就足够了。但是如果选择L2正则化后还是过拟合,模型在未知数据集上的效果表现很差,就可以考虑L1正则化。
在实际操作中两种正则化方式,一般我们都默认使用l2,看模型效果,若是l1正则化效果更好则选用l1,此时可以看一下模型得到的参数结果,去掉参数结果是0对应的特征。
逻辑回归中的特征工程:
当特征数量很多时,我们首先考虑业务层面的选择,根据自己的业务能力或者做业务的相关人员了解特征对标签的影响。从而选择需要的特征。
一般情况下,逻辑回归和线性回归一样,是探索特征x和标签y的关系。而PCA和SVD降维会失去特征原来的性质,造成无法解释特征和标签的关系。因此一般不用PCA和SVD降维。
统计方法的特征选择可以考虑,但不是非常必要,由于逻辑回归不使用最小二乘法来求解,所以对数据的要求并没有线性回归那么严格,对数据的总体分布和方差没有要求,也不需要排除特征之间的共线性。对于线性回归,多重共线性对其结果影响较大,所以需要使用方差过滤或者方差膨胀因子VIF(variance inflation factor)来消除共线性,但是对于逻辑回归并不需要。
嵌入法embedded进行特征选择,由于L1正则化会使得部分特征对应的参数为0,因此L1正则化可以用来做特征选择,结合sklearn.feature_selection中的模块SelectFromModel,可以很容易筛选出让模型十分高效的特征。代码:# SelectFromModel有几个参数:estimator(评估器),threshold(阈值,用来做特征选择), LR_ = LR(solver='liblinear', C=0.9, random_state=420) X_embedded = SelectFromModel(LR_, norm_order=1).fit_transform(X, y)
使用嵌入法选取特征,怎么才能让模型的拟合效果更好,下面介绍两种调整方式:
- 调节SelectFromModel的参数threshold。嵌入法的阈值,表示删除所有参数的绝对值低于这个阈值的特征。逻辑回归中的特征系数coef_的大小和决策树中的feature_importances_以及降维算法中的可解释性方差explained_vairance_概念相似,都是衡量特征的重要程度和贡献度。
- 通过调节逻辑回归中的参数C。
- 系数累加法,在PCA中,我们通过绘制累积可解释方差贡献率曲线来选择超参数,在逻辑回归中我 们可以使用系数coef_来这样做,并且我们选择特征个数的逻辑也是类似的:找出曲线由锐利变平滑的转折点,转折点之前被累加的特征都是我们需要的,转折点之后的我们都不需要。不过这种方法相对比较麻烦,因为我们要先对特征系数进行从大到小的排序,还要确保我们知道排序后的每个系数对应的原始特征的位置,才能够正确找出那 些重要的特征。如果要使用这样的方法,不如直接使用嵌入法来得方便。
- 包装法。
梯度下降求解逻辑回归:
在多元函数上对各个自变量求∂偏导数,把求得的各个自变量的偏导数以向量的形式写出来,就是梯度。梯度是一个向量,它既有大小也有方向。其大小就是向量的模,方向就是损失函数J(θ)的值增加最快的方向。
其中最后公式的中的α为超参数,被称为步长。在计算过程中,它是梯度沿方向变化的比例,影响梯度下降的快慢。
sklearn中的逻辑回归是通过设置max_iter最大迭代次数来控制步长,max_iter越大,代表步长越小,模型迭代时间越长,反之,则代表步长设置很大,模型迭代时间很短。
3. solver & multi_class
solver参数是模型的求解器,sklearn中给了如下的几种:
multi_class参数是设置多分类的类型,有一对多(ovr)、多对多(multinomial)。
4. class_weight
class_weight参数是逻辑回归中的样本不均衡参数,在实际业务中很多数据是天生就不均衡的,比如银行的违约和不违约的人数。