博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python自然语言处理学习笔记之选择正确的特征(错误分析 error analysis)
阅读量:5020 次
发布时间:2019-06-12

本文共 2201 字,大约阅读时间需要 7 分钟。

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

  一种做法是把你能想到的所有特征都加进去,然后再检查哪个特征是重要的(参考资料上说这叫"kitchen sink" approach,然而并不明白这是什么意思,请大神指点!),但是包含的特征太多往往会出现过度拟合的现象(即算法会过度依赖于训练集的特征而对新的数据拟合不佳,当训练集较小时,这个问题会更明显。)

  正确方法

  首先确定一个初始特征集,一旦初始特征集确定后,一个比较有效的方法是通过错误分析(error analysis)来改进特征集。

  我们需要将原始数据集分为三部分:

  1、训练集(train set)

  2、开发测试集(dev-test set)

  3、测试集(test set)

其中开发测试集是用来进行错误分析的。

  分好数据集后,我们使用训练集生成一个分类器(有关分类器的生成,可以参考之前的博客-性别分类),再在开发测试集上运行它,最后得出的准确率为0.75,代码如下:

>>> train_set = [(gender_features(n), gender) for (n, gender) in train_names]>>> devtest_set = [(gender_features(n), gender) for (n, gender) in devtest_names]>>> test_set = [(gender_features(n), gender) for (n, gender) in test_names]>>> classifier = nltk.NaiveBayesClassifier.train(train_set)>>> print(nltk.classify.accuracy(classifier, devtest_set))0.75

  然后我们利用开发测试集可以产生一个分类器在预测性别时的错误列表:

>>> errors = []>>> for (name, tag) in devtest_names:...     guess = classifier.classify(gender_features(name))...     if guess != tag:...         errors.append( (tag, guess, name) )

  分析产生的错误列表,就可以知道如何改进特征集(增加,删除,改变)来提高分类的准确率:

>>> for (tag, guess, name) in sorted(errors):...     print('correct={:<8} guess={:<8s} name={:<30}'.format(tag, guess, name))correct=female   guess=male     name=Abigail  ...correct=female   guess=male     name=Cindelyn  ...correct=female   guess=male     name=Katheryncorrect=female   guess=male     name=Kathryn  ...correct=male     guess=female   name=Aldrich

  错误分析的过程如下:从产生的错误列表可以看出,某些后缀特征比用单个字母对区分性别更有效——(虽然以n结尾的名字趋向是男性)但以字母yn结尾的名字多为女性,(以h结尾的名字多为女性),而以ch结尾的多为男性。由此,我们可以对特征提取函数做以下修改:添加每个名字的最后两个字母作为特征,代码如下:

>>> def gender_features(word):...     return {
'suffix1': word[-1:],... 'suffix2': word[-2:]}

  调整后,重建分类器,在开发测试集上运行,分类准确率较之前有所提升0.75-0.78。

>>> train_set = [(gender_features(n), gender) for (n, gender) in train_names]>>> devtest_set = [(gender_features(n), gender) for (n, gender) in devtest_names]>>> classifier = nltk.NaiveBayesClassifier.train(train_set)>>> print(nltk.classify.accuracy(classifier, devtest_set))0.782

  错误分析的过程可以反复进行(事实上也应该如此),但是,注意:每次进行错误分析时都要对训练集,开发测试集重新划分,这样才能保证分类器不会过度拟合开发测试集的个别特征。

转载于:https://www.cnblogs.com/undercurrent/p/4753285.html

你可能感兴趣的文章
Laxcus大数据管理系统2.0(5)- 第二章 数据组织
查看>>
kafka入门样例 for java
查看>>
Redis存储AccessToken
查看>>
Use commons-email-1.1.jar+activation.jar+mail.jar to send Email
查看>>
hdu 2160 Sequence one(DFS)
查看>>
ATM实验感受
查看>>
csharp基础
查看>>
hdu4497 正整数唯一分解定理应用
查看>>
html5 拖曳功能的实现[转]
查看>>
[BZOJ 2049] [Sdoi2008] Cave 洞穴勘测 【LCT】
查看>>
java导出word[xml方式]
查看>>
mysql load_file()和 into outfile
查看>>
响应式布局编码
查看>>
微服务实战(三):深入微服务架构的进程间通信 - DockOne.io
查看>>
Android菜鸟的成长笔记(6)——剖析源码学自定义主题Theme
查看>>
Java:类与继承
查看>>
struts2-(2)HelloWorld
查看>>
python常用函数 库 转
查看>>
第一次爱你得是啥时候
查看>>
Redis4- llist的操作
查看>>