性别分类器
无论中文还是英文,男女名字上都有很重要的特征,比如:中文:军,兵这样的名字,男性占绝大多数;霞、燕这样的名字,女性占绝大多数;当然英文中:Jack、John为男性较多,amy、Cassie等等,女性占绝大多数,并且结尾是一个很重要特征,而性别与消费行为、消费心理很多方面都息息相关,而当数据量大时,人工无法完成分类,这时机器学习大显身手!
下面,我们来看看如何来进行性别分类器的设计:
这里,我们用nltk.corpus下name包作为姓名分类标记,当然,首先要下载数据。
然后,将库中性别和姓名对应值(tuple)进行提取,然后,通过姓名尾部1-5个字符,生成训练集(因为数据集完全名字不一定都存在,否则,就不是机器学习了,直接变为查找了,是不是?)。最后,利用分类器进行训练,用户输入数据就可以直接预测了,当然,还得先评估分类器的效果,然后,就可以推出使用了。
(1) 提取性别标记名称,直接调用。
from nltk.corpusimport names
labeled_names =([(name, 'male') for name in names.words('male.txt')] +[(name, 'female') forname in names.words('female.txt')])
为了测试方便,打乱数据:
random.seed(7)
random.shuffle(labeled_names)
(2) 定义一个函数可以提取Word的尾部字符特征,默认为2。
def gender_features(word, num_letters=2):
return {'feature': word[-num_letters:].lower()}
(3) 由于不能使用整个姓名,所以采用1-5字符添加特征值,这样,带有性别特征的数据集范围将扩大。
for i in range(1, 5):
print ('\nNumber of letters:', i)
featuresets = [(gender_features(n, i), gender) for (n, gender) in labeled_names]
(4)我们选择最大熵分类器:classifier = nltk.MaxentClassifier.train(featuresets)。
为了测试,所以一般不直接用全样本featuresets进行训练,大家可以选70%,方法如下:
number=len(featuresets)
train_number=int(number*0.3)
train_set, test_set = featuresets[train_number:],featuresets[:train_number]
classifier = nltk.MaxentClassifier.train(featuresets)改为:nltk.MaxentClassifier.train(featuresets)
(5)对算法和模型进行评估(精确值accuracy,nltk已经提供我们选择分类器之后的评估):
nltk_accuracy(classifier,test_set)
(6)输入测试数据:input_names= ['John', 'Amy', 'Betty']
大家也可以选择朴素贝叶斯分类器观察效果。大家,加油!