对模型的评价是在test set上进行的,本文首先介绍测试集应该满足的特征,然后介绍四种评价方法。

  一、测试集的选择

  1、首先,测试集必须是严格独立于训练集的,否则评价结果一定很高,但是虚高,不适用于新案例。

  2、如果分类的类别比较少,比如只有两个,而且每类的样本数大致相等,那100个样本大小的测试集也是够用的;但如果类别数比较多,且分布十分不均,那测试集的大小要保证最稀少的种类的样本数不少于50;此外,如果测试集的样本相互之间比较相似,就要适当的扩大测试集来弥补多样性的缺乏对评价的影响。当样本数比较大时,通常的做法是取整个数据集的10%作为测试集。

  3、测试集和训练集样本之间的相似度问题。相似度越高,评价的可信度就越低。举一个错误的例子:随机地分配来自同一个题材多篇文章的句子来组建测试集和训练集。代码如下:

  1. >>> import random
  2. >>> from nltk.corpus import brown
  3. >>> tagged_sents = list(brown.tagged_sents(categories='news'))
  4. >>> random.shuffle(tagged_sents)
  5. >>> size = int(len(tagged_sents) * 0.1)
  6. >>> train_set, test_set = tagged_sents[size:], tagged_sents[:size]

  这是非常愚蠢的做法,因为不同的文章,作者不同,句子的特征就会不同,来自不同文章的句子可以认为具有不同的特征,这对于模型测试是有利的。但是使用random.shuffle()将所用句子的顺序打乱,来自同一篇文章的句子就同时分布在测试集和训练集中,两者的相似度更高了,使原有的优势消失。一个改进的做法是保证测试集和训练集来自不同的文章,如下:

  1. >>> file_ids = brown.fileids(categories='news')
  2. >>> size = int(len(file_ids) * 0.1)
  3. >>> train_set = brown.tagged_sents(file_ids[size:])
  4. >>> test_set = brown.tagged_sents(file_ids[:size])

  如果想进一步改进,则可以使测试集和训练集来自不同的题材:

  1. >>> train_set = brown.tagged_sents(categories='news')
  2. >>> test_set = brown.tagged_sents(categories='fiction')

  二、评价方法/指标

  1、accuracy

  这是最常用的指标,就是用测试集中分类器正确分类的样本数除以测试集的总样本数。用nltk.classify.accuracy(classifier,test_set)方法可以得到,其中test_set是测试集,classifier是分类器。

  使用这个指标时一定要考虑测试集中样本的频率分布。原因在percision&recall中会解释

  2、precision&recall

  在搜索任务中accuracy通常不适用。比如在文献检索(information retrieval)中不相关的文档远远多于相关的文档,这样如果分类器将所有文档都标记为不相关,那它的准确率也将近100%。

  为了构建适用于搜索任务的指标,我们先来定义几个概念:

  Ture positive:TP,相关的被标记为相关

  Ture negative:TN,不相关的被标记为不相关

  False positive:FP,不相关的错标记为相关(第一类错误)

  False negative:FN,相关的被错标为不想关(第二类错误)

  然后基于以上概念,就可以构建一下指标:

  precision=TP/(TP+FP)

  recall=TP/(TP+NF)

  F-Measure=(2*precision*recall)/(precision+recall)

  3、confusion matrices(混淆矩阵)

  混淆矩阵的意思是,其中的元素[i,j]表示当正确的分类是i时,样本被分成j类的比例(相对于总样本数),即对角线上为正确分类的比例。代码如下:

  1. >>> def tag_list(tagged_sents):
  2. ... return [tag for sent in tagged_sents for (word, tag) in sent]
  3. >>> def apply_tagger(tagger, corpus):
  4. ... return [tagger.tag(nltk.tag.untag(sent)) for sent in corpus]
  5. >>> gold = tag_list(brown.tagged_sents(categories='editorial'))
  6. >>> test = tag_list(apply_tagger(t2, brown.tagged_sents(categories='editorial')))
  7. >>> cm = nltk.ConfusionMatrix(gold, test)
  8. >>> print(cm.pretty_format(sort_by_count=True, show_percents=True, truncate=9))
  9. | N |
  10. | N I A J N V N |
  11. | N N T J . S , B P |
  12. ----+----------------------------------------------------------------+
  13. NN | <11.8%> 0.0% . 0.2% . 0.0% . 0.3% 0.0% |
  14. IN | 0.0% <9.0%> . . . 0.0% . . . |
  15. AT | . . <8.6%> . . . . . . |
  16. JJ | 1.7% . . <3.9%> . . . 0.0% 0.0% |
  17. . | . . . . <4.8%> . . . . |
  18. NNS | 1.5% . . . . <3.2%> . . 0.0% |
  19. , | . . . . . . <4.4%> . . |
  20. VB | 0.9% . . 0.0% . . . <2.4%> . |
  21. NP | 1.0% . . 0.0% . . . . <1.8%>|
  22. ----+----------------------------------------------------------------+
  23. (row = reference; col = test)

  代码是从参考书上copy的,第六行的t2不明白是什么?在pythonwin上也无法正确运行,之后弄明白再修改。

  4、cross-validation(交叉验证)

  所谓交叉验证,就是讲整个数据集等分成N份,其中一份用作测试,N-1份用作训练,测试集不断的改变,总共进行N次,再取N次测试所得指标的平均值作为最后的评价结果。交叉验证的优点在于它使我们能够看到模型在不同的训练集上的稳定性,如果评价结果变化不大,则可以认为结果是准确的。

    

  

