机器学习 14、分类算法-NB、AUC

你挡我一时,挡不了我一世

发布日期: 2019-04-28 12:40:13 浏览量: 1048
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

前文链接:https://write-bug.com/article/2428.html

分类算法

更新:NB、PR/AUC/ROC、LR、Softmax、DT、RF、GDBT、DNN、CNN、RNN

什么是分类问题呢?

最常见的机器学习任务:给定一个对象X,将其划分到预定义好的某一个类别Yi。

比如说:性别识别,人群划分,新闻分类,query分类,商品分类,网页分类,垃圾邮件过滤,网页排序等等。

对于性别识别来说,分辨男女,也就是二分类问题,即判断0和1问题。

那我们如何评判一个人是男是女呢?这时就需要特征来解决:肤色、身高、体重、音色等等等等,我们人类打眼一看什么特征大概就知道这个人是男是女了,那机器是如何学会这个技能的呢?

我们可以把这个机器当成是一个幼儿园小孩,如果幼儿园老师告诉小朋友,0:老虎很凶猛,1:小猫很温顺,那这时来了个狮子,小孩大脑里就会自动的拿狮子的特征去比对所见过的东西,觉得有些像老虎,那就会自然而然地离它远一些了。

这个技能就是泛化能力,也就是说来了一个新东西,如果我能预测的很准的话,那就说明这次机器学习的模型是效果很好的,是具有泛化能力的。

如果我想对文章做分类,一篇文章可以有很多类别,即多分类,那其中的特征是什么呢?关键词token,我提取出一篇文章的关键词,很容易就可以看出这篇文章属于哪类,每个词都有着对每个类别的倾向性,比如说‘股市’大概率都是财经文章。

机器学习模型

我们人类可以通过自己的学习经验一眼就可以把分类问题做出来,如果有大量数据的时候我们就需要机器去判断,也就是机器学习。

机器学习目的:模型,可以帮我们对数据做预测。

如果我想要机器学习对新数据预测的分类准确率高的话,我们就需要两点:

  • 好模型(老师/算法)

  • 好数据(教材/训练集)

* 好模型 ≠ 复杂模型:

  • 复杂模型和性能开销成正比,即实现程度

  • 过拟合,对训练集学习太过深刻会把训练集中的错误数据知识也学习到了,缺少泛化能力,对测试预估效果影响较大

评估模型学习效果:PR/AUC/ROC

朴素贝叶斯(NB)算法

我们在中文分词那节的语言模型中,推导过贝叶斯定理:

  1. p(s|c)=p(c|s)p(s)/p(c)

推导:

  1. p(s|c) p(c)=psc)—联合概率(同时发生的概率)
  2. ->pc|sp(s)=p(c,s)
  3. -> p(s|c) p(c)= pc|sp(s)
  4. -> p(s|c)= p(c|s)p(s)/p(c)

那假如我们设定:

X:一篇文章

Y:文章类别集合{}

yi:第i个类别

xi:文章某token

p(yi|X):一篇文章属于哪个类别的概率

则有:p(yi|X)=p(X|yi)p(yi)/p(X)

p(yi):先验概率,即常识,已知规律

我们看上面的设定来说,p(yi)代表着这个类别的概率,也就是说假设我训练集有100篇文章,我提前知道军事类别50,财经类别30,体育类别20,那么我们的先验概率也就固定下来了,p(y=军事)=50/100,以此类推,那么等到我测试集进行预测时,我的先验概率也按照这个比例来分布。

p(X):常数,一篇文章出现的概率就像我们原先说的一个人说的每句话一样几率都是一样的。

所以,公式简化为:

  1. p(yi|X)=p(X|yi)p(yi)
  2. p(X|yi)=p(x1|y1)\*p(x2|y1)\*p(x3|y1)....

也就是把大X分成不同的关键词,但前提是独立同分布

所以朴素贝叶斯的前提:独立同分布

那这里我需要对p(yi|X)=p(X|yi)p(yi)的参数进行估计:即最大似然估计

p(yi),如何计算呢?统计,说白了就是我们刚才举例子的方法求得的。

p(X|yi),两种计算方法:

  1. pxi|yi)=count(xi,yi)/count(yi)

count(xi,yi):即特征(关键词)xi和类别yi在训练数据中同时出现的次数

count(yi):即某类别总数

  1. p(谷歌|军事)=军事类文章中包含‘谷歌’这个词的文章个数 / 军事类文章个数
  2. p(谷歌|军事)=军事类文章中包含‘谷歌’这个词的文章个数 / 军事类文章中所有词个数

