您的位置:首页 > 编程语言 > Python开发

Python 文本分类:使用scikit-learn 机器学习包进行文本分类

2015-02-28 17:15 876 查看


我做的项目是对评论进行有用性(helpfulness)分类,把评论分成有用和没用两类。在之前已经有使用机器学习方法进行情感分类了,现在是提取各种可能影响评论有用性的特征之后对文本进行分类。
我分析的数据是手机商品评论,看看我提取了些什么特征(特征和情感分类的特征不一样了。情感分类使用的是词来做特征,但这里用的是已经计算出的各项数值作为特征)。

我提取了(一条评论中的)1.手机名字出现次数;2. 手机品牌出现次数;3. 手机的属性(如屏幕、速度、拍照等);4. 评论的词数;5. 评论的句子数;6. 形容词数;7. 副词数;8. 动词数;9. 平均每句的词数;10. 信息熵;11. 困惑值;12. 积极情感概率;13. 消极情感概率;14. 积极词典匹配总分值;15. 消极情感匹配总分值;16.
积极分值的均值;17. 积极分值的方差;18. 消极分值均值;19. 消极分值方差;20. 评论与商品描述之间的tf-idf 相似度。
这20个数值特征用来帮助我进行评论有用性的分类。因为我假设这20个特征都能有效识别一条评论是否是“有用的”
要进行有监督的机器学习,就还需要为每条评论添加类标签,类标签既这条评论是“有用”或“没用”。这个可以人工标注的方法来标注,既人为的阅读评论然后标注评论。把“有用”标记为“1”,把“没用”标记为“0”
在提取了特征和类标签之后存储在txt 文档中,形式如下:



第一列为类标签,既表示“有用”的“1”和表示“没用”的“0”。其它的列都是提取出来的分类特征。

========================================================================

接下来就可以把数据导入Python,然后使用scikit-learn 进行分类了。但使用scikit-learn ,需要先了解一点关于numpy 的知识。因为scikit-learn 进行机器学习时的数据的类型是numpy 的矩阵结构。
其实要了解的主要是numpy 的矩阵取值方式,这个网站有非常清楚的图,我直接拿来用了。



numpy 矩阵a有56个元素,取值从0到55。可以看到不同的索引切片方式可以怎么取到不同的值。
其切片形式主要为:矩阵[ 第n:第m, 第p:第q]

一、现在可以把特征和类标签的数据导入Python了。

import numpy as np
f = open('D:/code/Machine Learning/features.txt')f.readline()
data = np.loadtxt(f) #把数据载入Python 之后,用numpy 的数据类型存储起来


二、用随机函数打乱数据,防止分类的时候重复训练测测试一样的数据。

from random import shuffle
shuffle(data)


三、把数据分割为开发集和测试集。

development = data[:4000,:] #4000个数据作为开发集
test = data[4000:,:] #剩余的小部分数据作为测试集
train = development[:,1:]
tag = development[:, 0] #第一列是类标签


四、载入分类算法,把分类算法传递给一个变量。

import sklearn
from sklearn import svm
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
svc = svm.SVC(gamma=0.001, C=100.)lr = LogisticRegression(penalty='l1', tol=0.01)gnb = GaussianNB()


五、使用交叉检验的方法测试分类器的准确度。
交叉检验简单来说就是把数据平均分成n 份,其中n-1 份作为训练集,1份作为测试集,得出一个分类精度。重复n 次,得出n 个分类精度。然后n 次分类精度的平均精度就是最终的分类准确度。
具体如图所示(5折交叉检验):



使用交叉检验可以有效消除一次检验所带来的波动,得出比较合理的分类准确度。

from sklearn import cross_validation
kfold = cross_validation.KFold(len(x1), n_folds=10)

此处使用的是10折交叉检验,既把数据分成10份,其中9份为训练集,1份为测试集。重复10次。

六、使用交叉检验测试不同分类器的准确率。

svc_accuracy = cross_validation.cross_val_score(svc, train, tag, cv=kfold)lr_accuracy = cross_validation.cross_val_score(lr, train, tag, cv=kfold)gnb_accuracy = cross_validation.cross_val_score(gnb, train, tag, cv=kfold)
print 'SVM average accuary: %f' %svc_accuracy.mean()print 'LogisticRegression average accuary: %f' %lr_accuracy.mean()print 'Naive Bayes average accuary: %f' %gnb_accuracy.mean()

结果如下:

SVM average accuary: 0.877000
Logisic regression average accuracy: 0.734333
Naive Bayes average accuracy: 0.686333


接下来还有:
除了准确率这一个分类器效果检验指标之外,还有ROC曲线和AUC(ROC曲线下的面积)。这两个指标也可以检验分类器效果。这两个指标用scikit-learn 也不难实现。
选择最佳分类器之后用测试集检验其最终分类效果。
使用最佳分类器进行分类。
使用不同的特征组合进行分类,寻找最优的特征组合。最优特征组合是对分类识别率最高的因素
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: