简介
逻辑斯蒂回归(logistic regression,LR)是统计学习中经典的分类方法,属于对数线性模型。是目前使用最多的机器学习分类方法,在推荐系统中的应用非常广泛。
基本思想
假定只考虑二分类问题,随机变量X取值为实数,随机变量Y取值为1或0。二项逻辑斯蒂回归模型是如下的条件概率分布:
P
(
Y
=
1
∣
x
)
=
e
x
p
(
w
⋅
x
+
b
)
1
+
e
x
p
(
w
⋅
x
+
b
)
P
(
Y
=
0
∣
x
)
=
1
1
+
e
x
p
(
w
⋅
x
+
b
)
P(Y=1|x) = \frac{exp(w\cdot x +b)}{1+exp(w\cdot x +b)} \\ P(Y=0|x) = \frac{1}{1+exp(w\cdot x +b)}
P(Y=1∣x)=1+exp(w⋅x+b)exp(w⋅x+b)P(Y=0∣x)=1+exp(w⋅x+b)1
其中
x
∈
R
n
x\in \mathbb{R}^n
x∈Rn 是输入,
Y
∈
{
0
,
1
}
Y\in \{0,1\}
Y∈{0,1} 是输出,
w
∈
R
n
w\in \mathbb{R}^n
w∈Rn和
b
∈
R
b\in \mathbb{R}
b∈R是参数。
w
w
w 称为权值向量,
b
b
b 称为偏置,
w
⋅
x
w\cdot x
w⋅x 为
w
w
w和
b
b
b的内积。
逻辑斯蒂回归模型的特点:一个事件的几率(odds)是指该事件发生的概率与该事件不发生的概率的比值。如果事件发生概率是
p
p
p,那么该事件的几率是
p
1
−
p
\frac{p}{1-p}
1−pp,该事件的对数几率或logit函数是
l
o
g
i
t
(
p
)
=
l
o
g
p
1
−
p
{\rm logit}(p) = {\rm log}\frac{p}{1-p}
logit(p)=log1−pp
对LR而言,有
l
o
g
P
(
Y
=
1
)
1
−
P
(
Y
=
1
)
=
w
⋅
x
+
b
{\rm log} \frac{P(Y=1)}{1-P(Y=1)} = w\cdot x +b
log1−P(Y=1)P(Y=1)=w⋅x+b
在逻辑斯蒂回归模型中,输出
Y
=
1
Y=1
Y=1 的对数几率是输入
x
x
x 的线性函数。
模型参数估计
设:
P
(
Y
=
1
∣
x
)
=
π
(
x
)
,
P
(
Y
=
0
∣
x
)
=
1
−
π
(
x
)
P(Y=1|x) = \pi(x),\ P(Y=0|x) = 1-\pi(x)
P(Y=1∣x)=π(x), P(Y=0∣x)=1−π(x)
似然函数必然满足二项分布为:
∏
i
=
1
N
[
π
(
x
i
)
]
y
i
[
1
−
π
(
x
i
)
]
1
−
y
i
\prod_{i=1}^{N}[\pi(x_i)]^{y_i}[1-\pi(x_i)]^{1-y_i}
i=1∏N[π(xi)]yi[1−π(xi)]1−yi
负对数似然函数为:(交叉熵作为损失函数)
L
(
w
)
=
−
∑
i
=
1
N
[
y
i
l
o
g
π
(
x
i
)
+
(
1
−
y
i
)
l
o
g
(
1
−
π
(
x
i
)
)
]
=
−
∑
i
=
1
N
[
y
i
l
o
g
π
(
x
i
)
1
−
π
(
x
i
)
+
l
o
g
(
1
−
π
(
x
i
)
)
]
=
−
∑
i
=
1
N
[
y
i
(
w
⋅
x
i
)
−
l
o
g
(
1
+
e
x
p
(
w
⋅
x
i
)
)
]
L(w) = -\sum_{i=1}^{N}[y_i\ {\rm log}\ \pi(x_i) + (1-y_i)\ {\rm log}\ (1-\pi(x_i))] \\ = -\sum_{i=1}^{N}[y_i\ {\rm log}\frac{\pi(x_i)}{1-\pi(x_i)} + {\rm log}(1-\pi(x_i))] \\ = -\sum_{i=1}^{N}[y_i\ (w\cdot x_i) - {\rm log}(1+ exp(w \cdot x_i))]
L(w)=−i=1∑N[yi log π(xi)+(1−yi) log (1−π(xi))]=−i=1∑N[yi log1−π(xi)π(xi)+log(1−π(xi))]=−i=1∑N[yi (w⋅xi)−log(1+exp(w⋅xi))]
通常采用随机梯度下降法对
L
(
w
)
L(w)
L(w) 求极小值,得到
w
w
w 的估计值。
对参数
w
w
w 求导得到
∂
L
(
w
)
∂
w
j
=
−
∑
i
=
1
N
[
x
i
(
j
)
y
i
−
x
i
(
j
)
e
x
p
(
w
⋅
x
i
)
1
+
e
x
p
(
w
⋅
x
i
)
]
=
−
∑
i
=
1
N
[
x
i
(
j
)
(
y
i
−
e
x
p
(
w
⋅
x
i
)
1
+
e
x
p
(
w
⋅
x
i
)
)
]
=
∑
i
=
1
N
[
x
i
(
j
)
(
g
(
w
⋅
x
i
)
−
y
i
)
]
\frac{\partial L(w)}{\partial w_j} = -\sum_{i=1}^{N} [x_i^{(j)}y_i - \frac{x_i^{(j)} exp(w\cdot x_i)}{1 + exp(w\cdot x_i)} ]\\ = -\sum_{i=1}^{N} [x_i^{(j)}(y_i - \frac{ exp(w\cdot x_i)}{1 + exp(w\cdot x_i)}) ]\\ = \sum_{i=1}^{N} [x_i^{(j)}(g(w\cdot x_i) - y_i)]
∂wj∂L(w)=−i=1∑N[xi(j)yi−1+exp(w⋅xi)xi(j)exp(w⋅xi)]=−i=1∑N[xi(j)(yi−1+exp(w⋅xi)exp(w⋅xi))]=i=1∑N[xi(j)(g(w⋅xi)−yi)]
其中
g
(
x
)
=
1
1
+
e
x
p
(
−
x
)
g(x) = \frac{1}{1+exp(-x)}
g(x)=1+exp(−x)1,
x
i
(
j
)
x_i^{(j)}
xi(j) 表示第i个样本的第j维输入特征。
参数更新公式:
w
j
t
+
1
=
w
t
−
η
∑
i
=
1
N
[
x
i
(
j
)
(
g
(
w
⋅
x
i
)
−
y
i
)
w_j^{t+1} = w^t - \eta \ \sum_{i=1}^{N} [x_i^{(j)}(g(w\cdot x_i) - y_i )
wjt+1=wt−η i=1∑N[xi(j)(g(w⋅xi)−yi)
其中
η
\eta
η 是学习率。
代码实现
class Logistic_Regression(object):
def __init__(self):
self.learning_step = 0.0001 # 学习率
self.max_iteration = 5000 # 分类正确上界,当分类正确的次数超过上界时,认为已训练好,退出训练
def train(self,features, labels):
self.w = [0.0] * (len(features[0]) + 1) # 初始化模型参数 某位元素为偏移b
correct_count = 0 # 分类正确的次数
while correct_count < self.max_iteration:
# 随机选取数据(xi,yi)
index = random.randint(0, len(labels) - 1)
x = list(features[index])
x.append(1.0)
y = labels[index]
if y == self.predict_(x): # 分类正确的次数加1,并跳过下面的步骤
correct_count += 1
continue
wx = sum([self.w[i] * x[i] for i in range(len(self.w))])
while wx>700: # 控制运算结果越界
wx/=2
exp_wx = math.exp(wx)
for i in range(len(self.w)):
self.w[i] -= self.learning_step * \
(-y * x[i] + float(x[i] * exp_wx) / float(1 + exp_wx)) # 梯度上升
def predict_(self,x):
wx = sum([self.w[j] * x[j] for j in range(len(self.w))])
while wx>700: # 控制运算结果越界
wx/=2
exp_wx = math.exp(wx)
predict1 = exp_wx / (1 + exp_wx)
predict0 = 1 / (1 + exp_wx)
if predict1 > predict0:
return 1
else:
return 0
def predict(self,features):
labels = []
for feature in features:
x = list(feature)
x.append(1)
labels.append(self.predict_(x))
return labels
常见问题
不同点:
- 逻辑回归处理的是分类问题,线性回归处理的是回归问题;
- 逻辑回归中认为y是因变量,即逻辑回归的因变量是离散的,线性回归的因变量是连续的。
相同点:
- 二者都使用了极大似然估计来对训练样本进行建模
- 求解超参数过程中,都可以使用梯度下降的方法
联系:
如果把一个事件的几率(odds)定义为该事件发生的概率与不发生概率的比值
p
1
−
p
\frac{p}{1-p}
1−pp ,那么逻辑回归可以看做是对于"y=1|x"这一事件的对数几率的线性回归
l
o
g
p
1
−
p
=
θ
T
x
,
其
中
p
=
P
(
y
=
1
∣
x
)
{\rm log} \frac{p}{1-p} = \theta^{T}x ,其中\ p = P(y=1|x)
log1−pp=θTx,其中 p=P(y=1∣x)
可以看做广义线性模型在因变量y服从二元分布时的一个特殊情况
如果一个样本只对应于一个标签(多分类问题):
假设每个样本属于不同标签的概率服从几何分布,使用softmax regression进行分类:
(3)
h
θ
=
[
p
(
y
=
1
∣
x
;
θ
)
p
(
y
=
2
∣
x
;
θ
)
⋮
p
(
y
=
1
∣
x
;
θ
)
]
=
1
∑
j
=
1
k
e
θ
T
x
[
e
θ
1
T
x
e
θ
2
T
x
⋮
e
θ
k
T
x
]
h_\theta = \left[ \begin{matrix} p(y=1|x;\theta)\\ p(y=2|x;\theta) \\ \vdots \\ p(y=1|x;\theta) \end{matrix} \right] = \frac{1}{\sum_{j=1}^{k} e^{\theta^T x}} \left[ \begin{matrix} e^{\theta_1^T x}\\ e^{\theta_2^T x} \\ \vdots \\ e^{\theta_k^T x} \end{matrix} \right] \tag{3}
hθ=⎣⎢⎢⎢⎡p(y=1∣x;θ)p(y=2∣x;θ)⋮p(y=1∣x;θ)⎦⎥⎥⎥⎤=∑j=1keθTx1⎣⎢⎢⎢⎢⎡eθ1Txeθ2Tx⋮eθkTx⎦⎥⎥⎥⎥⎤(3)
其中
θ
1
,
θ
2
…
,
θ
k
∈
R
n
\theta_1,\theta_2 \dots,\theta_k \in \mathbb{R}^n
θ1,θ2…,θk∈Rn
如果存在样本可能属于多个标签的情况时,可以训练k个二分类的逻辑回归分类器。第i个分类器用以区分每个样本是否可以归为第i类。
归一化:
- 提高收敛速度:梯度下降“小步慢走”,通过不断的迭代,求得最优解,归一化让特征向量中不同特征的取值相差不大,训练速度大大加快。
- 有可能提高精度
取对数:对数函数在其定义域内是单调递增函数,取对数后不会改变数据的相对关系;取对数的主要作用有:
-
缩小数据绝对数值,方便计算
-
取对数后,可以将乘法计算转换称加法计算
-
稀疏向量内积乘法运算速度快,计算结果方便存储,容易scalable(扩展)。
-
离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰。
-
逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合。
-
离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力。
-
特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。
-
特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。
L1和L2正则,都可以防止过拟合,增强模型的泛化能力;区别在于L1使参数更稀疏,达到特征选取的作用;L2使参数更接近于0。
从解空间的形状来看:
L1正则项约束后的解空间是多边形,而L2正则项约束后的解空间是圆形。而多边形的解空间更容易在尖角处与等高线碰撞出稀疏解。
对于存在线性相关的一组特征,L1正则会使得部分参数为0;L2正则会使参数都趋近于0但不会为0。
见上节模型参数估计部分
参考资料
https://www.cnblogs.com/eilearn/p/8990034.html