一、逻辑回归
逻辑回归(Logistic Regression, LR)是一种常用的处理两类分类问题的线性模型。
1、概率估计
LR 模型计算输入特征的加权和(加上偏差项),之后将中间结果输入 logistic()
函数进行二次加工后输出。
逻辑回归模型的概率估计(向量形式)
p
^
=
h
θ
(
x
)
=
σ
(
θ
T
⋅
x
)
\hat{p}=h_\theta(x)=\sigma(\theta^T·x)
p^=hθ(x)=σ(θT⋅x)
其中,
σ
(
)
\sigma()
σ() 表示 logistic 函数(也称 logit 函数)
σ
(
t
)
=
1
1
+
e
−
t
\sigma(t)=\frac{1}{1+e^{-t}}
σ(t)=1+e−t1
一旦 logistic 回归模型估计得到了
X
X
X 属于正类的概率
p
^
=
h
θ
(
x
)
\hat{p}=h_\theta(x)
p^=hθ(x),则很容易得到预测结果
y
^
\hat{y}
y^。
逻辑回归预测模型
y
^
=
{
0
,
p
^
<
0.5
1
,
p
^
≥
0.5
\hat{y}=\begin{cases} 0, \ \ \ \ \hat{p}<0.5\\ 1,\ \ \ \ \hat{p}\geq0.5\end{cases}
y^={0, p^<0.51, p^≥0.5
2、训练和损失函数
注:该部分以手写笔记为主
逻辑回归的损失函数(对数损失)
J
(
θ
)
=
−
1
m
∑
i
=
1
m
[
y
(
i
)
l
o
g
(
h
θ
(
x
i
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
i
)
)
]
J(\theta)=-\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}log(h_\theta(x_i))+(1-y^{(i)})log(1-h_\theta(x_i))]
J(θ)=−m1i=1∑m[y(i)log(hθ(xi))+(1−y(i))log(1−hθ(xi))]
损失函数关于第
j
j
j 个模型参数
θ
j
\theta_j
θj 的偏导数
∂
∂
θ
j
J
(
θ
j
)
=
1
m
∑
i
=
1
m
(
σ
(
θ
T
⋅
X
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\frac{\partial}{\partial\theta_j}J(\theta_j)=\frac{1}{m}\sum_{i=1}^{m}(\sigma(\theta^T·X^{(i)})-y^{(i)})x_j^{(i)}
∂θj∂J(θj)=m1i=1∑m(σ(θT⋅X(i))−y(i))xj(i)
二、Softmax回归
Logistic回归扩展到多分类==》Softmax回归
1、原理
思路:给定实例 x x x 时,Softmax回归模型先计算 k k k 类的分数 s k ( x ) s_k(x) sk(x),然后将分数应用到 Softmax函数,估计出每类的概率。将估计概率最高(它只是得分最高的类)的类别作为预测结果。
softmax函数:估计样本属于第
k
k
k 类的概率
p
^
k
=
σ
(
s
(
x
)
)
k
=
e
x
p
(
s
k
(
x
)
)
∑
j
=
1
K
e
x
p
(
s
j
(
x
)
)
\hat{p}_k=\sigma(s(x))_k=\frac{exp(s_k(x))}{\sum_{j=1}^{K}exp(s_j(x))}
p^k=σ(s(x))k=∑j=1Kexp(sj(x))exp(sk(x))
其中:
s
k
(
x
)
=
θ
k
T
⋅
x
s_k(x)=\theta_k^T·x
sk(x)=θkT⋅x
其中,
K
K
K 表示类别的个数;需要注意的是
θ
k
θ_k
θk 说明每个类别对应有自己的
θ
θ
θ,所有
θ
k
θ_k
θk 组合起来是全部的参数。
s
(
x
)
s(x)
s(x) 表示包含样本
x
x
x 每一类得分的向量;
σ
(
s
(
x
)
)
k
\sigma(s(x))_k
σ(s(x))k表示给定每一类分数之后,实例
x
x
x 属于第
k
k
k 类的概率。
注意:softmax回归分类器一次只能预测一个类(智能用于互斥的类别,不能用于多标签)
2、训练
目标:建立一个模型在目标类别上有较高的概率。
==》损失函数:交叉熵(衡量待测类别与目标类别的匹配程度)
J
(
θ
)
=
−
1
m
∑
i
=
1
m
∑
k
=
1
K
y
k
(
i
)
l
o
g
(
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))
若对于第
i
i
i 个实例的目标类是
k
k
k,那么
y
k
(
i
)
=
1
y_k^{(i)}=1
yk(i)=1, 反之
y
k
(
i
)
=
0
y_k^{(i)}=0
yk(i)=0。
计算每一类的梯度向量,然后采用梯度下降(或其他优化算法)找到使损失函数达到最小值的参数矩阵
θ
\theta
θ。
k
k
k 类交叉熵关于
θ
k
\theta_k
θk 的梯度向量:
∇
θ
k
J
(
θ
)
=
1
m
∑
i
=
1
m
(
p
^
k
(
i
)
−
y
k
(
i
)
)
x
(
i
)
\nabla_{\theta_k}J(\theta)=\frac{1}{m}\sum_{i=1}^{m}(\hat{p}_k^{(i)}-y_k^{(i)})x^{(i)}
∇θkJ(θ)=m1i=1∑m(p^k(i)−yk(i))x(i)
三、SVM
自己之前的博文:用Scikit-learn和TensorFlow进行机器学习(五)
四、实现
1、LR
# -*- coding: utf-8 -*-
import pickle
from sklearn.linear_model.logistic import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
fp = open('./features/data_tfidf_train.pkl', 'rb')
x_train,y_train = pickle.load(fp)
x_train, x_test, y_train, y_test = train_test_split(x_train, y_train, test_size=0.3, random_state=2019)
lr = LogisticRegression(C = 120, dual = True)
lr.fit(x_train, y_train)
y_predict = lr.predict(x_test)
print("Logistic Regression F1 score: ",f1_score(y_test, y_predict, average='micro')
输出结果
2、SVM
svm = LinearSVC(C = 5, dual = False)
svm.fit(x_train, y_train)
y_predict = svm.predict(x_test)
print("SVM F1 Score: ",f1_score(y_test, y_predict, average='micro'))
输出结果