用scipy(scikit-learn)做文本分类

标签: scipy scikit learn | 发表时间:2014-04-14 04:53 | 作者:abcjennifer
出处:http://blog.csdn.net

文本挖掘的paper没找到统一的benchmark,只好自己跑程序,走过路过的前辈如果知道20newsgroups或者其它好用的公共数据集的分类(最好要所有类分类结果,全部或取部分特征无所谓)麻烦留言告知下现在的benchmark,万谢!

嗯,说正文。 20newsgroups官网上给出了3个数据集,这里我们用最原始的 20news-19997.tar.gz


分为以下几个过程:

  • 加载数据集
  • 提feature
  • 分类
    • Naive Bayes
    • KNN
    • SVM
  • 聚类
说明: scipy官网上有参考,但是看着有点乱,而且有bug。本文中我们分块来看。

Environment:Python 2.7 + Scipy (scikit-learn)

1.加载数据集
20news-19997.tar.gz下载数据集,解压到scikit_learn_data文件夹下,加载数据,详见code注释。
#first extract the 20 news_group dataset to /scikit_learn_data
from sklearn.datasets import fetch_20newsgroups
#all categories
#newsgroup_train = fetch_20newsgroups(subset='train')
#part categories
categories = ['comp.graphics',
 'comp.os.ms-windows.misc',
 'comp.sys.ibm.pc.hardware',
 'comp.sys.mac.hardware',
 'comp.windows.x'];
newsgroup_train = fetch_20newsgroups(subset = 'train',categories = categories);


可以检验是否load好了:
#print category names
from pprint import pprint
pprint(list(newsgroup_train.target_names))

结果:
['comp.graphics',
 'comp.os.ms-windows.misc',
 'comp.sys.ibm.pc.hardware',
 'comp.sys.mac.hardware',
 'comp.windows.x']







2. 提feature:
刚才load进来的newsgroup_train就是一篇篇document,我们要从中提取feature,即词频啊神马的,用fit_transform
#newsgroup_train.data is the original documents, but we need to extract the 
#TF-IDF vectors inorder to model the text data
from sklearn.feature_extraction.text import TfidfVectorizer, HashingVectorizer
#vectorizer = TfidfVectorizer(sublinear_tf = True,
#                           max_df = 0.5,
#                           stop_words = 'english');
#however, Tf-Idf feather extractor makes the training set and testing set have
#divergent number of features. (Because they have different vocabulary in documents)
#So we use HashingVectorizer
vectorizer = HashingVectorizer(stop_words = 'english',non_negative = True,
                               n_features = 100)
fea_train = vectorizer.fit_transform(newsgroup_train.data)
#return feature vector 'fea_train' [n_samples,n_features]
print 'Size of fea_train:' + repr(fea_train.shape)
#11314 documents, 130107 vectors for all categories
print 'The average feature sparsity is {0:.3f}%'.format(
fea_train.nnz/float(fea_train.shape[0]*fea_train.shape[1])*100);

结果:
Size of fea_train:(2936, 100)
The average feature sparsity is 51.183%
因为我们只取了100个词,即100维feature,稀疏度还不算低。而实际上用TfidfVectorizer统计可得到上万维的feature,我统计的全部样本是13w多维,就是一个相当稀疏的矩阵了。






3. 分类
3.1 Multinomial Naive Bayes Classifier
见代码&comment,不解释
######################################################
#Multinomial Naive Bayes Classifier
print '*************************\nNaive Bayes\n*************************'
from sklearn.naive_bayes import MultinomialNB
from sklearn import metrics
newsgroups_test = fetch_20newsgroups(subset = 'test',
                                     categories = categories);
fea_test = vectorizer.fit_transform(newsgroups_test.data);
#create the Multinomial Naive Bayesian Classifier
clf = MultinomialNB(alpha = 0.01) 
clf.fit(fea_train,newsgroup_train.target);
pred = clf.predict(fea_test);
calculate_result(newsgroups_test.target,pred);
#notice here we can see that f1_score is not equal to 2*precision*recall/(precision+recall)
#because the m_precision and m_recall we get is averaged, however, metrics.f1_score() calculates
#weithed average, i.e., takes into the number of each class into consideration.

注意我最后的3行注释,为什么f1≠2*(准确率*召回率)/(准确率+召回率)

其中,函数calculate_result计算f1:

def calculate_result(actual,pred):
    m_precision = metrics.precision_score(actual,pred);
    m_recall = metrics.recall_score(actual,pred);
    print 'predict info:'
    print 'precision:{0:.3f}'.format(m_precision)
    print 'recall:{0:0.3f}'.format(m_recall);
    print 'f1-score:{0:.3f}'.format(metrics.f1_score(actual,pred));
    


3.2 KNN:

######################################################
#KNN Classifier
from sklearn.neighbors import KNeighborsClassifier
print '*************************\nKNN\n*************************'
knnclf = KNeighborsClassifier()#default with k=5
knnclf.fit(fea_train,newsgroup_train.target)
pred = knnclf.predict(fea_test);
calculate_result(newsgroups_test.target,pred);


3.3 SVM:

######################################################
#SVM Classifier
from sklearn.svm import SVC
print '*************************\nSVM\n*************************'
svclf = SVC(kernel = 'linear')#default with 'rbf'
svclf.fit(fea_train,newsgroup_train.target)
pred = svclf.predict(fea_test);
calculate_result(newsgroups_test.target,pred);


