逻辑回归
用于估算一个实例属于某个特定类别的概率。
logistic回归损失函数推导
罗列一些基本的公式:
p^=hθ(X)=σ(θT⋅X)
\hat{p} = h_\theta(X) = \sigma(\theta^T\cdot X)
p^=hθ(X)=σ(θT⋅X)
逻辑模型是一个sigmoid函数记作σ(⋅)\sigma(\cdot)σ(⋅),它的输出为一个0-1之间数字。
逻辑函数:
σ=11+exp(−t)
\sigma = \frac{1}{1+\exp(-t)}
σ=1+exp(−t)1
逻辑回归模型预测
y^={0(p^<0.5)1(p^≥0.5)
\hat{y} = \left\{
\begin{aligned}
0 (\hat{p}<0.5) \\
1 (\hat{p}\ge0.5)
\end{aligned}
\right.
y^={0(p^<0.5)1(p^≥0.5)
逻辑回归成本函数推导过程
假定: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−yp(y|x;\theta) = (h_\theta(x))^y(1-h_\theta(x))^{1-y}p(y∣x;θ)=(hθ(x))y(1−hθ(x))1−y
do:
L(θ)=∏i=1mpiyi(1−pi)1−yi⇒l(θ)=∑i=1mln[piyi(1−pi)1−yi]loss=−l(θ)
\begin{aligned}
L(\theta) &= \prod_{i=1}^mp_i^{y_i}(1-p_i)^{1-y_i} \\
&\Rightarrow l(\theta) = \sum_{i=1}^mln[p_i^{y_i}(1-p_i)^{1-y_i}] \\
& loss= -l(\theta)
\end{aligned}
L(θ)=i=1∏mpiyi(1−pi)1−yi⇒l(θ)=i=1∑mln[piyi(1−pi)1−yi]loss=−l(θ)
log损失函数:
J(θ)=−1m∑i=1m[yiln(pi)+(1−yi)ln(1−pi)]J(\theta) = -\frac{1}{m}\sum_{i=1}^m[y_iln(p_i) + (1-y_i)ln(1-p_i)]J(θ)=−m1i=1∑m[yiln(pi)+(1−yi)ln(1−pi)]
迭代公式推导公式
ϱ(θ)=logL(θ)=∑i=1mlogh(x(i))+(1−y(i))log(1−h(x(i)))∂ϱ(θ)∂θj=(y1g(θTx)−(1−y)11−g(θTx))∂∂θjg(θTx)=(y1g(θTx)−(1−y)11−g(θTx))g(θTx)(1−g(θTx))∂∂θjθTx=(y(1−g(θTx))−(1−y)g(θTx)xj=(y−hθ(x))xj
\begin{aligned}
\varrho(\theta) &= logL(\theta) \\
& = \sum_{i=1}^mlogh(x^{(i)}) + (1-y^{(i)})log(1-h(x^{(i)})) \\
\frac{\partial\varrho(\theta)}{\partial\theta_j} &= (y\frac{1}{g(\theta^Tx)} - (1-y)\frac{1}{1-g(\theta^Tx)}) \frac{\partial}{\partial\theta_j}g(\theta^Tx) \\
&=(y\frac{1}{g(\theta^Tx)}-(1-y)\frac{1}{1-g(\theta^Tx)})g(\theta^Tx)(1-g(\theta^Tx))\frac{\partial}{\partial\theta_j}\theta^Tx\\
& = (y(1-g(\theta^Tx)) - (1-y)g(\theta^Tx)x_j \\
& = (y-h_\theta(x))x_j
\end{aligned}
ϱ(θ)∂θj∂ϱ(θ)=logL(θ)=i=1∑mlogh(x(i))+(1−y(i))log(1−h(x(i)))=(yg(θTx)1−(1−y)1−g(θTx)1)∂θj∂g(θTx)=(yg(θTx)1−(1−y)1−g(θTx)1)g(θTx)(1−g(θTx))∂θj∂θTx=(y(1−g(θTx))−(1−y)g(θTx)xj=(y−hθ(x))xj
可以得到参数的迭代公式为:
θj=θj+α(y(i)−hθ(x(i)))xj\theta_j = \theta_j + \alpha(y^{(i)} - h_\theta(x^{(i)}))x_jθj=θj+α(y(i)−hθ(x(i)))xj
转化为向量形式为:
θnextstep=θ−η⋅x(i).T(11−exp(−θT⋅x)−yi)\theta^{nextstep} = \theta - \eta\cdot x^{(i)}.T(\frac{1}{1-exp(-\theta^T\cdot x)} - y_i)θnextstep=θ−η⋅x(i).T(1−exp(−θT⋅x)1−yi)
实验演练
引入鸢尾花数据集。
from sklearn import datasets
iris = datasets.load_iris()
数据集里面有四个特征,当我们使用其中一个特征作为数据集的时候,
随着特征的线性变化会出现这种变化。
与是规模的具有相同的变化趋势。而判断的类别会以50%的可能性为边界来区分。
下图将更加清晰的给出了分类的边界。
这里我忘记写标签了,需要指出的是红色三角形代表的是鸢尾花,蓝色的原型代表的是非鸢尾花。
解读LogisticRegression函数(官方文档)
通过解读函数我们能够更加理解概念。并且验证我们的猜想。
逻辑回归默认的情况下正则化使用的是l2范数,且给出的目标函数为:
minw,c12wTw+C∑i=1nlog(exp(−yi(XiTw+c))+1)
\min_{w, c}\frac{1}{2}w^Tw + C\sum_{i=1}^nlog(exp(-y_i(X_i^Tw+c))+1)
w,cmin21wTw+Ci=1∑nlog(exp(−yi(XiTw+c))+1)
为了得到这个表达式只需推导上述公式。
J(θ)=−1m∑i=1m[yiln(pi)+(1−yi)ln(1−pi)]=−yilog(exp(−XiTw+c)+1)+(yi−1)log(exp(c−XiTw)+1)
\begin{aligned}
J(\theta) &= -\frac{1}{m}\sum_{i=1}^m[y_iln(p_i) + (1-y_i
)ln(1-p_i)] \\
& = -y_ilog(exp(-X_i^Tw+c)+1) +(y_i-1)log(exp(c-X_i^Tw)+1)
\end{aligned}
J(θ)=−m1i=1∑m[yiln(pi)+(1−yi)ln(1−pi)]=−yilog(exp(−XiTw+c)+1)+(yi−1)log(exp(c−XiTw)+1)
根据yiy_iyi的实际取值,让yiy_iyi分别去值为0,1 可以得到与官网给定的公式一样。
l1正则化:
minw,c∣∣w∣∣1+C∑i=1nlog(exp(−yi(XiTw+c))+1)
\min_{w, c}||w||_1 + C\sum_{i=1}^nlog(exp(-y_i(X_i^Tw+c))+1)
w,cmin∣∣w∣∣1+Ci=1∑nlog(exp(−yi(XiTw+c))+1)
每个惩罚项对于求解器是否支持表(只挑选出了我认识的惩罚项)。
Penalties | liblinear | lbfgs | newton-cg | sag |
---|---|---|---|---|
Multinomial+L2 | no | yes | yes | yes |
Multinomial+L1 | no | no | no | no |
Elastic-Net | no | no | no | no |
No penalty | no | yes | yes | yes |
Faster for large datasets(对于大型数据集的解决速度) | no | no | no | yes |
Robust to unscaled datasets(对于未缩放数据集是否保持健壮性) | yes | yes | yes | no |
弹性网络仅由saga支持。
参数解读
- penalty 选择正则惩罚项默认选择的是l2惩罚项。
- dual 当样本数大于特征数的时候首选dual = False.
- C 正则化强度的逆,必须是正的浮动,较小的中指定更强的正则化。
- class_weight 指定初始化权重。
- 保留之前模型的参数数据。
- n_jobs 设置cpu的核数。
- max_iter 设置最大的迭代次数。
Note: 底层的C实现使用随机数生成器在拟合模型时选择特性,因此同一个模型每次运行的结果可能不同。可以使用较小的col参数。
softmax解决多分类问题
对于一个给定的实例X1,softmax回归首先计算出每个类别的得分然后再对这些分数应用softmax函数,估计每个类别的概率。
类别k的softmax分数:
sk(X)=θkT⋅X
s_k(X) = \theta_k^T \cdot X
sk(X)=θkT⋅X
参数θk\theta_kθk表示k类别的参数,通常参数向量会存储在矩阵向量中。
Softmax函数
pk^=σ(s(X))k=exp(sk(X))∑j=1Kexp(sj(X))
\hat{p_k} = \sigma(s(X))_k = \frac{exp(s_k(X))}{\sum_{j=1}^K exp(s_j(X))}
pk^=σ(s(X))k=∑j=1Kexp(sj(X))exp(sk(X))
给定一个样本,分别计算出每个权重对赢的成绩结果。
最终的预测结果就是:
y^=argmaxmσ(s(X))k=argmaxsk(X)=argmax(θkT⋅X)
\hat{y} = argmax_m\sigma(s(X))_k = argmax s_k(X) = argmax(\theta_k^T \cdot X)
y^=argmaxmσ(s(X))k=argmaxsk(X)=argmax(θkT⋅X)
交叉熵成本函数
J(θ)=−1m∑i=1m∑k=1Kyk(i)log(p^k(i))
J(\theta) = -\frac{1}{m}\sum_{i=1}^m\sum_{k=1}^Ky_k^{(i)}log(\hat{p}_k^{(i)})
J(θ)=−m1i=1∑mk=1∑Kyk(i)log(p^k(i))
对于类别k的交叉熵梯度向量
∇θkJ(θ)=1m∑i=1m(p^k(i)−yk(k))X(i)
\nabla_{\theta_k} J(\theta)=\frac{1}{m}\sum_{i=1}^m(\hat{p}_k^{(i)} - y_k^{(k)})X^{(i)}
∇θkJ(θ)=m1i=1∑m(p^k(i)−yk(k))X(i)
通过该公式可以计算出每个公式的梯度向量。使用梯度下降法找到最小化成本函数的参数矩阵。
引入三类别的鸢尾花。
from sklearn.linear_model import LogisticRegression
softmax_reg = LogisticRegression(multi_class='multinomial', solver='lbfgs', C=10)
softmax_reg.fit(X, y) #训练模型
需要说明的是需要将参数修改为:multi_class='multinomial’可以将其切换为softmax回归,还要选定一个支持softmax回归的秋求解器。
最后可以得到如下的分类结果;