逻辑回归算法梳理
1 逻辑回归与线性回归的区别
线性回归 | 逻辑回归 | |
---|---|---|
目的 | 预测 | 分类 |
y ( i ) y^{(i)} y(i) | 未知 | {0,1} |
函数 | 拟合函数 | 预测函数 |
参数计算 | 最小二乘 | 最大似然估计 |
-
1 (分类和回归):逻辑回归与线性回归都属于广义线性回归模型,回归模型就是预测一个连续变量(如降水量,价格等)。在分类问题中,预测属于某类的概率,可以看成回归问题。这可以说是使用回归算法的分类方法。
-
2(输出):直接使用线性回归的输出作为概率是有问题的,因为其值有可能小于0或者大于1,这是不符合实际情况的,逻辑回归的输出正是[0,1]区间
-
3 (参数估计方法):
一. 线性回归中使用的是最小化平方误差损失函数,对偏离真实值越远的数据惩罚越严重——问题:假如使用线性回归对{0,1}二分类问题做预测,则一个真值为1的样本,其预测值为50,那么将会对其产生很大的惩罚,这也和实际情况不符合,更大的预测值说明为1的可能性越大,而不应该惩罚的越严重。
二.逻辑回归使用对数似然函数进行参数估计,使用交叉熵作为损失函数,对预测错误的惩罚是随着输出的增大,逐渐逼近一个常数,这就不存在上述问题
三:也正是因为使用的参数估计的方法不同,线性回归模型更容易受到异常值(outlier)的影响,有可能需要不断变换阈值(threshold)
2 逻辑回归原理
是一种‘ s i g m o i d sigmoid sigmoid’函数,它将 z z z值转化为一个接近0或者1的 y y y值
本质:在线性回归模型的预测结果去逼近真实标记的对数几率
3 逻辑回归损失函数推导及优化
逻辑回归公式:
h
θ
(
x
)
=
g
(
θ
T
x
)
=
1
1
+
e
−
θ
T
x
h_\theta(x) = g(\theta^Tx) = \frac{1}{1+e^{-\theta^Tx}}
hθ(x)=g(θTx)=1+e−θTx1
y
y
y的取值有特殊的含义,它表示结果取1的概率,因此对于输入
x
x
x分类结果为类别1和类别0的概率分别为:
P
(
y
=
1
∣
x
;
θ
)
=
h
θ
(
x
)
P(y=1|x;\theta) = h_\theta(x)
P(y=1∣x;θ)=hθ(x)
P ( y = 0 ∣ x ; θ ) = 1 − h θ ( x ) P(y=0|x;\theta) =1- h_\theta(x) P(y=0∣x;θ)=1−hθ(x)
将两公式合成一个:
P
(
y
∣
x
;
θ
)
=
(
h
θ
(
x
)
)
y
(
1
−
h
θ
(
x
)
)
1
−
y
P(y|x;\theta) = (h_\theta(x))^y(1-h_\theta(x))^{1-y}
P(y∣x;θ)=(hθ(x))y(1−hθ(x))1−y
利用最大似然估计,假定样本与样本之间相互独立,那么整个样本集生成的概率即为所有样本生成概率的乘积
L
(
θ
)
=
p
(
y
⃗
∣
X
:
θ
)
=
∏
i
=
0
m
p
(
y
(
i
)
∣
x
(
i
)
;
θ
)
=
∏
i
=
1
m
(
h
θ
(
x
(
i
)
)
)
y
(
i
)
(
1
−
h
θ
(
x
)
)
1
−
y
(
i
)
L(\theta)=p(\vec{y}|X:\theta)=\prod_{i=0}^mp(y{(i)}|x^{(i)};\theta)\\ =\prod_{i=1}^m(h_\theta(x^{(i)}))^{y^{(i)}}(1-h_\theta(x))^{1-y^{(i)}}
L(θ)=p(y∣X:θ)=i=0∏mp(y(i)∣x(i);θ)=i=1∏m(hθ(x(i)))y(i)(1−hθ(x))1−y(i)
为了方便求解,这里我们用对数似然函数最大化,对数似然函数取反即为我们的损失函数
J
(
θ
)
J(\theta)
J(θ)。
J
(
θ
)
=
−
l
o
g
L
(
θ
)
=
−
∑
i
=
1
m
[
y
i
l
o
g
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
]
J(\theta)=-\ logL(\theta)=-\sum_{i=1}^m[y_{i}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_{\theta}(x(i)))]
J(θ)=− logL(θ)=−i=1∑m[yilog(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
损失函数
J
(
θ
)
J(\theta)
J(θ)对
θ
\theta
θ求导(这里只以一个训练样本为例)
∂
(
J
(
θ
)
)
∂
(
θ
j
)
=
−
(
y
g
(
θ
T
x
)
−
1
−
y
1
−
g
(
θ
T
x
)
)
∂
(
g
(
θ
T
x
)
)
∂
(
θ
j
)
=
−
(
y
g
(
θ
T
x
)
−
1
−
y
1
−
g
(
θ
T
x
)
)
g
(
θ
T
x
)
(
1
−
g
(
θ
T
x
)
)
x
j
=
−
(
y
−
h
θ
(
x
)
)
x
j
\begin{aligned} \frac{\partial(J(\theta))}{\partial(\theta_j)} &= -(\frac{y}{g(\theta^Tx)}-\frac{1-y}{1-g(\theta^Tx)})\frac{\partial(g(\theta^Tx))}{\partial(\theta_j)}\\ \qquad \qquad \ \qquad \ \ \qquad &=-(\frac{y}{g(\theta^Tx)}-\frac{1-y}{1-g(\theta^Tx)})g(\theta^Tx)(1-g(\theta^Tx))x_j \\ &=-(y-h_{\theta}(x))x_j \end{aligned}
∂(θj)∂(J(θ)) =−(g(θTx)y−1−g(θTx)1−y)∂(θj)∂(g(θTx))=−(g(θTx)y−1−g(θTx)1−y)g(θTx)(1−g(θTx))xj=−(y−hθ(x))xj
则对于
θ
\theta
θ的更新方式:
θ
j
=
θ
j
−
α
(
h
θ
(
x
)
−
y
)
x
j
\color{Red}\theta_j = \theta_j-\alpha(h_\theta(x)-y)x_j
θj=θj−α(hθ(x)−y)xj
-
线性回归和逻辑回归对参数有相同的更新方式
ps:线性回归的梯度方向
∂ ∂ θ j J ( θ ) = ∂ ∂ θ j 1 2 ( h θ ( x ) − y ) 2 = 2 ⋅ 1 2 ( h θ ( x ) − y ) ⋅ ∂ ∂ θ j ( h θ ( x ) − y ) = ( h θ ( x ) − y ) ⋅ ∂ ∂ θ j ( ∑ i = 0 n θ i x i − y ) = ( h θ ( x ) − y ) x j \begin{aligned} \frac{\partial}{\partial \theta_{j}} J(\theta) &=\frac{\partial}{\partial \theta_{j}} \frac{1}{2}\left(h_{\theta}(x)-y\right)^{2} \\ &=2 \cdot \frac{1}{2}\left(h_{\theta}(x)-y\right) \cdot \frac{\partial}{\partial \theta_{j}}\left(h_{\theta}(x)-y\right) \\ &=\left(h_{\theta}(x)-y\right) \cdot \frac{\partial}{\partial \theta_{j}}\left(\sum_{i=0}^{n} \theta_{i} x_{i}-y\right) \\ &=\left(h_{\theta}(x)-y\right) x_{j} \end{aligned} ∂θj∂J(θ)=∂θj∂21(hθ(x)−y)2=2⋅21(hθ(x)−y)⋅∂θj∂(hθ(x)−y)=(hθ(x)−y)⋅∂θj∂(i=0∑nθixi−y)=(hθ(x)−y)xj
4 正则化与模型评估指标
-
惩罚高阶参数,使它们趋近于0,这样就会得到较为简单的假设,也就是得到简单的函数,这样就不易发生过拟合。但是在实际问题中,并不知道哪些是高阶多项式的项,所以在代价函数中增加一个惩罚项/正则化项,将代价函数中所有参数值都最小化,收缩每一个参数。
-
实现参数的稀疏有什么好处吗?
1.简化模型,避免过拟合 ——因为一个模型中真正重要的参数可能并不多,如果考虑所有的参数起作用,那么可以对训练数据可以预测的很好,但是对测试数据表现性能极差
2.参数变少可以使整个模型获得更好的可解释性
-
参数值越小代表模型越简单
因为越复杂的模型,越是会尝试对所有的样本进行拟合,甚至包括一些异常样本点,这就容易造成在较小的区间里预测值产生较大的波动,这种较大的波动也反映了在这个区间里的导数很大,而只有较大的参数值才能产生较大的导数。因此复杂的模型,其参数值会比较大
-
正则化方法
1 L o L_o Lo范数:向量中非零元素的个数( 0 0 = 0 0^0=0 00=0)
∣ ∣ x ∣ ∣ 0 = ∑ ( i = 0 ) n x i 0 ||x||_0 = \sum_{(i=0)}^nx_i^0 ∣∣x∣∣0=(i=0)∑nxi0
若用L_0范数来规则化参数矩阵,就是希望参数矩阵大部分元素都为0,使特征矩阵稀疏。但是很难优化求解。2 L 1 L_1 L1范数:向量中各个绝对值元素之和
∣ ∣ x ∣ ∣ 1 = ∑ ( i = 0 ) n ∣ x i ∣ ||x||_1=\sum_{(i=0)}^n|x_i| ∣∣x∣∣1=(i=0)∑n∣xi∣
3
L
2
L_2
L2范数:各参数的平方和再求平方根
∣
∣
x
∣
∣
2
=
∑
(
i
=
0
)
n
∣
x
i
2
∣
||x||_2 = \sqrt{\sum_{(i=0)^n}|x_i^2|}
∣∣x∣∣2=(i=0)n∑∣xi2∣
模型评估指标
-
回归任务常用的性能度量:均方误差
-
分类问题中:
1 错误率和精度
2 查准率、查全率、F1
3 ROC和AUC
4 代价敏感错误率与代价曲线
5 逻辑回归的优缺点
-
优点:
- 适合需要得到一个分类概率的场景
- 计算代价不高,容易理解实现。逻辑回归在时间和内存需求上相当高效。它可以应用于分布式数据,并且还有在线算法实现,用较少的资源处理大型数据。
- 逻辑回归对于数据中小噪声的鲁棒性很好,并且不会受到轻微的多重共线性的特别影响。(严重的多重共线性则可以使用逻辑回归结合L2正则化来解决,但是若要得到一个简约模型,L2正则化并不是最好的选择,因为它建立的模型涵盖了全部的特征)
-
缺点:
- 容易欠拟合,分类精度不高
- 据特征有缺失或者特征空间很大时表现效果并不好。
6 样本不均衡问题解决方向
样本不平衡:指分类任务中不同类别的训练样例数目差别很大的情况(假设正样本较少,反类样例较多)
- 欠采样:直接对训练集中的反类样例进行‘欠采样’,即除去一些反例,使正、反例数目接近
- 过采样:增加一些正例,使正、反数目接近
- 阈值移动
7 sklearn 参数
- s k l e a r n . l i n e a r m o d e l . L o g i s t i c R e g r e s s i o n sklearn.linear_model.LogisticRegression sklearn.linearmodel.LogisticRegression
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)
参数 | |
---|---|
p e n a l t y penalty penalty | 惩罚项,str类型,默认为l2 |
d u a l dual dual | 对偶或原始方法,bool类型,默认为False |
t o l tol tol | 停止求解的标准,float类型,默认为1e-4 |
c c c | 正则化系数λ的倒数,float类型,默认为1.0。必须是正浮点型数。像SVM一样,越小的数值表示越强的正则化 |
f i t _ i n t e r c e p t fit\_intercept fit_intercept | 是否存在截距或偏差,bool类型,默认为True |
i n t e r c e p t _ s c a l i n g intercept\_scaling intercept_scaling | 仅在正则化项为”liblinear”,且fit_intercept设置为True时有用。float类型,默认为1 |
c l a s s _ w e i g h t class\_weight class_weight | 用于标示分类模型中各种类型的权重 |
r a n d o m _ s t a t e random\_state random_state | 随机数种子,int类型,可选参数,默认为无,仅在正则化优化算法为sag,liblinear时有用 |
s o l v e solve solve | 优化算法选择参数,只有五个可选参数,即newton-cg,lbfgs,liblinear,sag,saga |
m a x _ i t e r max\_iter max_iter | 算法收敛最大迭代次数,int类型,默认为10。仅在正则化优化算法为newton-cg, sag和lbfgs才有用,算法收敛的最大迭代次数。 |
m u l t i _ c l a s s multi\_class multi_class | 分类方式选择参数,str类型,可选参数为ovr和multinomial,默认为ovr。ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)。如果是二元逻辑回归,ovr和multinomial并没有任何区别,区别主要在多元逻辑回归上 |
v e r b o s e verbose verbose | 日志冗长度,int类型。默认为0。就是不输出训练过程,1的时候偶尔输出结果,大于1,对于每个子模型都输出。 |
w a r m _ s t a r t warm\_start warm_start | 热启动参数,bool类型。默认为False。如果为True,则下一次训练是以追加树的形式进行(重新使用上一次的调用作为初始化) |
n _ j o b s n\_jobs n_jobs | 并行数。int类型,默认为1。1的时候,用CPU的一个内核运行程序,2的时候,用CPU的2个内核运行程序。为-1的时候,用所有CPU的内核运行程序 |