关于机器学习的几件小事(三)——逻辑回归
逻辑回归是在线性数据集上表现得非常丧心病狂的分类算法。在金融、银行(评分卡、信用卡反欺诈)等领域发挥着举足轻重的作用。
原理
\(h_{\theta}(x)=\theta^{T}x\)
\(g(z)=\dfrac{1}{1+e^{-z}}\)
\(g(\theta^{T}x)=y(x)=\dfrac{1}{1+e^{-\theta^{T}x}}\)
\(ln(\dfrac{y(x)}{1-y(x)})=\theta^{T}x=z\)
逻辑回归在线性回归的基础上在做对数几率变换,最终映射成0到1之间的概率。在计算速度方面逻辑回归的表现也是比 svm,决策树等快很多。逻辑回归在小数据集上分类的表现常常比树模型好,但随机数据集的增长树模型可以越来越深,最后会超过逻辑回归。g(z) 函数被称为 sigmoid,是逻辑回归的变换函数。图像如下。
逻辑回归的损失函数(交叉熵代价函数):
\(J(\theta)=-\dfrac{1}{m}\sum_{i=1}^{m}[y^{(i)}log(h_\theta(x^{(i)})) + (1-y^{(i)})log(1-h_{\theta}(x^{(i)})]\)
逻辑回归和线性回归是一个天生很容易欠拟合的算法(树模型天生容易过拟合)。有时候也要防止过拟合…
逻辑回归通过正则化(添加了惩罚项)防止过拟合:
L1 范式: 向量中各个元素的绝对值之和
L2 范式: 平方和在开平方
\(J(\theta)_{L1}=CJ(\theta)+\sum _{j=1}^{n}|\theta _{j}|\)
\(J(\theta)_{L1}=CJ(\theta)+ \sqrt {\sum _{j=1} ^{n} (\theta _{j}) ^ {2}}\)
重要参数详解
参数 | 含义 |
---|---|
penalty | 正则化参数,默认 l2。可选输入 l1, l2。选择 l1 正则化,参数 solver 仅能使用求解方式 liblinear或saga。L1 正则化可以把参数压缩到 0,L2 正则化可以把参数压缩到很小,但到不了零。L1 正则化掌控模型的稀疏性,L2 正则化掌控模型的稠密性 。如果数据的维度很高可以考虑 L1 正则化。先使用 l2 正则化试一试,如果还是表现过拟合,就采用 l1 正则化 |
C | 正则化强度的倒数,必须是大于零的浮点数,默认 1.0。即默认正则项与损失函数的比值是 1:1。C越小,损失函数越小,模型对损失函数的惩罚越重,正则化效力越强,参数\(\theta\)会逐渐压缩的越来越小。np.linspace(0.05, 1, 21)
|
max_iter | 使用 max_iter 代替梯度下降中的步长。一般情况下使用学习曲线寻找最佳的步长。先设置个几百,试一下。 |
multi_class | 这个参数让逻辑回归可以处理多分类的问题。默认 \’ovr\’:分类问题是二分类,使用一对多的形式处理二分类。\’multinomial\’:表示处理多分类问题,solver为\’liblinear\’时不可用。\’auto\’:根据情况而定,如果数据时二分类,或者 solver 是 libnear,auto 到 ovr。否则 multinomial。直接 auto 就完事啊。注意:多分类的情境下,优先选择 multinomial |
solver | 求解器。liblinear、lbfgs、sag、saga。sag 随机梯度下降(L1),saga 随机梯度下降的改进版(L1,L2)。sag,saga 在大型数据集上计算的速度相当的快(数据标准化了速度还要快,标准化对梯度下降算法的影响,你知道我的意思吧) |
class_weight | 类别权重,解决不均衡分类的情况 |
逻辑回归特征工程
- 逻辑回归基于业务来看一般是需要降维的。输入很多特征,最后用于判断的特征一般只有 5~8 个。
- PCA 主成分分析和 SVD 降维是不可解释的,而且不能保持特征的全貌。在逻辑回归中最好不要使用。
- 统计方法:方差,卡方,互信息都是可以的
- 嵌入法 embedded
"""
嵌入法
"""
from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectFromModel
import numpy as np
import matplotlib.pyplot as plt
datas = load_breast_cancer()
x = datas.data
y = datas.target
# 使用 L1 范式 SelectiFromModel,在调整正则化参数 C
fullx = []
new_x = []
C = np.arange(0.01, 10.01, 0.5)
for i in C:
log = LR(solver=\'liblinear\', C=i, random_state=0)
fullx.append(cross_val_score(log, x, y).mean())
# 通过 L1 范式的方法进行特征选择 norm_order
# x 经过 SelectFromModel 操作过后特征将减小,这是一个降维操作
# 使用嵌入法降维,可以筛选出几个相对重要的特征
x_embedded = SelectFromModel(log, norm_order=1).fit_transform(x, y)
print(x_embedded.shape)
new_x.append(cross_val_score(log, x_embedded, y).mean())
print(max(new_x), C[fsx.index(max(new_x))])
plt.figure(figsize=(20, 5))
plt.plot(C, fullx, label=\'Full\')
plt.plot(C, new_x, label=\'Feature Selection\')
plt.xticks(C)
plt.legend()
plt.show()
观察上图可以发现,我们在使用嵌入法降维后,模型在某些 C 值依然有比较好的表现效果。SelectFromModel(model, threshold=coef_/feature_importance) 还可以使用 coef/feature_impotance(线性回归有 coef,决策树有 feature_impotance) 进行过滤,当值小于阈值 threshold 时特征将被舍去。
逻辑回归中处理样本不均衡问题
逻辑回归中处理样本不均衡问题通常的做法是:上采样。直接去重复数据集中少数类样本的个数,强行平衡。
逻辑回归应用:评分卡
信息量(IV information value):\(IV=\sum_{i=1}^{N}(\text{good%}-\text{bad%)}*WOE_{i}\)
证据权重(WOE weight of evidence):\(WOE_{i}=ln(\dfrac{\text{good%}}{\text{bad%}})\)