1. 逻辑回归与线性回归的联系与区别
其实并没有本质上的区别,就是逻辑回归多了一个Sigmoid函数,使样本能映射到[0,1]之间的数值,用来做分类问题。
简单的例子就是可以使用吴恩达的课程中的例子来解释,线性回归用来预测房价,能找到一个公式来尽量拟合房价和影响房价因素之间的关系,最后得到的公式能准确的用来预测房价。在对参数不断调优以找到一组最拟合数据的参数来构成一个最好的模型,就是线性回归。逻辑回归通过Sigmoid函数将任何连续的数值映射到[0,1]之间。
线性回归用来预测,逻辑回归用来分类。
线性回归是拟合函数,逻辑回归是预测函数
线性回归的参数计算方法是最小二乘法,逻辑回归的参数计算方法是梯度下降。
2. 逻辑回归的原理
3. 逻辑回归损失函数推导及优化
逻辑回归模型预估的是样本属于某个分类的概率,其损失函数(Cost Function)可以像线型回归那样,以均方差来表示;也可以用对数、概率等方法。损失函数本质上是衡量”模型预估值“到“实际值”的距离,选取好的“距离”单位,可以让模型更加准确。
- 均方差距离
用均方差作为损失函数,当模型完全预估错误时(y=1, p=0; 或y=0, p=1),损失是1。预估正确时,损失是0。错误值离正确值的“距离”相对较小,区分度不大。
另外,上面的损失函数相对θ
并非是凸函数,而是有很多极小值(local minimum)的函数。因此,很多凸优化的算法(如梯度下降)无法收敛到全局最优点。 - log距离
均方差作为LR模型的距离衡量标准,最“预估错误”的惩罚太过柔和。因此,最后训练出来的模型会出现较多的“极端”预估错误情况。另外,均方差损失函数的非凸性也限制了其使用价值。
log距离作为损失函数的公式如下:
式(2)与式(1)的区别如下图所示:
- 概率距离
LR模型预估的是概率,自然的,损失函数可以用联合概率分布来衡量。
比较式(2)和式(3)可知:
由于log函数为单调递增函数,log距离和概率距离本质上是一样的,训练得到的结果也应该一致。
4.正则化与模型评估指标
正则化的思想是,\theta前面的参数会使得函数变得很大,如果想要最小化整个函数的话,那么正则化部分的\theta必须要小才能满足要求(可以将\theta压缩到接近0)。一般正则化不对\theta增加惩罚项,只对1到n,只是约定俗成的,就算对0惩罚也没有什么影响。一般我们不知道是哪个参数导致过拟合,所以我们惩罚所有的参数。
5.逻辑回归的优缺点
Logistic 回归是一种被人们广泛使用的算法,因为它非常高效,不需要太大的计算量,又通俗易懂,不需要缩放输入特征,不需要任何调整,且很容易调整,并且输出校准好的预测概率。
与线性回归一样,当你去掉与输出变量无关的属性以及相似度高的属性时,logistic 回归效果确实会更好。因此特征处理在 Logistic 和线性回归的性能方面起着重要的作用。
Logistic 回归的另一个优点是它非常容易实现,且训练起来很高效。在研究中,我通常以 Logistic 回归模型作为基准,再尝试使用更复杂的算法。
由于其简单且可快速实现的原因,Logistic 回归也是一个很好的基准,你可以用它来衡量其他更复杂的算法的性能。
它的一个缺点就是我们不能用 logistic 回归来解决非线性问题,因为它的决策面是线性的。我们来看看下面的例子,两个类各有俩实例。
显然,我们不可能在不出错的情况下划出一条直线来区分这两个类。使用简单的决策树是个更好的选择。
Logistic 回归并非最强大的算法之一,它可以很容易地被更为复杂的算法所超越。另一个缺点是它高度依赖正确的数据表示。
这意味着逻辑回归在你已经确定了所有重要的自变量之前还不会成为一个有用的工具。由于其结果是离散的,Logistic 回归只能预测分类结果。它同时也以其容易过拟合而闻名。
6、样本不均衡问题解决办法
(1)扩大数据集
(2)尝试增加其他评价指标F1/Recall/Kappa/ROC
(3)重采样
(4)其他分类模型
(5)增加惩罚项
7. sklearn参数
class sklearn.linear_model.LogisticRegression(
penalty=’l2’, 参数类型:str,可选:‘l1’ or ‘l2’, 默认: ‘l2’。该参数用于确定惩罚项的范数
dual=False, 参数类型:bool,默认:False。双重或原始公式。使用liblinear优化器,双重公式仅实现l2惩罚。
tol=0.0001, 参数类型:float,默认:e-4。停止优化的错误率
C=1.0, 参数类型:float,默认;1。正则化强度的导数,值越小强度越大。
fit_intercept=True, 参数类型:bool,默认:True。确定是否在目标函数中加入偏置。
intercept_scaling=1, 参数类型:float,默认:1。仅在使用“liblinear”且self.fit_intercept设置为True时有用。
class_weight=None, 参数类型:dict,默认:None。根据字典为每一类给予权重,默认都是1.
random_state=None, 参数类型:int,默认:None。在打乱数据时,选用的随机种子。
solver='warn', 参数类型:str,可选:{'newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'}, 默认:liblinear。选用的优化器。
max_iter=100, 参数类型:int,默认:100。迭代次数。
multi_class='warn', 参数类型:str,可选:{'ovr', 'multinomial', 'auto'},默认:ovr。如果选择的选项是'ovr',那么二进制问题适合每个标签。对于“多项式”,最小化的损失是整个概率分布中的多项式损失拟合,即使数据是二进制的。当solver ='liblinear'时,'multinomial'不可用。如果数据是二进制的,或者如果solver ='liblinear','auto'选择'ovr',否则选择'multinomial'。
verbose=0, 参数类型:int,默认:0。对于liblinear和lbfgs求解器,将详细设置为任何正数以表示详细程度。
warm_start=False, 参数类型:bool,默认:False。是否使用之前的优化器继续优化。
n_jobs=None,参数类型:bool,默认:None。是否多线程
)