Logistic Regression 逻辑回归
线性回归模型
假设变量
x
i
x_i
xi有
d
d
d个属性,即
x
i
=
(
x
i
1
,
x
i
2
,
.
.
.
,
x
i
d
)
T
x_i=(x_{i1},x_{i2},...,x_{id})^T
xi=(xi1,xi2,...,xid)T,线性回归模型的任务就是试图学得一个通过属性的线性组合来进行预测的函数,即
f
(
x
i
)
=
w
1
x
i
1
+
w
2
x
i
2
+
.
.
.
+
w
d
x
i
d
+
b
,
f(x_i) = w_1x_{i1}+w_2x_{i2}+...+w_dx_{id}+b,
f(xi)=w1xi1+w2xi2+...+wdxid+b,
写成向量形式即为
f
(
x
i
)
=
w
T
x
+
b
f(x_i)=w^Tx+b
f(xi)=wTx+b
其中
w
=
(
w
1
,
w
2
,
.
.
.
,
w
d
)
T
.
w=\left( w_1,w_2,...,w_d\right)^T.
w=(w1,w2,...,wd)T.
对于分类问题,给定数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D=\left\{ (x_1,y_1),(x_2,y_2),...,(x_m,y_m) \right\} D={(x1,y1),(x2,y2),...,(xm,ym)},线性回归模型试图学得一个线性模型以尽可能准确地预测真实的输出标记,即使 f ( x i ) = w T x i + b f(x_i) = w^Tx_i+b f(xi)=wTxi+b尽可能地接近 y i . y_i. yi.
引入均方误差来衡量
f
(
x
)
f(x)
f(x)与
y
y
y之间地差别,并通过最小化均方误差来确定
w
w
w和
b
b
b(也就是最小化误差的平方和),以1维数据为例:
(
w
∗
,
b
∗
)
=
arg
min
(
w
,
b
)
∑
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
=
arg
min
(
w
,
b
)
∑
i
=
1
m
(
y
i
−
w
x
i
−
b
)
2
\begin{aligned} \left(w^{*}, b^{*}\right) &=\underset{(w, b)}{\arg \min } \sum_{i=1}^{m}\left(f\left(x_{i}\right)-y_{i}\right)^{2} \\ &=\underset{(w, b)}{\arg \min } \sum_{i=1}^{m}\left(y_{i}-w x_{i}-b\right)^{2} \end{aligned}
(w∗,b∗)=(w,b)argmini=1∑m(f(xi)−yi)2=(w,b)argmini=1∑m(yi−wxi−b)2
其几何意义就是试图找到一条直线,使所有样本到直线地欧式距离之和最小。
均方误差分别对
w
w
w和
b
b
b求导,并令导数等于0,得到:
w
=
∑
i
=
1
m
y
i
(
x
i
−
x
ˉ
)
∑
i
=
1
m
x
i
2
−
1
m
(
∑
i
=
1
m
x
i
)
2
,
w=\frac{\sum_{i=1}^{m} y_{i}\left(x_{i}-\bar{x}\right)}{\sum_{i=1}^{m} x_{i}^{2}-\frac{1}{m}\left(\sum_{i=1}^{m} x_{i}\right)^{2}},
w=∑i=1mxi2−m1(∑i=1mxi)2∑i=1myi(xi−xˉ),
b
=
1
m
∑
i
=
1
m
(
y
i
−
w
x
i
)
,
b=\frac{1}{m} \sum_{i=1}^{m}\left(y_{i}-w x_{i}\right),
b=m1i=1∑m(yi−wxi),
其中
x
ˉ
=
1
m
∑
i
=
1
m
x
i
.
\bar{x}=\frac{1}{m} \sum_{i=1}^{m} x_i.
xˉ=m1∑i=1mxi.
对于d维数据的情形,
∑
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
=
∑
i
=
1
m
(
∑
j
=
1
d
w
j
x
i
j
+
b
−
y
i
)
2
.
\sum_{i=1}^{m} \left( f(x_i)-y_i \right)^2= \sum_{i=1}^{m} \left( \sum_{j=1}^{d}w_jx_{ij}+b-y_i \right)^2.
i=1∑m(f(xi)−yi)2=i=1∑m(j=1∑dwjxij+b−yi)2.
令
y
=
(
y
1
,
y
2
,
.
.
.
,
y
m
)
T
y=(y_1,y_2,...,y_m)^T
y=(y1,y2,...,ym)T,
w
^
=
(
w
1
,
w
2
,
.
.
.
,
w
d
,
b
)
T
,
\hat{w}=(w_1,w_2,...,w_d,b)^T,
w^=(w1,w2,...,wd,b)T,
X
=
(
x
11
x
12
…
x
1
d
1
x
21
x
22
…
x
2
d
1
⋮
⋮
⋱
⋮
⋮
x
m
1
x
m
2
…
x
m
d
1
)
=
(
x
1
T
1
x
2
T
1
⋮
⋮
x
m
T
1
)
,
X=\left(\begin{array}{ccccc} x_{11} & x_{12} & \ldots & x_{1 d} & 1 \\ x_{21} & x_{22} & \ldots & x_{2 d} & 1 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ x_{m 1} & x_{m 2} & \ldots & x_{m d} & 1 \end{array}\right)=\left(\begin{array}{cc} x_{1}^T & 1 \\ x_{2}^T & 1 \\ \vdots & \vdots \\ x_{m}^T & 1 \end{array}\right),
X=⎝⎜⎜⎜⎛x11x21⋮xm1x12x22⋮xm2……⋱…x1dx2d⋮xmd11⋮1⎠⎟⎟⎟⎞=⎝⎜⎜⎜⎛x1Tx2T⋮xmT11⋮1⎠⎟⎟⎟⎞,
则上式可写为
∑
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
=
(
y
−
X
w
^
)
T
(
y
−
X
w
^
)
.
\sum_{i=1}^{m} \left( f(x_i)-y_i \right)^2=\left( y-X\hat{w}\right)^T \left( y-X\hat{w}\right).
i=1∑m(f(xi)−yi)2=(y−Xw^)T(y−Xw^).
因此
w
^
∗
=
a
r
g
min
w
^
∗
(
y
−
X
w
^
)
T
(
y
−
X
w
^
)
,
\hat{w}^*=arg\min_{\hat{w}^*}\left( y-X\hat{w}\right)^T \left( y-X\hat{w}\right),
w^∗=argw^∗min(y−Xw^)T(y−Xw^),
令
E
w
^
=
(
y
−
X
w
^
)
T
(
y
−
X
w
^
)
E_{\hat{w}}=\left( y-X\hat{w}\right)^T \left( y-X\hat{w}\right)
Ew^=(y−Xw^)T(y−Xw^),对
w
^
\hat{w}
w^求导可得:
∂
E
w
^
∂
w
^
=
2
X
T
(
X
w
^
−
y
)
.
\frac{\partial E_{\hat{w}}}{\partial \hat{w}}=2{X}^{{T}}({X} \hat{{w}}-{y}) .
∂w^∂Ew^=2XT(Xw^−y).
若
X
T
X
X^TX
XTX满秩(可逆),则令
∂
E
w
^
∂
w
^
=
0
\frac{\partial E_{\hat{w}}}{\partial \hat{w}}=0
∂w^∂Ew^=0,可得
w
^
∗
=
(
X
T
X
)
−
1
X
T
y
,
\hat{{w}}^{*}=\left({X}^{{T}}{X}\right)^{-1} {X}^{{T}}{y},
w^∗=(XTX)−1XTy,
当
X
X
X的行数大于列数时
(
m
>
d
+
1
)
(m>d+1)
(m>d+1),
X
T
X
X^TX
XTX不满秩
(
R
(
X
T
X
)
<
m
i
n
(
R
(
X
)
,
R
(
X
T
)
)
<
d
+
1
)
.
\left( R(X^TX)<min(R(X),R(X^T))<d+1 \right).
(R(XTX)<min(R(X),R(XT))<d+1).此时可以引入正则化项
∣
∣
w
^
∣
∣
||\hat{w}||
∣∣w^∣∣,令
J
w
^
=
(
y
−
X
w
^
)
T
(
y
−
X
w
^
)
+
α
w
^
T
w
^
,
J_{\hat{w}}=\left( y-X\hat{w}\right)^T \left( y-X\hat{w}\right)+\alpha \hat{w}^T\hat{w},
Jw^=(y−Xw^)T(y−Xw^)+αw^Tw^,
则
∂
J
w
^
∂
w
^
=
2
(
X
T
X
+
α
I
)
w
^
−
2
X
T
y
,
\frac{\partial J_{\hat{w}}}{\partial \hat{w}}=2(X^{T} X+\alpha I)\hat{w} -2X^{T} y,
∂w^∂Jw^=2(XTX+αI)w^−2XTy,
当
α
>
0
\alpha>0
α>0时,
X
T
X
+
α
I
X^{T} X+\alpha I
XTX+αI为满秩矩阵,此时
w
^
∗
=
(
X
T
X
+
α
I
)
−
1
X
T
y
.
\hat{{w}}^{*}=\left({X}^{{T}}{X}+\alpha I\right)^{-1} {X}^{{T}}{y}.
w^∗=(XTX+αI)−1XTy.
广义线性模型
更一般地,考虑单调可微函数
g
(
⋅
)
g(\cdot)
g(⋅),
g
(
y
)
=
w
T
x
+
b
g(y)=w^Tx+b
g(y)=wTx+b,则
y
=
g
−
1
(
w
T
x
+
b
)
,
y=g^{-1}\left(w^Tx+b\right),
y=g−1(wTx+b),
其中
g
(
⋅
)
g(\cdot)
g(⋅)称为联系函数。
逻辑回归
模型的建立
考虑二分类任务,其输出标签
y
∈
{
0
,
1
}
y \in \left\{ 0,1\right\}
y∈{0,1},而线性回归模型产生的预测值
z
=
w
T
x
+
b
z=w^Tx+b
z=wTx+b是实数,因此需要将
z
z
z转换为
0
0
0或
1.
1.
1. 最简单的办法就是利用单位跃阶函数:
y
=
{
0
,
z
<
0
0.5
,
z
=
0
1
,
z
>
0
,
y=\left\{\begin{array}{cl} 0, & z<0 \\ 0.5, & z=0 \\ 1, & z>0 \end{array},\right.
y=⎩⎨⎧0,0.5,1,z<0z=0z>0,
若
z
>
0
z>0
z>0则判别为正例(
y
=
1
y=1
y=1),
z
<
0
z<0
z<0则判别为反例(
y
=
0
y=0
y=0)。但是单位跃阶函数不连续,不适合作为联系函数。于是我们希望找到一个能在一定程度上近似单位跃阶函数的替代函数,并且希望它单调可微。logistic函数就是一个常用的替代函数:
y
=
1
1
+
e
−
z
.
y = \frac{1}{1+e^{-z}}.
y=1+e−z1.
logistic函数的图像如下图所示:
对
y
=
1
/
(
1
+
e
−
z
)
y = 1/(1+e^{-z})
y=1/(1+e−z)两边取对数可得:
ln
y
1
−
y
=
w
T
x
+
b
,
\ln \frac{y}{1-y} = w^Tx+b ,
ln1−yy=wTx+b,
若将
y
y
y视为样本
x
x
x被判别为正例的可能性,则
1
−
y
1-y
1−y即为样本被判别为反例的可能性,两者的比值
y
1
−
y
\frac{y}{1-y}
1−yy反映了
x
x
x被判别为正例的相对可能性,称为"几率",
ln
y
1
−
y
\ln\frac{y}{1-y}
ln1−yy称为"对数几率"。
逻辑回归的实质就是在用线性回归模型的预测结果来逼近真实标签的对数几率。虽然逻辑回归的名字带有"回归",但它实际上却是一种分类学习的方法。
优点:实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低;可以得到近似概率预测;联系函数任意阶可导
缺点:容易欠拟合,分类精度可能不高
参数求解
若将逻辑回归模型的输出视为在
x
x
x给定的情况下
y
=
1
y=1
y=1的后验概率估计
p
(
y
=
1
∣
x
)
p(y=1|x)
p(y=1∣x),则
ln
y
1
−
y
=
w
T
x
+
b
\ln \frac{y}{1-y} = w^Tx+b
ln1−yy=wTx+b可重写为
ln
p
(
y
=
1
∣
x
)
p
(
y
=
0
∣
x
)
=
w
T
x
+
b
,
\ln \frac{p(y=1 \mid {x})}{p(y=0 \mid {x})}={w}^{{T}} {x}+b ,
lnp(y=0∣x)p(y=1∣x)=wTx+b,
p
(
y
=
1
∣
x
)
p
(
y
=
0
∣
x
)
=
e
w
T
x
+
b
,
\frac{p(y=1 \mid {x})}{p(y=0 \mid {x})}= e^{{w}^{{T}} {x}+b} ,
p(y=0∣x)p(y=1∣x)=ewTx+b,
因此可以得到
p
(
y
=
1
∣
x
)
=
e
w
T
x
+
b
1
+
e
w
T
x
+
b
,
p(y=1 \mid {x})=\frac{e^{{w}^{{T}} {x}+b}}{1+e^{{w}^{{T}} {x}+b}} ,
p(y=1∣x)=1+ewTx+bewTx+b,
p
(
y
=
0
∣
x
)
=
1
1
+
e
w
T
x
+
b
.
p(y=0 \mid {x})=\frac{1}{1+e^{{w}^{{T}} {x}+b}} .
p(y=0∣x)=1+ewTx+b1.
通过极大似然法可以估计出
w
w
w和
b
b
b,给定数据集
{
(
x
i
,
y
i
)
}
i
=
1
m
\left\{ (x_i,y_i) \right\}_{i=1}^m
{(xi,yi)}i=1m,构造对数似然函数
ℓ
(
w
,
b
)
=
∑
i
=
1
m
ln
p
(
y
i
∣
x
i
;
w
,
b
)
,
\ell({w}, b)=\sum_{i=1}^{m} \ln p\left(y_{i} \mid {x}_{i} ; {w}, b\right),
ℓ(w,b)=i=1∑mlnp(yi∣xi;w,b),
为了便于讨论,令
β
=
(
w
;
b
)
\beta=(w;b)
β=(w;b),
x
^
=
(
x
;
1
)
\hat{x}=(x;1)
x^=(x;1),则
w
T
x
+
b
=
β
T
x
^
.
w^Tx+b=\beta^T \hat{x}.
wTx+b=βTx^. 再令
p
1
(
x
^
;
β
)
=
p
(
y
=
1
∣
x
^
;
β
)
p_{1}(\hat{{x}} ; {\beta})=p(y=1 \mid \hat{{x}} ; {\beta})
p1(x^;β)=p(y=1∣x^;β),
p
0
(
x
^
;
β
)
=
p
(
y
=
0
∣
x
^
;
β
)
=
1
−
p
1
(
x
^
;
β
)
p_{0}(\hat{{x}} ; {\beta})=p(y=0\mid \hat{{x}} ; {\beta})=1-p_{1}(\hat{{x}} ; {\beta})
p0(x^;β)=p(y=0∣x^;β)=1−p1(x^;β),则
p
(
y
i
∣
x
i
;
w
,
b
)
=
y
i
p
1
(
x
^
i
;
β
)
+
(
1
−
y
i
)
p
0
(
x
^
i
;
β
)
.
p\left(y_{i} \mid {x}_{i} ; {w}, b\right)=y_{i} p_{1}\left(\hat{{x}}_{i} ; {\beta}\right)+\left(1-y_{i}\right) p_{0}\left(\hat{{x}}_{i} ; {\beta}\right) .
p(yi∣xi;w,b)=yip1(x^i;β)+(1−yi)p0(x^i;β).
似然函数可重新表达为(利用
ln
(
a
b
)
=
ln
a
−
ln
b
\ln (\frac{a}{b})=\ln a-\ln b
ln(ba)=lna−lnb)
ℓ
(
w
,
b
)
=
∑
i
=
1
m
ln
p
(
y
i
∣
x
i
;
w
,
b
)
=
∑
i
=
1
m
y
i
ln
(
e
β
T
x
^
i
1
+
e
β
T
x
^
i
)
+
(
1
−
y
i
)
ln
(
1
1
+
e
β
T
x
^
i
)
=
∑
i
=
1
m
y
i
β
T
x
^
i
−
y
i
ln
(
1
+
e
β
T
x
^
i
)
−
(
1
−
y
i
)
ln
(
1
+
e
β
T
x
^
i
)
=
∑
i
=
1
m
(
y
i
β
T
x
^
i
−
ln
(
1
+
e
β
T
x
^
i
)
)
.
\ell({w}, b)=\sum_{i=1}^{m} \ln p\left(y_{i} \mid {x}_{i} ; {w}, b\right) \\ = \sum_{i=1}^{m} y_i \ln \left( \frac{e^{\beta^T \hat{x}_i}}{1+e^{\beta^T \hat{x}_i}} \right)+(1-y_i) \ln \left( \frac{1}{1+e^{\beta^T \hat{x}_i}} \right) \\ = \sum_{i=1}^{m} y_i {\beta^T \hat{x}_i} -y_i \ln \left( {1+e^{\beta^T \hat{x}_i}} \right)-(1-y_i) \ln \left( 1+e^{\beta^T \hat{x}_i}\right) \\ = \sum_{i=1}^{m}\left(y_{i} {\beta}^{{T}} \hat{{x}}_{i}-\ln \left(1+e^{{\beta}^{{T}} \hat{{x}}_{i}}\right)\right).
ℓ(w,b)=i=1∑mlnp(yi∣xi;w,b)=i=1∑myiln(1+eβTx^ieβTx^i)+(1−yi)ln(1+eβTx^i1)=i=1∑myiβTx^i−yiln(1+eβTx^i)−(1−yi)ln(1+eβTx^i)=i=1∑m(yiβTx^i−ln(1+eβTx^i)).
因此极大化上式等价于极小化
l
(
β
)
=
∑
i
=
1
m
(
−
y
i
β
T
x
^
i
+
ln
(
1
+
e
β
T
x
^
i
)
)
.
l(\beta) = \sum_{i=1}^{m}\left(-y_{i} {\beta}^{{T}} \hat{{x}}_{i}+\ln \left(1+e^{{\beta}^{{T}} \hat{{x}}_{i}}\right)\right).
l(β)=i=1∑m(−yiβTx^i+ln(1+eβTx^i)).
从而得到
β
∗
=
a
r
g
min
β
l
(
β
)
.
\beta^* = arg \min_{\beta} l (\beta).
β∗=argβminl(β).
可以利用梯度下降法、牛顿法等数值优化算法求解得到
β
∗
\beta^*
β∗,以牛顿法为例,第
t
+
1
t+1
t+1步的更新公式为:
β
t
+
1
=
β
t
−
(
∂
2
ℓ
(
β
)
∂
β
∂
β
T
)
−
1
∂
ℓ
(
β
)
∂
β
\beta^{t+1}=\beta^{t}-\left(\frac{\partial^{2} \ell(\beta)}{\partial \beta \partial \beta^{{T}}}\right)^{-1} \frac{\partial \ell(\beta)}{\partial \beta}
βt+1=βt−(∂β∂βT∂2ℓ(β))−1∂β∂ℓ(β)
其中
l
l
l关于
β
\beta
β的一阶、二阶导数分别为
∂
ℓ
(
β
)
∂
β
=
−
∑
i
=
1
m
x
^
i
(
y
i
−
p
1
(
x
^
i
;
β
)
)
,
\frac{\partial \ell({\beta})}{\partial {\beta}}=-\sum_{i=1}^{m} \hat{{x}}_{i}\left(y_{i}-p_{1}\left(\hat{{x}}_{i} ; {\beta}\right)\right),
∂β∂ℓ(β)=−i=1∑mx^i(yi−p1(x^i;β)),
∂
2
ℓ
(
β
)
∂
β
∂
β
T
=
∑
i
=
1
m
x
^
i
x
^
i
T
p
1
(
x
^
i
;
β
)
(
1
−
p
1
(
x
^
i
;
β
)
)
.
\frac{\partial^{2} \ell({\beta})}{\partial {\beta} \partial {\beta}^{{T}}}=\sum_{i=1}^{m} \hat{{x}}_{i} \hat{{x}}_{i}^{{T}} p_{1}\left(\hat{{x}}_{i} ; {\beta}\right)\left(1-p_{1}\left(\hat{{x}}_{i} ; {\beta}\right)\right).
∂β∂βT∂2ℓ(β)=i=1∑mx^ix^iTp1(x^i;β)(1−p1(x^i;β)).
多分类问题
逻辑回归只能解决二分类问题,为了解决多分类问题,可以使用OVR或OVO方法。
OVR(One Vs Rest):
假设一共有
N
N
N个类,将其中的某一类作为正例,剩余的
N
−
1
N-1
N−1个类作为反例,这样就得到了一个二分类问题。
N
N
N个类别进行
N
N
N次这样的分类,就得到了
N
N
N个二分类模型。给定一个新的样本点,求出每种二分类模型对应的概率,概率最高的一类作为新样本的预测结果。
OVO(One Vs One):
假设一共有
N
N
N个类,将其中的某一类作为正例,另一类作为反例,构成一个二分类问题。总共得到
C
N
2
C_N^2
CN2个不同的二分类模型。给定一个新的样本点,求出每个二分类模型对应的概率,概率最高的一类作为新样本的预测结果。
代码实现
天池实验室链接:机器学习算法(一): 基于逻辑回归的分类预测
主要用到了Sklearn的LogisticRegression函数
参数说明如下:
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='lbfgs',
max_iter=100, multi_class='auto', verbose=0,
warm_start=False, n_jobs=None, l1_ratio=None)
-
penalty:惩罚项,可选参数为l1、l2和elasticnet,默认为l2。用于指定惩罚项中使用的范数。newton-cg、sag和lbfgs求解算法只支持L2范数。L1范数假设模型的参数满足拉普拉斯分布,L2范数假设模型参数满足高斯分布。其作用是使得模型更不会过拟合(overfit),提高模型的泛化能力。
-
dual:对偶或原始方法,bool类型,默认为False。对偶方法只用在求解线性多核(liblinear)的L2惩罚项上。当样本数量>样本特征的时候,dual通常设置为False。
-
tol:容许误差,float类型,默认为1e-4。当两次迭代的误差小于tol时停止迭代。
-
C:正则化系数的倒数,float类型,默认为1.0。必须是正浮点型数。数值越小表示的正则化效果越强。
-
fit_intercept:是否存在截距(没有截距时拟合出来的直线一定经过原点),bool类型,默认为True。
-
intercept_scaling:仅在正则化项为"liblinear",且fit_intercept设置为True时有用。float类型,默认为1。
-
class_weight:用于标示分类模型中各个类的权重,可以传入字典或者’balanced’,默认为None,不考虑权重。可以选择balanced自动计算权重,或者输入自定义的各个类的权重。例如对于0,1的二元模型,我们可以定义class_weight={0:0.9,1:0.1},这样类0的权重为 0.9 0.9 0.9,而类1的权重为 0.1 0.1 0.1。如果class_weight选择balanced,那么函数会根据各类在训练样本中的占比情况来计算权重,某类样本量越多,则权重越低,样本量越少,则权重越高。
具体计算公式为:n_samples / (n_classes * np.bincount(y))
n_samples为样本数,n_classes为类别数量,np.bincount(y)会输出每个类的样本数,例如y=[1,0,0,1,1],则np.bincount(y)=[2,3]。那么class_weight有什么作用呢?
在分类模型中,我们经常会遇到两类问题:
第一种是误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重。第二种是样本是高度失衡的。比如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。这时,我们可以选择balanced,让类库自动提高非法用户样本的权重。提高了某种分类的权重,相比不考虑权重,会有更多的样本分类划分到高权重的类别,从而可以解决上面两类问题。
-
random_state:随机数种子,int类型,可选参数,默认为无,仅在正则化优化算法为sag,liblinear时有用。
-
solver:求解参数使用的优化算法,可以选择newton-cg,lbfgs,liblinear,sag,saga。默认为liblinear。
- liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
- lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
- newton-cg:也是牛顿法的一种,利用损失函数的二阶导数矩阵来迭代优化损失函数。
- sag:随机梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
- saga:线性收敛的随机优化算法的的变种。
总结:
liblinear适用于小数据集,而sag和saga速度更快适用于大数据集。对于多分类问题,只有newton-cg,sag,saga和lbfgs能够处理多项损失,而liblinear受限于一对剩余(OvR)。
-
max_iter:算法收敛最大迭代次数,int类型,默认为10。仅在正则化优化算法为newton-cg, sag和lbfgs才有用。
-
multi_class:分类方式选择参数,str类型,可选参数为ovr和multinomial,默认为auto。如果选择了ovr,优化方法可以选择liblinear,newton-cg,lbfgs和sag,如果选择了multinomial,则只能选择newton-cg, lbfgs和sag。
-
verbose:日志冗长度,int类型。默认为0。就是不输出训练过程,1的时候偶尔输出结果,大于1,对于每个子模型都输出。
-
warm_start:热启动参数,bool类型。默认为False。如果为True,则下一次训练是以追加树的形式进行(重新使用上一次的调用作为初始化)。
-
n_jobs:并行数。int类型,默认为1。1的时候,用CPU的一个内核运行程序,2的时候,用CPU的2个内核运行程序。为-1的时候,用所有CPU的内核运行程序。
-
l1_ratio:float,0 <= l1_ratio <= 1,Elastic-Net模型的混合参数(惩罚项使用L1范数加L2范数),默认为None,仅当penalty='elasticnet’时起作用。表示l1范数在惩罚项中所占的比重,l1_ratio=0相当于penalty=‘l1’,l1_ratio=1相当于penalty=‘l2’。
导入用到的库
## 基础函数库
import numpy as np
import pandas as pd
## 绘图函数库
import matplotlib.pyplot as plt
import seaborn as sns
读取数据
## 导入sklearn中自带的iris数据,利用Pandas转化为DataFrame格式
from sklearn.datasets import load_iris
data = load_iris() # 加载数据
iris_target = data.target # 得到数据对应的标签
iris_features = pd.DataFrame(data=data.data, columns=data.feature_names)
利用逻辑回归模型进行训练和预测
## 划分测试集和训练集
x_train,x_test,y_train,y_test=train_test_split(iris_features,iris_target,test_size=0.2,random_state=2020)
## 训练模型
clf=LogisticRegression(random_state=0,solver='lbfgs')
clf.fit(x_train,y_train)
## 查看模型的参数
print('the weight of Logistic Regression:\n',clf.coef_)
print('the intercept(w0) of Logistic Regression:\n',clf.intercept_)
# 默认采用OVO的方法,得到了三个逻辑回归模型的参数,选择概率最大的类作为当前的类
## 在训练集和测试集上分布利用训练好的模型进行预测
train_predict=clf.predict(x_train)
test_predict=clf.predict(x_test)
## 利用predict_proba函数得到预测的概率
train_predict_proba=clf.predict_proba(x_train)
test_predict_proba=clf.predict_proba(x_test)
print('The test predict Probability of each class:\n',test_predict_proba)
# 第一列代表预测为0类的概率,第二列代表预测为1类的概率,第三列代表预测为2类的概率。
## 评估模型效果
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))
## 查看混淆矩阵
confusion_matrix_result=metrics.confusion_matrix(test_predict,y_test)
print('The confusion matrix result:\n',confusion_matrix_result)
## 利用热力图对于结果进行可视化
plt.figure(figsize=(8,6))
sns.heatmap(confusion_matrix_result,annot=True,cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()
对比OVO和OVR方法的效果
x_train,x_test,y_train,y_test=train_test_split(iris_features,iris_target,test_size=0.2,random_state=2020)
# OVR
clf=LogisticRegression(random_state=0,multi_class='ovr',solver='lbfgs')
clf.fit(x_train,y_train)
test_predict=clf.predict(x_test)
print('use ovr method')
print('the weight of Logistic Regression:\n',clf.coef_)
print('the intercept(w0) of Logistic Regression:\n',clf.intercept_)
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))
# OVO
clf2=LogisticRegression(random_state=0,multi_class='multinomial',solver='lbfgs')
clf2.fit(x_train,y_train)
test_predict2=clf2.predict(x_test)
print('\nuse ovo method')
print('the weight of Logistic Regression:\n',clf2.coef_)
print('the intercept(w0) of Logistic Regression:\n',clf2.intercept_)
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict2))
从结果可以看出OVO方法更加准确。