一、LR
1. 逻辑回归与线性回归的区别
- 引入sigmoid函数映射,使样本映射到[0,1]之间的数值,从而来处理分类问题。是广义线性模型,本质上还是线性回归。
- 逻辑回归是假设变量服从伯努利分布,线性回归假设变量服从高斯分布。
- 逻辑回归是用最大似然法去计算预测函数中的最优参数值,而线性回归是用最小二乘法去对自变量因变量关系进行拟合。
为什么用最大似然函数做估计?
最小二乘法的误差符合正态分布,而逻辑回归的误差符合的是二项分布,所以不能用最小二乘法来作为损失函数。
最小二乘法做损失函数为非凸函数,求解困难且容易陷入局部最优,而似然函数为凸函数可以得到局部最优解。
为什么用sigmoid函数?
- 映射为0,1 反映属于二分类中类的概率
- 转化为对数几率函数:对数几率函数是任意阶可导的凸函数,有许多数值优化算法都可以求出最优解
- 逻辑回归中因变量 y服从伯努利分布,而伯努利分布的参数 p 的含义就是样例属于 y=1的概率
2. 逻辑回归模型
最理想的是采用阶跃函数,但是由于其不可微,难以求最优解,所以采用对数几率函数。
(1)logistic变换:
我们将 y 视为 x 为正例的概率,则 1-y 为 x 为其反例的概率。两者的比值称为几率(odds),指该事件发生与不发生的概率比值,若事件发生的概率为 p。
则对数几率:
其他写法:
(2)由h估计y属于0-1的概率:
合并,服从伯努利分布:
(3)通过极大化似然函数的方法,运用梯度下降来求解参数
似然函数:
对数似然函数:
然后求导:
3. 回归模型结果解读
(1)回归系数P的检验是t检验,当P<α值,即回归系数显著,拒绝原假设。 回归模型检验是检验模型是否合适,通过F检验,当F检验P<α,则模型显著,即反映的总体回归。
(2)特征系数的绝对值越大,对分类效果的影响越显著,但不能表示系数更大的特征重要性更高。因为改变变量的尺度就会改变系数的绝对值,而且如果特征是线性相关的,则系数可以从一个特征转移到另一个特征,特征间相关性越高,用系数解释变量的重要性就越不可靠。
4. 做评分卡中为什么要进行WOE化?
- 更好的解释性,变量离散化之后可将每个箱体映射到woe值,而不是通常做one-hot转换。
- woe化之后可以计算每个变量的IV值,可用来筛选变量。
- 对离散型变量,woe可以观察各个level间的跳转对odds的提升是否呈线性。
- 对连续型变量,woe和IV值为分箱的合理性提供了一定的依据,也可分析变量在业务上的可解释性。
- 用woe编码可以处理缺失值问题。
5. sklearn中的LR使用
sklearn.linear_model.LogisticRegression(penalty='l2', dual=False,
tol=0.0001, 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)
(1)正则化选择参数:penalty 其原理就是对参数进行约束
l1和l2分别为L1正则化和L2正则化;默认为l2
两种情况调整:
主要的目的只是为了解决过拟合,一般penalty选择L2正则化就够了。
- 如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化
- 如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化
penalty参数的选择会影响我们损失函数优化算法的选择。即参数solver的选择,如果是L2正则化,那么4种可选的算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以选择。但是如果penalty是L1正则化的话,就只能选择‘liblinear’了,L1正则化没有连续导数。
(2)优化算法选择参数:solver
- liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数
- lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数
- newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数
- sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候,样本少不能用
(3)tol
: 残差收敛条件,默认是0.0001,也就是只需要收敛的时候两步只差<0.0001就停止,可以设置更大或更小。(逻辑回归模型的损失函数是残差平方和)
(4)分类方式选择参数:multi_class
(multi_class='multinomial', solver='newton-cg')
multi_class参数决定了分类方式的选择,有 ovr和multinomial两个值可以选择,默认是 ovr。
ovr即one-vs-rest(OvR),而multinomial指的是OVO。如果是二元逻辑回归,ovr和multinomial并没有任何区别,区别主要在多元逻辑回归上。
(5)类型权重参数: class_weight
用于标示分类模型中各种类型的权重,可以不输入,即不考虑权重,或者说所有类型的权重一样。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者我们自己输入各个类型的权重
比如对于0,1的二元模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%
如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高
使用场景:
- 误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重。
- 样本高度失衡。如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。这时,我们可以选择balanced,让类库自动提高非法用户样本的权重。
(6)样本权重参数: sample_weight
样本不平衡,导致样本不是总体样本的无偏估计,从而可能导致模型预测能力下降。遇到这种情况,可以通过调节样本权重来尝试解决这个问题。样本或类别的权重在训练模型最终通过损失函数实现
sample_weight:array-like, shape (n_samples,)optional
Arrayof weights that are assigned to individual samples. If not provided, then eachsample is given unit weight.
调节样本权重的方法有两种,第一种是在class_weight使用balanced;第二种是在调用fit函数时,通过sample_weight来自己调节每个样本权重。
在scikit-learn做逻辑回归时,如果上面两种方法都用到了,那么样本的真正权重是class_weight*sample_weight
(7)fit_intercept: 默认:True 指定是否应将常量(a.k.a. bias或intercept)添加到决策函数中。
(8)C
: 正则化系数,正则化强度的导数,必须是一个正数,值越小,正则化强度越大,即防止过拟合的程度更大
(9)warm_start
: 是否使用上次的模型结果作为初始化,默认是False,表示不使用
(11)n_jobs
: 并行运算数量(核的数量),默认为1,如果设置为-1,则表示将电脑的cpu全部用上。
6. 过拟合解决方法
(1)L1 L2 正则化
逻辑回归的损失函数:
在此损失函数可以取为最大似然估计函数的相反数,其次除以m这一因子并不改变最终求导极值结果,通过除以m可以得到平均损失值,避免样本数量对于损失值的影响
L1:
L1正则化使得权重 w 往0靠,使网络中的权重尽可能为0,产生稀疏权重矩阵, 也就相当于减小了网络复杂度,防止过拟合。