赞
踩
最近需要复习一下机器学习相关知识,记录一下
线性回归: h ( x ) = w T x + b h(x)=w^T x +b h(x)=wTx+b
logistic回归就是在线性模型的基础上加上一个sigmoid函数
g
g
g,即
h
(
x
)
=
g
(
w
T
x
+
b
)
h(x)=g(w^T x+b)
h(x)=g(wTx+b)
。
。
。
g
(
z
)
=
1
/
(
1
+
e
−
z
)
g(z)=1/(1+e^{-z})
g(z)=1/(1+e−z)。
它可以将一个线性回归中的结果转化为一个概率值。此时
h
(
x
)
h(x)
h(x)表示的就是某件事发生的概率,我们也可以记为
p
(
Y
=
1
∣
x
)
p(Y=1|x)
p(Y=1∣x)
逻辑回归采用的是交叉熵的损失函数。
对于一般的二分类的逻辑回归来说交叉熵函数为: J ( θ ) = − [ y l n ( y ′ ) + ( 1 − y ) l n ( 1 − y ′ ) ] J(\theta)=-[yln(y')+(1-y)ln(1-y')] J(θ)=−[yln(y′)+(1−y)ln(1−y′)],其中 y ′ y' y′是预测值。
实际上我们求的是训练中所有样本的损失,因此:
J ( θ ) = − 1 m ∑ [ y i l n ( y i ‘ ) + ( 1 − y i ) l n ( 1 − y i ‘ ) ] J(\theta )=-\frac{1}{m}\sum[y_i ln(y_i`)+(1-y_i )ln(1-y_i`)] J(θ)=−m1∑[yiln(yi‘)+(1−yi)ln(1−yi‘)]
函数梯度的方向就是函数增长最快的方向,反之梯度的反方向就是函数减少最快的方向。因此我们想要计算一个函数的最小值,就朝着该函数梯度相反的方向前进。
假设我们需要优化的函数:
f
(
X
)
=
f
(
x
1
,
.
.
.
,
x
n
)
f(X)=f(x_1,...,x_n)
f(X)=f(x1,...,xn)
首先我们初始化自变量,从
X
(
0
)
=
(
x
1
(
0
)
,
.
.
.
x
n
(
0
)
)
X^(0)=(x_1^{(0)},...x_n^{(0)})
X(0)=(x1(0),...xn(0))开始。设置一个学习率
η
\eta
η。
对于任何
i
>
=
0
i>=0
i>=0:
如果是最小化 f f f
x 1 i + 1 = x 1 i − η ∂ f ∂ x 1 ( x ( i ) ) x_1^{i+1}=x_1^{i}-\eta \frac{\partial{f}}{\partial{x_1}}(x^{(i)}) x1i+1=x1i−η∂x1∂f(x(i))
x n i + 1 = x n i − η ∂ f ∂ x n ( x ( i ) ) x_n^{i+1}=x_n^{i}-\eta \frac{\partial{f}}{\partial{x_n}}(x^{(i)}) xni+1=xni−η∂xn∂f(x(i))
反之如果求 f f f的最大值,则
x 1 i + 1 = x 1 i + η ∂ f ∂ x 1 ( x ( i ) ) x_1^{i+1}=x_1^{i}+\eta \frac{\partial{f}}{\partial{x_1}}(x^{(i)}) x1i+1=x1i+η∂x1∂f(x(i))
x n i + 1 = x n i + η ∂ f ∂ x n ( x ( i ) ) x_n^{i+1}=x_n^{i}+\eta \frac{\partial{f}}{\partial{x_n}}(x^{(i)}) xni+1=xni+η∂xn∂f(x(i))
逻辑回归优化的目标函数:
J
(
w
,
b
)
=
−
1
m
∑
[
y
i
l
n
(
σ
(
w
T
x
+
b
)
)
+
(
1
−
y
i
)
l
n
(
1
−
σ
(
w
T
x
+
b
)
)
]
J(w,b )=-\frac{1}{m}\sum[y_i ln(\sigma(w^T x +b))+(1-y_i )ln(1-\sigma(w^T x +b))]
J(w,b)=−m1∑[yiln(σ(wTx+b))+(1−yi)ln(1−σ(wTx+b))]
我们需要优化参数 w , b w,b w,b,从而使其在我们已知的样本 X , y X,y X,y上值最小。也就是我们常说的经验风险最小。
首先我们需要对 J ( w , b ) J(w,b) J(w,b)求导。
先令 g = σ ( w T x + b ) g=\sigma(w^T x +b) g=σ(wTx+b)
∂ J ( g ) ∂ g = − ∂ ∂ g [ y l n ( g ) + ( 1 − y ) l n ( 1 − g ) ] = − y g + 1 − y 1 − g \frac{\partial J(g)}{\partial g}=-\frac{\partial}{\partial g}[yln(g)+(1-y)ln(1-g)]=-\frac{y}{g}+\frac{1-y}{1-g} ∂g∂J(g)=−∂g∂[yln(g)+(1−y)ln(1−g)]=−gy+1−g1−y
再令: a = w T x + b a=w^T x +b a=wTx+b
∂ g ∂ a = ∂ ( 1 1 + e − a ) ∂ a = − ( 1 + e − a ) − 2 − e − a = 1 1 + e − a 1 + e − a − 1 1 + e − a = σ ( a ) ( 1 − σ ( a ) ) = g ( 1 − g ) \frac{\partial g}{\partial a}=\frac{\partial ({\frac{1}{1+e^{-a}}})}{\partial a}=-(1+e^{-a})^{-2}-e^{-a}=\frac{1}{1+e^{-a}}\frac{1+e^{-a}-1}{1+e^{-a}}=\sigma(a)(1-\sigma (a))=g(1-g) ∂a∂g=∂a∂(1+e−a1)=−(1+e−a)−2−e−a=1+e−a11+e−a1+e−a−1=σ(a)(1−σ(a))=g(1−g)
可以发现 g = σ ( a ) g=\sigma(a) g=σ(a),但是 g g g对 a a a求导之后居然是 g ( 1 − g ) g(1-g) g(1−g),在后续的梯度下降优化中,Sigmoid函数的这个性质可以减少很多不必要的计算。
接下来求需要优化的参数
w
,
b
w,b
w,b的梯度。
根据链式求导:
∂ J ∂ w = ∂ J ∂ g ∂ g ∂ a ∂ a ∂ w = ( − y g + 1 − y 1 − g ) g ( 1 − g ) x = ( g − y ) x \frac{\partial J}{\partial w}=\frac{\partial J}{\partial g}\frac{\partial g}{\partial a}\frac{\partial a}{\partial w}=(-\frac{y}{g}+\frac{1-y}{1-g})g(1-g)x=(g-y)x ∂w∂J=∂g∂J∂a∂g∂w∂a=(−gy+1−g1−y)g(1−g)x=(g−y)x
∂ J ∂ b = ∂ J ∂ g ∂ g ∂ a ∂ a ∂ b = ( − y g + 1 − y 1 − g ) g ( 1 − g ) = ( g − y ) \frac{\partial J}{\partial b}=\frac{\partial J}{\partial g}\frac{\partial g}{\partial a}\frac{\partial a}{\partial b}=(-\frac{y}{g}+\frac{1-y}{1-g})g(1-g)=(g-y) ∂b∂J=∂g∂J∂a∂g∂b∂a=(−gy+1−g1−y)g(1−g)=(g−y)
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
X=datasets.load_iris()['data']
Y=datasets.load_iris()['target']
from sklearn.linear_model import LogisticRegression
X_train,X_test,y_train,y_test=train_test_split(X,Y,test_size=0.1,stratify=Y)
model=LogisticRegression(penalty='l2',
class_weight=None,
random_state=None, max_iter=100)
model.fit(X_train,y_train)
model.predict_proba(X_test)
penalty:惩罚系数,也就是我们常说的正则化,默认为"l2",可选为l1。
class_weight:类别权重,一般我们在分类不均衡的时候使用,比如{0:0.1,1:1}代表在计算loss的时候,0类别的loss乘以0.1。这样在0类别的数据过多时候就相当于给1类别提权了。
max_iter:最大迭代次数。
这个是工业界中常见的操作,一般我们不会将连续的值作为特征输入到逻辑回归的模型之中,而是将其离散成0,1变量。这样的好处有:
1:稀疏变量的内积乘法速度快,计算结果方便存储,并且容易扩展;
2:离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰。
3:逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
4:离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
5:特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是比较重要的。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。