【数据竞赛】“达观杯”文本智能处理挑战赛4

一、逻辑回归

逻辑回归(Logistic Regression, LR)是一种常用的处理两类分类问题的线性模型。

1、概率估计

LR 模型计算输入特征的加权和(加上偏差项),之后将中间结果输入 logistic() 函数进行二次加工后输出。

逻辑回归模型的概率估计(向量形式)
p ^ = h θ ( x ) = σ ( θ T ⋅ x ) \hat{p}=h_\theta(x)=\sigma(\theta^T·x) p^=hθ(x)=σ(θTx)
其中, σ ( ) \sigma() σ() 表示 logistic 函数(也称 logit 函数)
σ ( t ) = 1 1 + e − t \sigma(t)=\frac{1}{1+e^{-t}} σ(t)=1+et1
在这里插入图片描述
一旦 logistic 回归模型估计得到了 X X X 属于正类的概率 p ^ = h θ ( x ) \hat{p}=h_\theta(x) p^=hθ(x),则很容易得到预测结果 y ^ \hat{y} y^

逻辑回归预测模型
y ^ = { 0 ,      p ^ &lt; 0.5 1 ,      p ^ ≥ 0.5 \hat{y}=\begin{cases} 0, \ \ \ \ \hat{p}&lt;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=1m[y(i)log(hθ(xi))+(1y(i))log(1hθ(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)} θjJ(θj)=m1i=1m(σ(θTX(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)=θkTx
其中, 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=1mk=1Kyk(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=1m(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'))

输出结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值