通过上面的分析与推导,我们得到了两个参数,如果来了一篇文章我们去预测属于那个类别,即p(yi|X),让这两个参数相乘就ok了。
这个结果是一个概率,这就意味着如果是二分类问题,p(y=0|X)=70%,p(y=1|X)=30%,即有多少分类就要求多少个概率值,取概率最大的数,最致信。这个结果就是后验概率。

优点:– 简单有效 – 结果是概率,对二值和多值同样适用

缺点:– 独立性假设有时不合理

NB实践:

1.python DataConvert.py data/ nb_data

数据准备:分好词的几千篇文章

数据合并和转换:标签和token

数据编码:token编码为数字,分测试集和训练集

2.python NB.py 1 nb_data.train model

训练数据训练,得到model(前面的两个参数)

3.python NB.py 0 nb_data.test model out

测试数据用model作预测—》求log

二分类评估效果

那我们怎么去评估我们的分类效果呢?对于二分类来说,我们最初使用混淆表(混淆矩阵)的方式进行评测:

  • 准确度Accuracy:(C11+C22)/(C11+C12+C21+C22)

  • 精确率Precision(y1):C11/(C11+C21)

  • 召回率Recall(y1):C11/(C11+C12)

这种方式不好看,我们来替换成例子来看下:

  • 准确度Accuracy:(50+35)/(35+5+10+50)=85%

  • 精确率Precision(y1):50/(50+5)=90.9%

  • 召回率Recall(y1):50/(50+10)=83.3%

上面的例子很明确,通常在工作中一般注重这两个指标,正确率(精确率)和召回率:

  • 正确率:预测样本中,正确的样本所占的比例,即看军事列

  • 召回率:预测样本中,正确的样本占同一类别总的样本比例,看军事行

那么什么指标合适,在日常生活中,有的是侧重于召回,有的是侧重于正确率,越靠近底层一般越侧重于召回,越往上,越侧重于精确,即Nosq库那块侧重召回,排序模型那里侧重于精确

上面我们提出了混淆矩阵,得到了准确率和召回率:

这里引出了:PR、ROC、AUC

有了这个正确率和召回率,我们可以获得一个PR曲线,即:同时评估正确率和召回率的方法就是通过PR曲线,p代表正确率,R代表召回率但是这个PR曲线很容构造成一个高正确率或高召回率的曲线,很难保证两全齐美,一般准确率高,召回率就低,召回率高,准确率低,可以构成一个二维码坐标,纵坐标是正确率,横坐标是召回率,用来确定阈值thd

那么用生活中的两类场景来举例子:

搜索场景,保证召回的前提下,再提高准确率

疾病检测,保证准确性前提,提升召回

PR曲线是个评测指标,用来协助你去选择阀值的,这个阈值怎么理解呢?比如我几篇文章被预测为军事的概率分别是0.7、0.8、0.6,如果阈值设置为thd=0.5,那么这三篇文章全被分辨为正例,都是军事。通过对阈值的调参,我得到的混淆矩阵里面的数值不同。

那么我们看下ROC曲线的评测指标:

纵轴:真阳率,召回率,TP/(TP+FN)

横轴:假阳率FP/(FP+FN)

那么ROC曲线有什么用,其实ROC曲线是为了得到AUC,即ROC曲线下的面积,,不同的阈值生成不同的混淆矩阵数值,打一个点就得到下面的曲线

但是这样计算比较麻烦,我们可以利用其他方式去理解AUC,即负样本排在正样本前面的概率。

假如A 0.1 B 0.9 我们假设负样本排正样本前面的概率认为正确,即A在B前面,认为是一次正确,B排在A前面,认为是一次错误。也就是按照概率进行倒序排序,上面是最小的概率,那么理想状态下,所有负例应该排在正例前面才对。

我们可以通过一个AWK来计算:

  1. cat auc.raw | sort -t$'\t' -k2g |awk -F'\t' '($1==-1){++x;a+=y;}($1==1){++y;}END{print 1.0-a/(x\*y);}'

x*y是正负样本pair对,a代表错误的个数,a/x*y 错误的概率,1-a/x*y 正确概率

解释一下这个linux命令,按照第二个模型打的分数进行循环判断,小的排在前面,大的分数排在后面,当有的分数是比较小,但是不是该类的,这个a就加一个y,y从0开始加,直到结束,能够找到有多少a,进而计算评估的正确率

例如:来了个文章,我们假如是军事类为+1,财经为-1,当然这个文章是军事类文章,即+1,然后我们设置一个阀值为0,即分类预测的分数 >0 认为是+1,<=0 认为是-1,x是负样本的个数,y是所有正样本个数,a是错误的样本个数

那么这个最差就是0.5,压根不知道好坏,评测是到底是正确的评测还是错误的评测。最完美就是1或者0了

上传的附件
最近文章
eject