什么是逻辑回归
逻辑回归也叫对数几率回归,在西瓜书中有介绍,吃瓜的时候也学过,可惜呀,脑子不好使,全忘了。重新学一下吧。。。。
在理解对数几率回归之前需要先理解线性回归。线性回归的任务,就是构造一个预测函数 来映射输入的特征矩阵x和标签值y的线性关系,具体以公式体现如下:
z
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
.
.
.
+
θ
n
x
n
z = \theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n
z=θ0+θ1x1+θ2x2+...+θnxn
写成矩阵形式为:
构造预测函数的核心就是找的矩阵
θ
T
\theta^T
θT,最小二乘法就是用来求解线性回归的数学方法。
通过线性回归得到的预测结果是连续的实数,而分类任务的结果通常是间断的具体的表示,因此线性回归能否用来进行分类任务呢?答案是肯定的,这要借助一个函数将线性的结果映射到分类的结果,对于常见的二分类任务,可以映射到0和1,则这个函数可以是阶跃函数,也可以是Sigmoid函数,常用的是Sigmoid函数,Sigmoid函数的形势如下:
可以发现,当线性回归结果越大时,越接近于1,越小则越接近于0。
将
z
=
θ
T
x
z=\theta^Tx
z=θTx代入就得到了简单的二分类逻辑回归:
g
(
z
)
=
y
(
x
)
1
1
+
e
−
θ
T
x
g(z)=y(x)\frac{1}{1+e^{-\theta^Tx}}
g(z)=y(x)1+e−θTx1
y
(
x
)
y(x)
y(x)通常就是分类任务的标签。对于这个
y
(
x
)
y(x)
y(x),可以发现:
因此,逻辑回归的任务就是求解
θ
T
\theta^T
θT来使结果拟合样本的标签。
sklearn中的逻辑回归
逻辑回归的类 | 说明 |
---|---|
linear_model.LogisticRegression | 逻辑回归分类器(又叫logit回归,最大熵分类器) |
linear_model.LogisticRegressionCV | 带交叉验证的逻辑回归分类器 |
linear_model.logistic_regression_path | 计算Logistic回归模型以获得正则化参数的列表 |
linear_model.SGDClassifier | 利用梯度下降求解的线性分类器(SVM,逻辑回归等等) |
linear_model.SGDRegressor | 利用梯度下降最小化正则化后的损失函数的线性回归模型 |
metrics.log_loss | 对数损失,又称逻辑损失或交叉熵损失 |
metrics.confusion_matrix | 混淆矩阵,模型评估指标之一 |
metrics.roc_auc_score | ROC曲线,模型评估指标之一 |
metrics.accuracy_score | 精确性,模型评估指标之一 |
损失函数
损失函数是用来衡量参数
θ
\theta
θ的优劣,判断训练得到的模型在拟合样本时的信息损失,损失函数的具体推导在吃瓜教程里写了,这里就写一下最终结果吧:
重要参数penalty和C
正则化
正则化是为了防止过拟合的过程,常用的有L1正则化和L2正则化两种选项,就是在损失函数上加上参数向量的L1和L2范式倍数来实现。这个增加的范式,被称为“正则项”,也被称为"惩罚项"。损失函数改变,基于损失函数的最优化来求解的参数取值必然改变,我们以此来调节模型拟合的程度。其中L1范式表现为参数向量中的每个参数的绝对值之和,L2范数表现为参数向量中的每个参数的平方和的开方值。
在sklearn中通过参数C和penalty来控制C和正则项
参数 | 说明 |
---|---|
penalty | 可以输入"l1"或"l2"来指定使用哪一种正则化方式,不填写默认"l2"。注意,若选择"l1"正则化,参数solver仅能够使用求解方式”liblinear"和"saga“,若使用“l2”正则化,参数solver中所有的求解方式都可以使用。 |
C | 正则化强度的倒数,必须是一个大于0的浮点数,不填写默认1.0,即默认正则项与损失函数的比值是1:1。C越小,损失函数会越小,模型对损失函数的惩罚越重,正则化的效力越强,参数会逐渐被压缩得越来越小。 |
两种正则化的效果并不相同,在正则化强度增大(即C减小)时,参数都会减小,但L1正则化会将参数压缩到0,而L2正则化是将参数尽量小,但不会为0。
在L1正则化逐渐加强的过程中,携带信息量小的、对模型贡献不大的特征的参数,会比携带信息量大的、对模型贡献大的特征的参数更快地变成0,所以L1正则化本质是一个特征选择的过程,掌管了参数的“稀疏性”。L1正则化越强,参数中就越多为0,参数矩阵就越稀疏,选出来的特征就少,以此来防止过拟合。因此,如果数据量很大,特征很多,会倾向于使用L1正则化。
相对的,L2正则化在加强的过程中,会尽量让每个特征对模型都有一些小的贡献,但携带信息少,对模型贡献不大的特征的参数会非常接近于0。通常来说,如果我们的主要目的只是为了防止过拟合,选择L2正则化就足够了。但是如果选择L2正则化后还是过拟合,模型在未知数据集上的效果表现很差,就可以考虑L1正则化。
逻辑回归中的特征工程
前边学习过PCA和SVD,但是这两种方法进行的是降维的,然而降维后的数据特征很难解释具体的意义,这在逻辑回归的实际应用中存在缺陷,因此通常不适用PCA进行降维处理。所以可以考虑特征选择的方法,而其中嵌入法就是高效的选择方法,这里就写一下嵌入法。
由于L1正则化会使得部分特征对应的参数为0,因此L1正则化可以用来做特征选择,结合嵌入法的模块SelectFromModel,我们可以很容易就筛选出让模型十分高效的特征。此外,可以设置SelectFromModel的参数threshold,即阈值,删除特征系数小于阈值的数。这里特征的参数和随机森林中的feature_importance等类似,可以作为阈值来使用,反应了特征的重要性等方面的特性。
如果调整threshold不好用,也可以调整logisticregression中的C(正则化强度)来进行选择特征。
此外,可以用属性coef_获取训练后的特征的系数。
from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_breast_cancer
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
data = load_breast_cancer()
X = data.data
y = data.target
data.data.shape
lrl1 = LR(penalty="l1",solver="liblinear",C=0.5,max_iter=1000)
lrl2 = LR(penalty="l2",solver="liblinear",C=0.5,max_iter=1000)
#逻辑回归的重要属性coef_,查看每个特征所对应的参数
lrl1 = lrl1.fit(X,y)
lrl1.coef_
(lrl1.coef_ != 0).sum(axis=1)
lrl2 = lrl2.fit(X)
lrl2.coef_
梯度下降以及参数max_iter
逻辑回归的数学目的是求解能够让模型最优化,拟合程度最好的参数 的值,即求解能够让损失函数 最小化的值。对于二元逻辑回归来说,有多种方法可以用来求解参数 ,最常见的有梯度下降法(Gradient Descent),坐标下降法(Coordinate Descent),牛顿法(Newton-Raphson method)等。
梯度下降法
梯度就是函数对所有自变量求偏导组成的向量,向量的大小记为d,在几何上,梯度的方向表示了函数增加最快的方向。
对于逻辑回归而言,求解的是损失函数的最小值,因此需要将损失函数对参数求偏导构成向量,每次让参数减去向量大小的
α
\alpha
α倍,即:
这里的
α
\alpha
α叫做步长,步长越大,模型迭代的越快,步长越小模型迭代的次数越多。
在sklearn的LogisticRegression中max_iter控制着模型迭代的次数。
二元回归与多元回归:重要参数solver & multi_class
对于多分类的任务,逻辑回归也可以完成。其中主要的方法有两种:一种是将一类表示为1,其余的多类表示为0,这种方法被称为"一对多"(One-vs-rest),简称OvR,在sklearn中表示为“ovr"。另一种是将多个类表示为1,其余的多个类表示为0,这种方法称为“多对多”(Many-vs-Many),在sklearn中表示为““Multinominal”,由参数multi_class决定两种方法使用哪一种。
输入"ovr”, “multinomial”, “auto"来告知模型,我们要处理的分类问题的类型。默认是"ovr”。
输入"auto",模型会根据solver的取值来决定,solver是’liblinear’,auto会选择’ovr‘,否则选择’multinominal’。
solver控制的求解器参数如下:
样本不平衡参数class_weight
有时候样本的特征比例悬殊,甚至会出现99:1的情况,在这种情况下即使模型不考虑比例是1的样本,训练出来的结果也有99%的准确率,因此,需要平衡样本。在sklearn中,class_weight可以起到平衡样本的目的,其默认参数是None,可以将样本比例调整为1:1;参数是balanced时,可以自动调整样本的权重。在现实中也常用采样法,认为增加小比例的样本的数量。可以进行上采样(增加少数类的样本),比如SMOTE,或者下采样(减少多数类的样本)。