逻辑回归算法梳理
逻辑回归算法梳理
1、逻辑回归与线性回归的联系与区别
逻辑回归与线性回归都属于广义线性回归模型,其区别与联系从以下几个方面比较:
-
分类与回归: 回归模型就是预测一个连续变量(如降水量,价格等)。在分类问题中,预测属于某类的概率,
可以看成回归问题。这可以说是使用回归算法的分类方法。 -
输出:
直接使用线性回归的输出作为概率是有问题的,因为其值有可能小于0或者大于1,这是不符合实际情况的,逻辑回归的输出正是[0,1]区间。 -
参数估计方法: 线性回归中使用的是最小化平方误差损失函数,对偏离真实值越远的数据惩罚越严重。这样-
做会有什么问题呢?假如使用线性回归对{0,1}二分类问题做预测,则一个真值为1的样本,其预测值为50,那么将会对其产生很大的惩罚,这也和实际情况不符合,更大的预测值说明为1的可能性越大,而不应该惩罚的越严重。
逻辑回归使用对数似然函数进行参数估计,使用交叉熵作为损失函数,对预测错误的惩罚是随着输出的增大,逐渐逼近一个常数,这就不存在上述问题了1
也正是因为使用的参数估计的方法不同,线性回归模型更容易受到异常值(outlier)的影响,有可能需要不断变换阈值(threshold). -
参数解释: 线性回归中,独立变量的系数解释十分明了,就是保持其他变量不变时,改变单个变量因变量的改变量。
逻辑回归中,自变量系数的解释就要视情况而定了,要看选用的概率分布是什么,如二项式分布,泊松分布等
2、 逻辑回归的原理
逻辑回归也被称为对数几率回归,算法名虽然叫做逻辑回归,但是该算法是分类算法,个人认为这是因为逻辑回归用了和回归类似的方法来解决了分类问题。
逻辑回归模型是一种分类模型,用条件概率分布的形式表示 P(Y|X)P(Y|X),这里随机变量 X 取值为 n 维实数向量,例如x=(x(1),x(2),…,x(n))x=(x(1),x(2),…,x(n)),Y 取值为 0 或 1。即:
假设有一个二分类问题,输出为y∈{0,1},二线性回归模型z=wTx+b是个实数值,我们希望有一个理想的阶跃函数来帮我什么实现z值到0/1值的转化,于是找到了Sigmoid函数来代替:
有了 Sigmoid 函数之后,由于其值取值范围在[0,1]。就可以将其视为类 1 的后验概率估计 p(y=1|X)p(y=1|X)。说白了,就是如果有了一个测试点 x,那么就可以用Sigmoid函数算出来的结果当作该点 x 属于类别 1 的概率大小。
于是,非常自然地,我们把 Sigmoid 函数计算得到的值大于等于0.5的归为类别1,小于0.5的归为类别0:
3、逻辑回归损失函数推导及优化
参考地址
假设函数
用于二分类
总结:如果我们取对数和负值,可以代表对应的成本函数。和似然函数相反的方向。(log只是利于计算)。
统一公式
我们找到联合概率公式:
最大似然
最大似然就是最大化的所有样本的概率公式:
对数-最大似然
对数最大似然就是最大化的所有样本的概率公式:
我们的目标是最大化似然函数。 如果转化为损失函数,那就是最小化。
损失函数J(loss function)
参数迭代公式
解释:
- 参数第j个分量的更新,和每个样例都有关系。
- 如果m取全部,则是用所有数据来更新分量j
- m=1则是用一个实例来更新参数,也就是随机梯度下降。
- 更新的量,与速率、当前实例的j分量、误差值(假设-当前)共同决定。
总结
一般的学习模型的三个重要步骤:
- 寻找h函数(即预测函数);比如逻辑回归的 f(w,b);线性之后多了一个激活。
- 构造J函数(损失函数);不同的损失函数,代表了不同的优化方向。比如:逻辑回归如果用最小方差来作为评价函数,则容易导致局部最优。
- 想办法使得J函数最小并求得回归参数(θ);各种数值优化方法,随机梯度下降;牛顿法等。
4、 正则化与模型评估指标
正则化
评估指标
5、逻辑回归的优缺点
Logistic 回归是一种被人们广泛使用的算法,因为它非常高效,不需要太大的计算量,又通俗易懂,不需要缩放输入特征,不需要任何调整,且很容易调整,并且输出校准好的预测概率。
与线性回归一样,当你去掉与输出变量无关的属性以及相似度高的属性时,logistic 回归效果确实会更好。因此特征处理在 Logistic 和线性回归的性能方面起着重要的作用。
Logistic 回归的另一个优点是它非常容易实现,且训练起来很高效。在研究中,我通常以 Logistic 回归模型作为基准,再尝试使用更复杂的算法。
由于其简单且可快速实现的原因,Logistic 回归也是一个很好的基准,你可以用它来衡量其他更复杂的算法的性能。
它的一个缺点就是我们不能用 logistic 回归来解决非线性问题,因为它的决策面是线性的。
Logistic 回归并非最强大的算法之一,它可以很容易地被更为复杂的算法所超越。另一个缺点是它高度依赖正确的数据表示。
这意味着逻辑回归在你已经确定了所有重要的自变量之前还不会成为一个有用的工具。由于其结果是离散的,Logistic 回归只能预测分类结果。它同时也以其容易过拟合而闻名。
6、样本不均衡问题解决办法
1、人为将样本变为均衡数据。
上采样:重复采样样本量少的部分,以数据量多的一方的样本数量为标准,把样本数量较少的类的样本数量生成和样本数量多的一方相同。
下采样:减少采样样本量多的部分,以数据量少的一方的样本数量为标准。
2、调节模型参数(class_weigh,sample_weight,这些参数不是对样本进行上采样下采样等处理,而是在损失函数上对不同的样本加上权重)
(A)逻辑回归中的参数class_weigh;
在逻辑回归中,参数class_weight默认None,此模式表示假设数据集中的所有标签是均衡的,即自动认为标签的比例是1:1。所以当样本不均衡的时候,我们可以使用形如{标签的值1:权重1,标签的值2:权重2}的字典来输入真实的样本标签比例(例如{“违约”:10,“未违约”:1}),来提高违约样本在损失函数中的权重。
或者使用”balanced“模式,sklearn内部原理:直接使用n_samples/(n_classes * np.bincount(y)),即样本总数/(类别数量*y0出现频率)作为权重,可以比较好地修正我们的样本不均衡情况。
(B)在SVM中使用SVC类的参数class_weigh和接口fit中可以设定的sample_weight:
SVC类的参数class_weigh:
对于class_weight,输入形如{“标签的值1”:权重1,“标签的值2”:权重2}的字典,则不同类别的C将会自动被设为不同的值:
sklearn内部原理:标签的值为1的C:权重1 * C,标签的值为2的C:权重2*C
或者,可以使用“balanced”模式,sklearn内部原理:这个模式使用y的值自动调整与输入数据中的类频率成反比的权重为 n_samples/(n_classes * np.bincount(y)
fit接口参数sample_weight:
参数形式:数组,结构为 (n_samples, ),则模型参数C则变为,每个样本的权重 * C值,这样迫使分类器强调权重更大的样本。通常,较大的权重加在少数类的样本上,以迫使模型向着少数类的方向建模
7. sklearn参数
Logistics Regression参数名称 | 含义 |
---|---|
函数调用形式– | LogisticRegression(penalty=‘l2’,dual=False,tol=1e-4,C=1.0,fit_intercept=True,intercept_scaling=1,class_weight=None,random_state=None,solver=‘liblinear’,max_iter=100,multi_class=‘ovr’,verbose=0,warm_start=False, n_jobs=1)– |
penalty | 字符串型,’l1’ or ‘l2’,默认:’l2’;正则化类型。 |
dual | 布尔型,默认:False。当样本数>特征数时,令dual=False;用于liblinear解决器中L2正则化。 |
tol | 浮点型,默认:1e-4;迭代终止判断的误差范围。 |
C | 浮点型,默认:1.0;其值等于正则化强度的倒数,为正的浮点数。数值越小表示正则化越强。 |
fit_intercept | 布尔型,默认:True;指定是否应该向决策函数添加常量(即偏差或截距)。 |
intercept_scaling | 浮点型,默认为1;仅仅当solver是”liblinear”时有用。 |
class_weight | 默认为None;与“{class_label: weight}”形式中的类相关联的权重。如果不给,则所有的类的权重都应该是1。 |
random_state | 整型,默认None;当“solver”==“sag”或“liblinear”时使用。在变换数据时使用的伪随机数生成器的种子。如果是整数, random_state为随机数生成器使用的种子;若为RandomState实例,则random_state为随机数生成器;如果没有,随机数生成器就是’ np.random '使用的RandomState实例。 |
solver | {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’},默认: ‘liblinear’;用于优化问题的算法。对于小数据集来说,“liblinear”是个不错的选择,而“sag”和’saga’对于大型数据集会更快。对于多类问题,只有’newton-cg’, ‘sag’, 'saga’和’lbfgs’可以处理多项损失;“liblinear”仅限于“one-versus-rest”分类。 |
max_iter | 最大迭代次数,整型,默认是100; |
multi_class | 字符串型,{ovr’, ‘multinomial’},默认:‘ovr’;如果选择的选项是“ovr”,那么一个二进制问题适合于每个标签,否则损失最小化就是整个概率分布的多项式损失。对liblinear solver无效。 |
verbose | 整型,默认是0;对于liblinear和lbfgs solver,verbose可以设为任意正数。 |
warm_start | 布尔型,默认为False;当设置为True时,重用前一个调用的解决方案以适合初始化。否则,只擦除前一个解决方案。对liblinear解码器无效。 |