@(Machine Learning)
线性回归的模型是求出输出特征向量 Y Y Y和输入样本矩阵 X X X之间的线性关系系数 θ \theta θ,满足 Y = θ T X \mathbf{Y = \theta^TX} Y=θTX。此时 Y Y Y是连续的,所以是回归模型。如果 Y Y Y是离散的话,就需要对这个 Y Y Y再做一次函数转换,变为 g ( Y ) g(Y) g(Y)。如果令 g ( Y ) g(Y) g(Y)的值在某个实数区间的时候是类别A,在另一个实数区间的时候是类别B,以此类推,就得到了一个分类模型。如果结果的类别只有两种,那么就是一个二元分类模型了。逻辑回归的出发点就是从这来的。
假设有一个二分类问题,输出为 y ∈ { 0 , 1 } y∈\{0,1\} y∈{0,1},而线性回归模型产生的预测值为 z = w T x + b z=w^Tx+b z=wTx+b是实数值,希望找到一个理想的阶跃函数来帮我们实现 z z z值到0/1值的转化。
Θ ( z ) = { 0 i f z < 0 0.5 i f z = 0 1 i f z > 0 \Theta \left ( z\right )= \left\{\begin{matrix} 0 & ifz<0\\ 0.5 & ifz=0\\ 1 & ifz>0 \end{matrix}\right. Θ(z)=⎩⎨⎧00.51ifz<0ifz=0ifz>0
然而该函数不连续,我们希望有一个单调可微的函数在函数 g g g上的转换,于是找到了Sigmoid函数来替代。
g ( z ) = 1 1 + e − z g(z) = \frac{1}{1+e^{-z}} g(z)=1+e−z1
两者的图像如下图所示:
它有一个非常好的性质,即当 z z z趋于正无穷时, g ( z ) g(z) g(z)趋于1,而当 z z z趋于负无穷时, g ( z ) g(z) g(z)趋于0,这非常适合于我们的分类概率模型。另外,它还有一个很好的导数性质: g ′ ( z ) = g ( z ) ( 1 − g ( z ) ) g^{'}(z) = g(z)(1-g(z)) g′(z)=g(z)(1−g(z))
令 g ( z ) g(z) g(z)中的 z z z为: z = θ T x z=\theta^Tx z=θTx,这样就得到了二元逻辑回归模型的一般形式:
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
其中x为样本输入, h θ ( x ) h_{\theta}(x) hθ(x)为模型输出,可以看作是被分到某个类别的概率大小。而 θ \theta θ为分类模型的要求出的模型参数。于是,我们把Sigmoid函数计算得到的值大于等于0.5的归为类别1,小于0.5的归为类别0。( y = 0.5 y=0.5 y=0.5是临界情况,此时 x θ = 0 x\theta = 0 xθ=0为, 从逻辑回归模型本身无法确定分类,一般默认为正类)
y ^ = { 1 i f h ( x ) ≥ 0.5 0 o t h e r w i s e \hat{y}=\left\{\begin{matrix} 1 & ifh(x)\geq 0.5\\ 0 & otherwise \end{matrix}\right. y^={10ifh(x)≥0.5otherwise
由于线性回归是连续的,所以可以使用模型误差的的平方和来定义损失函数。而逻辑回归不是连续的,使用误差的的平方和作为损失函数就不合适了,需要使用用最大似然法来推导出逻辑回归的损失函数。
假设样本输出有0或者1两类,那么
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
其中y的取值为0或者1。
为了求解模型系数 θ \theta θ及求解方便,我们使用对数似然函数最大化,对数似然函数取反即为逻辑回归的损失函数 J ( θ ) J(\theta) J(θ)。似然函数的代数表达式为:
L ( θ ) = ∏ i = 1 m ( h θ ( x ( i ) ) ) y ( i ) ( 1 − h θ ( x ( i ) ) ) 1 − y ( i ) L(\theta) = \prod\limits_{i=1}^{m}(h_{\theta}(x^{(i)}))^{y^{(i)}}(1-h_{\theta}(x^{(i)}))^{1-y^{(i)}} L(θ)=i=1∏m(hθ(x(i)))y(i)(1−hθ(x(i)))1−y(i)
其中 m m m为样本的个数。
对似然函数对数化取反的表达式,即损失函数 J ( θ ) J(\theta) J(θ)表达式为:
J ( θ ) = − l n L ( θ ) = − ∑ i = 1 m ( y ( i ) l o g ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ) J(\theta) = -lnL(\theta) = -\sum\limits_{i=1}^{m}(y^{(i)}log(h_{\theta}(x^{(i)}))+ (1-y^{(i)})log(1-h_{\theta}(x^{(i)}))) J(θ)=−lnL(θ)=−i=1∑m(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))
这里使用梯度下降法推导出 θ \theta θ每次迭代的公式,梯度的负方向就是代价函数下降最快的方向。借助于泰特展开有: f ( x + θ ) − f ( x ) ≈ f ′ ( x ) ⋅ θ f(x + \theta) - f(x) \approx f'(x) \cdot \theta f(x+θ)−f(x)≈f′(x)⋅θ,其中, f ′ ( x ) f′(x) f′(x)和 θ \theta θ为向量,那么这两者的内积就等于:
f ′ ( x ) ⋅ θ = ∣ ∣ f ′ ( x ) ∣ ∣ ⋅ ∣ ∣ θ ∣ ∣ ⋅ c o s δ f'(x) \cdot \theta = ||f'(x)|| \cdot ||\theta|| \cdot cos \delta f′(x)⋅θ=∣∣f′(x)∣∣⋅∣∣θ∣∣⋅cosδ
当 δ = π \delta=π δ=π时,也就是 θ \theta θ在 f ′ ( x ) f′(x) f′(x)的负方向上时,取得最小值,也就是下降的最快的方向。
所以有: θ j : = θ j − α ∂ J ( θ ) ∂ θ \theta _j := \theta _j -\alpha\frac{\partial J(\theta)}{\partial \theta} θj:=θj−α∂θ∂J(θ)
其中, θ j \theta _j θj表示第 j j j个特征的权重; α \alpha α为学习率,用来控制步长。
∂ J ( θ ) ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) 1 h ( x ( i ) ) − ( 1 − y ( i ) ) 1 1 − h ( x ( i ) ) ) ∂ h ( x ( i ) ) ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) 1 g ( θ T x ( i ) ) − ( 1 − y ( i ) ) 1 1 − g ( θ T x ( i ) ) ) g ( θ T x ( i ) ) ( 1 − g ( θ T x ( i ) ) ) ∂ θ T x ( i ) ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) ( 1 − g ( θ T x ( i ) ) ) − ( 1 − y ( i ) ) g ( θ T x ( i ) ) ) x j ( i ) = − 1 m ∑ i = 1 m ( y ( i ) − g ( θ T x ( i ) ) ) x j ( i ) \begin{aligned} \frac{\partial J(\theta)}{\partial \theta_j} &= -\frac{1}{m}\sum_{i=1}^m (y^{(i)}\frac{1}{h(x^{(i)})}-(1 - y^{(i)})\frac{1}{1-h(x^{(i)})})\frac{\partial h(x^{(i)})}{\partial \theta_j}\\ &= -\frac{1}{m}\sum_{i=1}^m (y^{(i)}\frac{1}{g(\theta^Tx^{(i)})}-(1 - y^{(i)})\frac{1}{1-g(\theta^Tx^{(i)})})g(\theta^Tx^{(i)})(1-g(\theta^Tx^{(i)}))\frac{\partial \theta^Tx^{(i)}}{\partial \theta_j}\\ &= -\frac{1}{m}\sum_{i=1}^m (y^{(i)}(1-g(\theta^Tx^{(i)}))-(1-y^{(i)})g(\theta^Tx^{(i)}))x_j^{(i)}\\ &= -\frac{1}{m}\sum_{i=1}^m (y^{(i)}-g(\theta^Tx^{(i)}))x_j^{(i)} \end{aligned} ∂θj∂J(θ)=−m1i=1∑m(y(i)h(x(i))1−(1−y(i))1−h(x(i))1)∂θj∂h(x(i))=−m1i=1∑m(y(i)g(θTx(i))1−(1−y(i))1−g(θTx(i))1)g(θTx(i))(1−g(θTx(i)))∂θj∂θTx(i)=−m1i=1∑m(y(i)(1−g(θTx(i)))−(1−y(i))g(θTx(i)))xj(i)=−m1i=1∑m(y(i)−g(θTx(i)))xj(i)
θ \theta θ更新过程可以写成:
θ j : = θ j − α 1 m ∑ i = 1 m ( h ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j :=\theta_j - \alpha\frac{1}{m} \sum_{i=1}^m (h(x^{(i)}) - y^{(i)})x_j^{(i)} θj:=θj−αm1i=1∑m(h(x(i))−y(i))xj(i)
逻辑回归也会面临过拟合问题,常见的有L1正则化和L2正则化,和上篇线性回归类似。
逻辑回归的L1正则化的损失函数表达式如下,相比普通的逻辑回归损失函数,增加了L1的范数做作为惩罚,超参数 α \alpha α作为惩罚系数,调节惩罚项的大小。
AUC是一个模型评价指标,用于二分类模型的评价。AUC是“Area under Curve(曲线下的面积)”的英文缩写,而这条“Curve(曲线)”就是ROC曲线。
ROC曲线的横坐标是伪阳性率(也叫假正类率,False Positive Rate),纵坐标是真阳性率(真正类率,True Positive Rate),相应的还有真阴性率(真负类率,True Negative Rate)和伪阴性率(假负类率,False Negative Rate)。这四类的计算方法如下:
当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。根据每个测试样本属于正样本的概率值从大到小排序,依次将 “Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,认为它为正样本,否则为负样本。
一个典型的ROC曲线如下图:
计算出ROC曲线下面的面积,就是AUC的值。 介于0.5和1.0之间,越大越好。
如果我们的训练集有1000条数据,其中正例2,负例998。那么学习方法只需要返回一个永远将新样本预测为反例的学习器,就能达到99.8%的精度。但是这样的学习算法没有价值,因为它不能预测出任何正例。
类别不平衡问题是指分类任务中不同类别的训练例数相差很大的情况。在实际工作中,我们经常遇到类别不平衡,例如通过拆分法解决多分类问题时,即原始问题中不同类别的训练样例数目相当,在使用OvR,MvM策略后,二分类任务仍然可能类别不平衡。
处理这个问题一般有3个方法:
logistic回归一般应用于二分类领域,可以得出概率值,适用于根据分类概率排名的领域,如搜索排名等。Logistic回归的扩展softmax可以应用于多分类领域,如手写字识别等。
from sklearn import datasets
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LogisticRegression
iris = datasets.load_iris()
X = iris.data[:, [2, 3]]
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
lr = LogisticRegression(C=100, random_state=0)
lr.fit(X_train, y_train)
lr.predict_proba(X_test) # 查看测试样本属于各个类别的概率
参数解释