LogisticRegression
1.建立模型
假设样本是(x, y), y 是0或1,表示负类或者正类。x 是m维样本的特征向量,那么这个样本属于正类,也就是y = 1的概率可以通过下面逻辑函数来表示:
p ( y = 1 ∣ x ; θ ) = σ ( θ T x ) = 1 / ( 1 + e x p ( θ T x ) ) p( y = 1 | x;θ) = σ(θ^Tx)=1/(1+exp(θ^Tx)) p(y=1∣x;θ)=σ(θTx)=1/(1+exp(θTx))
上述公式中σ是sigmoid函数,y是关系变量,与多个自变量有关(x),把这些自变量因素表示为:x1, x2,…, xm。θ是模型参数(权值),这些对应 x1, x2,…, xm的权值叫做回归系数,表示为:θ1, θ2,…, θm。x 的加权和就是y 的总得分。
因此上面的逻辑回归就是一个线性分类模型,它与线性回归不同点在于:将线性回归输出的数值(范围不定)压缩到0和1之间,这样的输出值才能更适合表达“可能性“,(是否可以理解为:逻辑回归就是被logistic函数归一化后的线性回归?)
至此ML模型(LR)已经选好,只是模型的参数 θ 还未确定,下一步就需要利用样本数据集来训练模型求解 θ 的最优解。接下来需要建立代价函数,具体方法就是通过引入最大似然函数的方法确定logistic regression 的损失函数。假设有n个独立的训练样本 {(x1, y1), (x2, y2), (x3, y3), …, (xn, yn), y = 0 or 1}。每个样本(xi, yi)的概率是:
P ( y i , x i ) = P ( y i = 1 ∣ x i ) y i ∗ ( 1 − P ( y i = 1 ∣ x i ) ) 1 − y i P(yi, xi) = P(yi = 1 | xi)^{yi}*(1 - P(yi = 1 | xi))^{1-yi} P(yi,xi)=P(yi=1∣xi)yi∗(1−P(yi=1∣xi))1−yi
上面的公式实际是样本(xi, yi)属于正类或者负类样本两种情况的统一,当 y i = 1 yi =1 yi=1时,公式等号右边只剩下第一项;当 y i = 0 yi =0 yi=0时,等式右边只剩下第二项。因此不管 y i yi yi 等于0或者1,上面公知表示的都是每个样本出现的概率,引入最大似然函数求模型中最大的回归系数θ,这个最大似然函数就是代价函数了, 因此n个独立样本出现的似然函数为:
L ( θ ) = ∏ P ( y i = 1 ∣ x i ) y i ∗ ( 1 − P ( y i = 1 ∣ x i ) ) 1 − y i L(θ) = ∏P(yi = 1|xi)^{yi}*(1-P(yi = 1|xi))^{1-yi} L(θ)=∏P(yi=1∣xi)yi∗(1−P(yi=1∣xi))1−yi
P ( y i = 1 ∣ x i ; θ ) = h θ ( x ) P(yi = 1|xi;θ) = hθ(x) P(yi=1∣xi;θ)=hθ(x)
P ( y i = 0 ∣ x i ; θ ) = 1 − h θ ( x ) P(yi = 0|xi;θ) = 1-hθ(x) P(yi=0∣xi;θ)=1−hθ(x)
对代价函数取对数得到最终LR目标函数( h θ ( ) 是 l o g i s t i c 函 数 hθ()是logistic函数 hθ()是logistic函数):
l o g L ( θ ) ) = ∑ i = 1 m ( y i ∗ l o g ( x i ) ) + ( 1 − y i ) ∗ l o g ( 1 − h θ ( x i ) ) logL(θ))=\sum_{i=1}^{m}(yi*log({x}^{i}))+(1-y^i)*log(1-hθ(x^i)) logL(θ))=∑i=1m(yi∗log(xi))+(1−yi)∗log(1−hθ(xi))
2. 梯度下降
LR模型的数学形式确定后下面利用梯度下降法(迭代算法)求解模型中的参数,首先将求解
l
o
g
L
(
θ
)
)
logL(θ))
logL(θ))的最大值转化为最小值求解,转化公式:
J ( θ ) = − 1 m l ( θ ) J(\theta )=-\frac{1}{m}l(\theta) J(θ)=−m1l(θ)
然后根据梯度下降法得到 θ \theta θ更新过程:
θ j : = θ j − α ∂ ∂ θ j J ( θ ) , ( j = 0 , 1 , 2... , n ) \theta_{j}:=\theta_{j}-\alpha\frac{\partial }{\partial \theta_{j}}J(\theta),(j = 0,1,2...,n) θj:=θj−α∂θj∂J(θ),(j=0,1,2...,n)
上式中
α
\alpha
α是学习步长,下面求偏导:
因此,迭代过程可以写成:
θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ) i − y i ) x j i , ( j = 0 , 1 , 2... , n ) \theta_{j}:=\theta_{j}-\alpha\frac{1}{m}\sum_{i=1}^{m}(h\theta(x)^{i}-y^{i}){x}_{j}^i,(j = 0,1,2...,n) θj:=θj−αm1∑i=1m(hθ(x)i−yi)xji,(j=0,1,2...,n)
因为式中 1 m \frac{1}{m} m1是常数,所以 1 m \frac{1}{m} m1是可以省略的。
3.正则化
正则化思想是机器学习算法中常见的一种处理方法,所有会产生过拟合现象的算法都可以用正则化来避免算法的过拟合,那首先需要了解过拟合。利用数据集训练后的模型可以对新数据进行预测的能力称为泛化能力,一般来说泛化能力差的表现大多是因为发生了过拟合。过拟合是指对训练数据预测很好但是对未知数据预测不好的现象,一般是因为模型过于复杂或者训练数据过少引起的。模型过于复杂体现在参数过多或者参数过大。参数过大会导致导数非常大,从而造成函数的波动较大。下图是欠拟合,拟合和过拟合情况。
因此,解决过拟合可以从两个方面:减少模型复杂度以及增加训练样本个数,而正则化就是减少模型复杂度的一种方法。加入惩罚项的LR损失函数为:
J ( ω ) = − 1 m [ ∑ i = 1 m ( y i l o g ( h ω ( x i ) ) ) + ( 1 − y i ) ∗ l o g ( 1 − h ω ( x i ) ) ] + λ Φ ( ω ) J(\omega)=-\frac{1}{m}[\sum_{i=1}^{m}(y^ilog(h\omega({x}^{i})))+(1-y^i)*log(1-h\omega(x^i))]+\lambda\Phi(\omega) J(ω)=−m1[∑i=1m(yilog(hω(xi)))+(1−yi)∗log(1−hω(xi))]+λΦ(ω)
而这个正则化项一般采用L1或者L2范数,形式分别为: Φ ( ω ) = ∣ ∣ x ∣ ∣ 1 \Phi(\omega)={||x||}_{1} Φ(ω)=∣∣x∣∣1和 Φ ( ω ) = ∣ ∣ x ∣ ∣ 2 \Phi(\omega)={||x||}_{2} Φ(ω)=∣∣x∣∣2。首先针对L1范数 Φ ( ω ) = ∣ ω ∣ \Phi(\omega)=|\omega| Φ(ω)=∣ω∣,当采用梯度下降方式来优化目标函数时,对目标函数进行求导,正则化项导致的梯度变化当 ω j > 0 {\omega}_{j}>0 ωj>0时取1,当 ω j < 0 {\omega}_{j}<0 ωj<0时取-1.
因此当 ω j {\omega}_{j} ωj大于0的时候, ω j {\omega}_{j} ωj会减去一个正数,导致 ω j {\omega}_{j} ωj减小,而当 ω j {\omega}_{j} ωj小于0的时候, ω j {\omega}_{j} ωj会减去一个负数,导致 ω j {\omega}_{j} ωj又变大,因此这个正则项会导致参数 ω j {\omega}_{j} ωj取值趋近于0,也就是为什么L1正则能够使权重稀疏,这样参数值就受到控制会趋近于0。L1正则还被称为 Lasso regularization。
然后针对L2范数 Φ ( ω ) = ∑ i = 1 n ω j 2 \Phi(\omega)=\sum_{i=1}^{n}{\omega}^{2}_{j} Φ(ω)=∑i=1nωj2,同样的更新之后使得的 ω j {\omega}_{j} ωj值不会变得特别大。在机器学习中也将L2正则称为weight decay,在回归问题中,关于L2正则的回归还被称为Ridge Regression岭回归。weight decay还有一个好处,它使得目标函数变为凸函数,梯度下降法和L-BFGS都能收敛到全局最优解。
需要注意的是,L1正则化会导致参数值变为0,但是L2却只会使得参数值减小,这是因为L1的导数是固定的,参数值每次的改变量是固定的,而L2会由于自己变小改变量也变小。 λ \lambda λ在权衡拟合能力和泛化能力对整个模型的影响,越大,对参数值惩罚越大,泛化能力越好。
LR与SVM
逻辑回归和svm作为经典的分类算法,被放在一起讨论的次数特别多,这里只讨论一些我赞同的观点。
相同点:
- 都是分类算法
- 都是监督学习算法
- 都是判别模型
- 都能通过核函数方法针对非线性情况分类
- 目标都是找一个分类超平面
- 都能减少离群点的影响
不同点:
- 损失函数不同,逻辑回归是cross entropy loss,svm是hinge loss
- 逻辑回归在优化参数时所有样本点都参与了贡献,svm则只取离分离超平面最近的支持向量样本。这也是为什么逻辑回归不用核函数,它需要计算的样本太多。并且由于逻辑回归受所有样本的影响,当样本不均衡时需要平衡一下每一类的样本个数。
- 逻辑回归对概率建模,svm对分类超平面建模
- 逻辑回归是处理经验风险最小化,svm是结构风险最小化。这点体现在svm自带L2正则化项,逻辑回归并没有
- 逻辑回归通过非线性变换减弱分离平面较远的点的影响,svm则只取支持向量从而消去较远点的影响
- 逻辑回归是统计方法,svm是几何方法
Sklearn 中逻辑回归的使用以及参数含义
class 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)
penalty='l2'
: 字符串‘l1’或‘l2’,默认‘l2’。
用来指定惩罚的基准(正则化参数),LogisticRegression和LogisticRegressionCV默认就带了正则化项。penalty参数可选择的值为"l1"和"l2",分别对应L1的正则化和L2的正则化,默认是L2的正则化。在调参时如果我们主要的目的只是为了解决过拟合,一般penalty选择L2正则化就够了。但是如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化。
另外,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。penalty参数的选择会影响我们损失函数优化算法的选择。即参数solver的选择,如果是L2正则化,那么4种可选的算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以选择。
但是如果penalty是L1正则化的话,就只能选择‘liblinear’了。这是因为L1正则化的损失函数不是连续可导的,而{‘newton-cg’, ‘lbfgs’,‘sag’}这三种优化算法时都需要损失函数的一阶或者二阶连续导数。而‘liblinear’并没有这个依赖。
dual=False
: 对偶或者原始方法。Dual只适用于正则化相为l2的‘liblinear’的情况,通常样本数大于特征数的情况下,默认为False。
C=1.0
: C为正则化系数λ的倒数,必须为正数,默认为1。和SVM中的C一样,值越小,代表正则化越强。
fit_intercept=True
: 是否存在截距,默认存在。
intercept_scaling=1
: 仅在正则化项为‘liblinear’,且fit_intercept设置为True时有用。
solver='liblinear'
: solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择。
class_weight
: dict or ‘balanced’, default: None
class_weight参数用于标示分类模型中各种类型的权重,可以不输入,即不考虑权重,或者说所有类型的权重一样。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者我们自己输入各个类型的权重,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。
如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低;样本量越少,则权重越高。当class_weight为balanced时,类权重计算方法如下:n_samples / (n_classes * np.bincount(y))。n_samples为样本数,n_classes为类别数量,np.bincount(y)会输出每个类的样本数。