结果:
*************************
Naive Bayes
*************************
predict info:
precision:0.448
recall:0.448
f1-score:0.447
*************************
KNN
*************************
predict info:
precision:0.415
recall:0.405
f1-score:0.406
*************************
SVM
*************************
predict info:
precision:0.440
recall:0.438
f1-score:0.438





4. 聚类

######################################################
#KMeans Cluster
from sklearn.cluster import KMeans
print '*************************\nKMeans\n*************************'
pred = KMeans(n_clusters=5)
pred.fit(fea_test)
calculate_result(newsgroups_test.target,pred.labels_);


结果:

*************************
KMeans
*************************
predict info:
precision:0.177
recall:0.176
f1-score:0.171


本文全部代码下载: 在此


关于Python更多的学习资料将继续更新,敬请关注本博客和新浪微博 Rachel Zhang





作者:abcjennifer 发表于2014-4-13 20:53:15 原文链接
阅读:306 评论:0 查看评论

相关 [scipy scikit learn] 推荐:

用scipy(scikit-learn)做文本分类

- - CSDN博客研发管理推荐文章
文本挖掘的paper没找到统一的benchmark,只好自己跑程序,走过路过的前辈如果知道20newsgroups或者其它好用的公共数据集的分类(最好要所有类分类结果,全部或取部分特征无所谓)麻烦留言告知下现在的benchmark,万谢. 20newsgroups官网上给出了3个数据集,这里我们用最原始的 20news-19997.tar.gz.

使用 Scikit-learn 的进行 KNN 分类

- - 标点符
最近邻(KNN)是一种非常简单、易于理解、通用性强的机器学习算法,广泛应用于金融、医疗、政治、手写检测、图像识别、视频识别等领域. 在信用评级中,金融机构会预测客户的信用评级. 在贷款支付中,银行机构将预测贷款是否安全或有风险. 在政治学中,将潜在选民分为两类,要么投票,要么不投票. 上一篇《 K-近邻算法KNN学习笔记》主要讲解的是KNN的理论内容,今天主要学习怎么用KNN进行实战.

scikit-learn中的文本特征提取

- - 标点符
文本分析是机器学习算法的主要应用领域. 由于大部分机器学习算法只能接收固定长度的数值型矩阵特征,导致文本字符串等并不能直接被使用,针对此问题scikit-learn提供了将文本转化为数值型特征的方法,今天就一起来学习下. scikit-learn中的sklearn.feature_extraction.text提供了将文本转化为特征向量的工具:.

[转][转]机器学习工具:scikit-learn/Weka

- - heiyeluren的blog(黑夜路人的开源世界)
开源机器学习工具scikit-learn入门. Scikit-Learn是基于python的机器学习模块,基于BSD开源许可证. 这个项目最早由DavidCournapeau 在2007 年发起的,目前也是由社区自愿者进行维护. Scikit-Learn的官方网站是 http://scikit-learn.org/stable/,在上面可以找到相关的Scikit-Learn的资源,模块下载,文档,例程等等.

基于Spark自动扩展scikit-learn (spark-sklearn) - CSDN博客

- -
1、基于Spark自动扩展scikit-learn(spark-sklearn). Spark MLlib 将传统的单机机器学习算法改造成分布式机器学习算法,比如在梯度下降算法中,单机做法是计算所有样本的梯度值,单机算法是以全体样本为计算单位;而分布式算法的逻辑是以每个样本为单位,在集群上分布式的计算每个样本的梯度值,然后再对每个样本的梯度进行聚合操作等.

Scikit-learn玩得很熟了?这些功能你都知道吗?

- - 机器之心
分享一些Scikit-learn程序包里鲜有人知的遗珠功能. Scikit-learn是Python所有的机器学习程序包中,你必须掌握的最重要的一个包,它包含各种分类算法,回归算法和聚类算法,其中包括支持向量机、随机森林、梯度提升、k均值和基于密度的聚类算法(DBSCAN),且旨在与Python数值库NumPy和科学库SciPy进行相互配合.

【笔记】第四章:从线性回归到逻辑回归-Mastering Machine Learning With scikit-learn

- -
(这章起换用Markdown). 《Mastering Machine Learning With scikit-learn》是一本非常实用的机器学习实战书籍,它使用通俗易懂的语言和适度的理论知识来帮助python开发者使用scikit-learn机器学习工具包实现机器学习相关算法的应用. 早些时候我拜读了这本书,记了些笔记和重要的知识点,今天重新温习了遍,仍有收获,顺便张贴到博客上,一起学习交流.

免费电子书:《Learn Vimscript the Hard Way》

- sunxphere - LinuxTOY
Vim 令人喜爱的地方之一是它支持通过插件来扩展自己,从而满足不同用户的需要. 如果你想为 Vim 编写插件,那么就必须学习 Vimscript 这个内建于 Vim 中的脚本语言. Steve Losh 的《Learn Vimscript the Hard Way》这本免费的电子书恰好可以让你对 Vimscript 上手.

网络图书:《Learn Ruby The Hard Way》繁体版本

- MessyCS - 道喜技术日记 .^. 天天红玉世界
《Learn Ruby The Hard Way》繁体版本.

创业公司必学军规——The Hardest Lessons for Startups to Learn

- - CSDN博客互联网推荐文章
Paul Graham根据Y Combinator多年来孵化创业公司的经验,总结了创业公司必须要学会的经验教训. 那些成功的创业公司之所以成功,很大一定程度是他们快速学习到了这些本领. 1、尽快发布新版本(Release Early). 这也是我们多次强调的创业秘诀:尽早发布V1版本,然后不断快速迭代更新.