分类是为给定的输入选择正确的类标签的任务。标签集是预先定义的。
常见的分类:
- 判断一封邮件是否为垃圾邮件
- 从“体育,政治,技术等分类中”判断一篇报道属于哪个分类
如果分类的建立基于包含每个输入的正确
如果分类的建立基于包含每个输入正确的标签的训练语料,则被称为有监督的分类,使用的框架如下图所示:

训练的时候将每个输入使用特征提取器提取特征,然后和它所对应的标签一起给机器学习算法。分类的时候还是使用相同的特征提取器,提取特征给模型输出它的标签。
性别鉴定
男性和女性的姓名有一些鲜明的特点,以a,e,i结尾的很可能是女性,k,o,r,s结尾的很可能是男性。基于上面的规则编写一个特征提取器。
#定义一个特征提取器
def gender_features(name):
return {"last_latter":name[-1]}
features = gender_features("Alice")
print(features)
#输出:{'last_latter': 'e'}
函数gender_features()就是一个特征提取器,返回值为一个字典被被称为特征集。
import nltk
from nltk.corpus import names
import random
#特征提取器
def gender_features(name):
return {"last_latter":name[-1]}
names = ([(name,'male') for name in names.words('male.txt')] +
[(name,'female') for name in names.words('female.txt')]
)
print(names)
random.shuffle(names)
print(names)
#接下来使用特征提取器处理名称数据,并划分特征集的结果链表为一个训练集和一个测试集。
#训练集用于训练一个新的“朴素贝叶斯”分类器
features = [(gender_features(name),gender) for (name,gender) in names]
train_set,test_set = features[:500],features[500:]
classfier = nltk.NaiveBayesClassifier.train(train_set)
#判断Neo是男是女
print(classfier.classify(gender_features("Neo")))
#输出学习到的分类规则
print("分类规则",classfier.show_most_informative_features())
print("模型准确度",nltk.classify.accuracy(classfier,test_set))

下面是我自己默写的上面这个程序的代码,旨在体会一下有监督分类所使用的框架。莫名其妙代码少了很多,也不知道咋回事。

from nltk.corpus import names
import nltk
#特征提取器
def feature_extrator(name):
return {"last_feature":name[-1]}
#提取特征以及正确的标签
names = ([(feature_extrator(name),"male") for name in names.words('male.txt')] +
[(feature_extrator(name),'female') for name in names.words('female.txt')]
)
print(names)
#训练模型
train_ser,test_ser = names[:500],names[500:]
classfier = nltk.NaiveBayesClassifier.train(train_ser)
#提取待分类语料的特征,调用分类器分类
print(classfier.classify(feature_extrator("Neo")))
选择正确的特征
找出那些特征可能是相关的,以及如何表示它们?这个提供的方法是“不断尝试,依靠直觉猜测”。如果为模型提供太多的特征会导致模型在这个训练集上的测试效果好,在其他模型上的训练效果差,这种现象称为过拟合。
语料数据应该分为两类三部分,开发集(训练集,开发测试集),测试集。开发的时候使用开发测试集查看模型效果,修改程序。测试集用于最终评定模型。

网友评论