达观杯文本智能处理(四)——LR和SVM理论与实践
【任务 3.1】LR+SVM 时常: 2天
使用下面模型对数据进行分类(包括:模型构建&调参&性能评估),并截图F1评分的结果。
1)逻辑回归(LR)模型,学习理论并用Task2的特征实践
2)支持向量机(SVM) 模型,学习理论并用Task2的特征实践
一、逻辑回归(LR)模型
1.算法介绍
- Logistic regression (逻辑回归)是一种非线性回归模型,特征数据可以是连续的,也可以是分类变量和哑变量,是当前业界比较常用的机器学习方法,用于估计某种事物的可能性。
- 主要的用途:
分类问题:如,反垃圾系统判别,通过计算被标注为垃圾邮件的概率和非垃圾邮件的概率判定;
排序问题:如,推荐系统中的排序,根据转换预估值进行排序;
预测问题:如,广告系统中CTR预估,根据CTR预估值预测广告收益;
这个世界是随机的,所以万物的发生都可以用可能性或者几率(Odds)来表达。“几率”指的是某事物发生的可能性与不发生的可能性的比值。
- LR可以用来回归,也可以用来分类,主要是二分类。logistic回归模型在多分类问题上的推广是softmax regression。
但是本次我们的数据是多分类的,1-19 共19种label。为了适应我们的label,我们需要将逻辑回归扩展到多分类上。因此,让其适应多分类问题,损失函数就不能再笼统地只考虑二分类非1就0的损失,而是具体考虑每个样本标记的损失。这种方法叫做softmax回归,即使用softmax来实现logistic回归的多分类版本。
2.softmax回归
- softmax回归是Logistic回归在多分类问题上的推广。此处神经网络模型开始乱入,softmax回归一般用于神经网络的输出层,此时输出层叫做softmax层。
- softmax函数
首先介绍一下softmax函数,这个函数可以将一个向量(x1,x2,…,xK)映射为一个概率分布(z1,z2,…,zK):
那么在多分类问题中,假设类别标签y∈{1, 2, …, C}有C个取值,那么给定一个样本x,softmax回归预测x属于类别c的后验概率为:
其中wc是第c类的权重向量。
那么样本x属于C个类别中每一个类别的概率用向量形式就可以写为:
其中W=[w1,w2,…,wC]是由C个类的权重向量组成的矩阵,1表示元素全为1的向量,得到是由所有类别的后验概率组成的向量,第c个元素就是预测为第c类的概率,比如[0.05, 0.01, 0.9, 0.02, 0.02],预测为第3类。
- softmax回归的损失函数和梯度下降
假设训练数据集为{(x1,y1),(x2,y2),…(xM, yM)},即有M个样本,softmax回归使用交叉熵损失函数来学习最优的参数矩阵W,对样本进行分类。
由于涉及到多分类,所以损失函数的表示方法稍微复杂一些。我们用C维的one-hot向量y来表示类别标签。对于类别c,其向量表示为:
其中表示指示函数。
则softmax回归的交叉熵损失函数为:
二、支持向量机(SVM) 模型
1.支持向量机是什么
support vector machine从字面意思来说应该是依靠support vector来划分数据(其实也能回归啦。。)的机器学习模型。它是一个凸优化问题。
SVM的核心将数据的特征投射到高维,然后找到超平面,分割不同类别的数据点,而且要使分离的程度越大越好,至于为什么叫支持向量机,是因为每个类别都会有一些数据点作为支撑向量,这些支撑向量决定了最后分割的超平面。
这个图里的圈圈就是两边的支撑向量。
2.线性可分支持向量机
我们先讲最简单的情况,也就是线性可分的平面二分类问题。
支持向量机的目标是,找到一条分界线,把两类数据分开。但是这样的线可能有很多。
像上图。并不是每条线都是一个很好的分割线,如果紧贴着红点,那么线的另一头会立马被判为蓝色,这样对红点就很不合适了。所以SVM的目标不光是要找到这样一条分割线,而是要找到一条能最公平合理的分割线,让两类数据中最边缘的数据点距离分割线越远越好,这样这个分类器的泛化能力才会更强。于是乎支撑向量就被引入了。
分割线,分类表达式
最大分割距离max margin
然后我们再来看一开始的那张图:
回顾一下支持向量机是要干啥来着,是要找到一条把两类数据分得很开的割平面对不对,这需要我们找到两类数据最边缘的数据点(支撑向量),然后画出来两条平行的切面,两边支撑向量距离的垂直平分线就是最终的切割平面。
支持向量机的目标是让最边缘的点之间的距离越大越好。即ρ最大
这是我们的终极目标
三、机器学习评价指标
-
准确率和召回率是用于信息检索和统计学分类领域的两个度量值,用于评价结果的质量,在机器学习中对于数据进行预测的过程中,同样的使用这些指标来评价预测的结果的质量。
-
准确率是检索出相关文档数与检索出的文档总数的比率,衡量的是检索系统的查准率;
-
召回率是指检索出的相关文档数和文档库中的所有的相关文档数的比率,衡量的是检索系统的查全率。
1. 正确率 = 正确识别的个体总数 / 识别出的个体总数
2. 召回率 = 正确识别的个体总数 / 测试集中存在的个体总数
3. F值 = 正确率 * 召回率 * 2 / (正确率 + 召回率) (F 值即为正确率和召回率的调和平均值) -
预测值与实际值之间的差异:
-
假设原始样本中有两类,其中:
1:总共有 P个类别为1的样本,假设类别1为正例。
2:总共有N个类别为0 的样本,假设类别0为负例。
经过分类后:
3:有 TP个类别为1 的样本被系统正确判定为类别1,FN 个类别为1 的样本被系统误判定为类别 0,显然有P=TP+FN;
4:有 FP 个类别为0 的样本被系统误判断定为类别1,TN 个类别为0 的样本被系统正确判为类别 0,显然有N=FP+TN;
精确度(Precision):
P = TP/(TP+FP) ; 反映了被分类器判定的正例中真正的正例样本的比重。
准确率(Accuracy)
A = (TP + TN)/(P+N) = (TP + TN)/(TP + FN + FP + TN); 反映了分类器统对整个样本的判定能力——能将正的判定为正,负的判定为负 。
召回率(Recall),也称为 True Positive Rate:
R = TP/(TP+FN) = 1 - FN/T; 反映了被正确判定的正例占总的正例的比重 。
F-measure or balanced F-score
F = 2 * 召回率 * 准确率/ (召回率+准确率);这就是传统上通常说的F1 score。
四、LR和SVM实践
数据预处理
##读取数据
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
train_data=pd.read_csv('datalab/14936/train_set.csv',nrows=5000)
##删除‘article’
train_data.drop(columns='article', inplace=True)
##TF-IDF文本处理
tfidf=TfidfVectorizer()
x_train=tfidf.fit_transform(train_data['word_seg'])
##将训练集拆分成训练集和测试集
#x:要划分的样本集 y:要划分的样本结果
#test_size:测试集占比 random_state:随机数的种子
y=train_data['class']
x_train,x_test,y_train,y_test=train_test_split(x_train,y,test_size=0.3,random_state=123)
模型构建与评估
##logistics regression
##模型中间的参数,C是用来确定模型对分类错误样本的敏感程度的,越小越不允许分错;dual表示采用对偶方法求解
from sklearn.linear_model import LogisticRegression
from sklearn import svm
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
lg = LogisticRegression(C=100, dual = True)
lg.fit(x_train, y_train)
lg_y_prediction = lg.predict(x_test)
label = []
for i in range(1, 20):
label.append(i)
f1 = f1_score(y_test, lg_y_prediction, labels=label, average='micro')
print('lg/The F1 Score: ' + str("%.2f" % f1))
LR模型F1-score:
##SVM
from sklearn import svm
svm= svm.LinearSVC(C=5, dual=False)
svm.fit(x_train, y_train)
svm_y_prediction = svm.predict(x_test)
label = []
for i in range(1, 20):
label.append(i)
f1 = f1_score(y_test, svm_y_prediction, labels=label, average='micro')
print('SVM/The F1 Score: ' + str("%.2f" % f1))
SVM模型F1-score:
参考文献
1.Coursera公开课笔记: 斯坦福大学机器学习第六课“逻辑回归(Logistic Regression)”
2.李航博士《统计学习方法》
3.CSDN https://blog.csdn.net/kevinelstri/article/details/60959332
4.CSDN https://blog.csdn.net/SummerStoneS/article/details/78551757