Python自然语言处理学习笔记之评价(evaluationd)的更多相关文章

  1. python自然语言处理学习笔记1

    1.搭建环境 下载anaconda并安装,(其自带python2.7和一些常用包,NumPy,Matplotlib),第一次启动使用spyder 2.下载nltk import nltk nltk.d ...

  2. Python自然语言处理学习笔记之性别识别

    从今天起开始写自然语言处理的实践用法,今天学了文本分类,并没用什么创新的东西,只是把学到的知识点复习一下 性别识别(根据给定的名字确定性别) 第一步是创建一个特征提取函数(feature extrac ...

  3. python自然语言处理——学习笔记:Chapter3纠错

    2017-12-06更新:很多代码执行结果与书中不一致,是因为python的版本不一致.如果发现有问题,可以参考英文版: http://www.nltk.org/book/ 第三章,P87有一段处理h ...

  4. python自然语言处理学习笔记2

    基础语法 搜索文本----词语索引使我们看到词的上下 text1.concordance("monstrous") 词出现在相似的上下文中 text1.similar(" ...

  5. Python自然语言处理学习笔记(69)

    http://www.cnblogs.com/yuxc/archive/2012/02/09/2344474.html Chapter8    Analyzing Sentence Structure ...

  6. Python自然语言处理学习笔记之信息提取步骤&分块(chunking)

    一.信息提取模型 信息提取的步骤共分为五步,原始数据为未经处理的字符串, 第一步:分句,用nltk.sent_tokenize(text)实现,得到一个list of strings 第二步:分词,[ ...

  7. Python自然语言处理学习笔记之选择正确的特征(错误分析 error analysis)

    选择合适的特征(features)对机器学习的效率非常重要.特征的提取是一个不断摸索的过程(trial-and-error),一般靠直觉来发现哪些特征对研究的问题是相关的. 一种做法是把你能想到的所有 ...

  8. Requests:Python HTTP Module学习笔记(一)(转)

    Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...

  9. python网络爬虫学习笔记

    python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...

随机推荐

  1. OPENCV形态学算法-2

    一.漫水填充算法 该算法通过一个指定的种子点,来分析整张图片上的像素,并设置像素差异阈值,在阈值类的点,最后变成相同的颜色.该方法通过上下限和连通方式来达到不同的连通效果. 该方法常用与标记和分离图像 ...

  2. Spring自学教程-介绍、特点、框架(一)

    一.spring是什么,有什么用? 一句话:面向企业应用,使用javabean代替ejb的java应用或web开发. 侵入式的做法就是要求用户代码"知道"框架的代码,表现为用户代码 ...

  3. UVA 10689 Yet another Number Sequence

    简单矩阵快速幂. if(m==1) MOD=10; if(m==2) MOD=100; if(m==3) MOD=1000; if(m==4) MOD=10000; 剩下的就是矩阵快速幂求斐波那契数列 ...

  4. iOS开发——发短信,邮件

    在IOS开发中,有时候我们会需要用到邮件发送的功能.比如,接收用户反馈和程序崩溃通知等等,这个功能是很常用的.在苹果系统中,如果彼此的手机都是iOS设备,并且开通了iMessage功能,那么彼此之间的 ...

  5. APP被苹果APPStore拒绝的各种原因 分类: ios相关 app相关 2015-06-25 17:27 200人阅读 评论(0) 收藏

    APP被苹果APPStore拒绝的各种原因 1.程序有重大bug,程序不能启动,或者中途退出. 2.绕过苹果的付费渠道,我们之前游戏里的用兑换码兑换金币. 3.游戏里有实物奖励的话,一定要说清楚,奖励 ...

  6. FIFO存储器

    FIFO( First In First Out)简单说就是指先进先出.由于微电子技术的飞速发展,新一代FIFO芯片容量越来越大,体积越来越小,价格越来越便宜.作为一种新型大规模集成电路,FIFO芯片 ...

  7. [转载] centos6.x x64 安装python2.7

    本文转载自: http://www.centoscn.com/image-text/install/2016/0323/6906.html CentOS的设计理念中有一点是:持久可用.要达到这个目的, ...

  8. [题解]bzoj 3223 文艺平衡树

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3884  Solved: 2235[Submit][Sta ...

  9. .NET防止重复提交数据

    最近在做一个销售系统的时候,操作人员提交数据的时候数据库竟然会出现多条数据相同的记录,并且是在1秒之内,客户反馈给我们,第一反应是重复提交的问题,检查了下代码,程序执行完成后应该是跳转到别的页面的,可 ...

  10. c#第5章 变量的更多内容 隐式和显式转换、枚举、结构、数组、

    1.目标数据 destination 英[ˌdestɪˈneɪʃn] 美[ˌdɛstəˈneʃən] n. 目的,目标; 目的地,终点; [罕用语] 预定,指定; 2.源数据 source 英[sɔ: ...