附录 接下来的方向
全书正文部分至此已结束,学习本书的过程中,也许你已经注意到有很多路我们没有走,遇到多种选择的情况,我们可能只讲了其中几种,还有些主题没有充分展开。在附录部分,我整理了各章进一步学习方向,便于那些意犹未尽的读者深入学习,继续提升用Python挖掘数据的能力。如果你乐于接受挑战的话,本章不容错过。
附录按照章节来组织,每章给出与数据挖掘相关的文章、书籍或其他资源,同时还就该章挖掘任务提出新的挑战,有时只让读者做些小改进,但也给出了几个工作量比较大的挑战——对于难度较大的任务,介绍内容也会更多一些。
第 1 章——开始数据挖掘之旅
Scikitlearn
教程
http://scikitlearn.org/stable/tutorial/index.html
scikitlearn
文档提供了一系列数据挖掘教程。教程涵盖范围广,从适合新手把玩的数据集一直介绍到最近研究所用的技术。
想从头到尾学一遍这个教程,不肯下功夫是不行的——这份教程很全面——也值得在上面下功夫。
扩展IPython Notebook
http://ipython.org/ipython-doc/1/interactive/public_server.html
IPython Notebook功能强大,扩展方式很多,比如可以在别的计算机上创建服务器,运行笔记本文件,在你的主计算机上访问即可。如果你的主计算机性能一般,比如配置还算凑合的笔记本电脑,而其他可以供你支配的计算机性能很好,使用IPython Notebook在性能不错的计算机运行服务器是个好主意。此外,你还可以创建节点,采用并行方式处理数据。下面网站有不少数据集,一并分享给你。
http://archive.ics.uci.edu/ml/。
网上有很多由学术、商业和政府机构提供的数据集。UCI 机器学习数据库里有一系列标注好的数据集,用它们来测试算法很不错。
尝试下看看OneR算法在不同数据集上的表现。
第 2 章——用scikitlearn
估计器分类
k近邻算法的扩展
https://github.com/jnothman/scikitlearn/tree/pr2532
k-近邻算法的简单实现速度很慢——它查看任意两个数据点是否足够近。当然还有更好的方法,scikitlearn
实现了几种.。例如,我们可以用kd-tree提升算法速度。
另外一种提升搜索速度的方法叫作局部敏感散列(Locality-Sensitive Hashing,LSH )。这是对scikitlearn
提出的一项改进,写作本书时,还没有加到scikit
库中。上述链接为scikitlearn
库的一个开发分支,你可以在数据集上测试LSH。具体方法还请参考该分支的相关文档。
复制代码仓库,按照下述网址给出的方法,安装最新版本:http://scikitlearn.org/stable/install.html。
记住要使用这个Git仓库的代码,而不要使用官方的代码。我建议你使用virtualenv
或虚拟机安装,不要直接将其装到你的计算机上。这里有一份很棒的virtualenv
教程:http://docs.pythonguide.org/en/latest/dev/virtualenvs/。
更多复杂的流水线
http://scikitlearn.org/stable/modules/pipeline.html#featureunion-composite-feature-spaces
书中所用到的流水线都是线性的——上一步的输出作为下一步的输入。
流水线也遵循转换器和估计器的接口——流水线可以嵌套,方便构造更复杂的模型,再结合使用上述链接提到的FeatureUnion1方法,流水线将变得更加强大。
1FeatureUnion:将多个转换器对象结合在一起,组成一个新的转换器,汇总每个转换器的输出结果。——译者注
这样一次可以抽取多种类型的特征,组成新的数据集。更多细节及示例请见:http://scikitlearn.org/stable/auto_examples/feature_stacker.html。
比较分类器
scikitlearn
提供了很多分类器。在选择分类器时,我们需要考虑一系列因素。你可以通过比较它们的F1值确定哪种效果更好。通过计算各F1值的标准差,就能确定几个分类器的分类效果之间的差异是否显著。
另外需要注意的是,几个分类器应该使用相同的训练集和测试集——也就是说,第一个分类器的测试数据,应该跟其他所有分类器的测试数据相同。使用相同的随机状态可以保证这一 点——对于重现实验结果很重要。
第 3 章——用决策树预测获胜球队
pandas的更多内容
http://pandas.pydata.org/pandas-docs/stable/tutorials.html
pandas库很周到——你加载数据时所能用到的各种功能,它很可能都已实现了。更多内容请见上面的链接。
Chris Moffitt 写了篇很不错的博文,介绍常见的Excel数据处理任务,如何用pandas完成:http://pbpython.com/excel-pandas-comp.html。
你还可以用pandas处理大数据集;可以看下StackOverflow用户Jeff对以下问题的解答(写作本书时2是最佳答案),了解处理过程:http://stackoverflow.com/questions/14262433/large-data-work-flows-using-pandas。
2翻译本书时依旧是最佳答案。——译者注
Brian Connelly的pandas教程也很棒:
http://bconnelly.net/2013/10/summarizing-data-in-python-with-pandas/。
更多复杂特征
http://www.basketball-reference.com/teams/ORL/2014_roster_status.html
每个赛季不同的比赛,上场队员也会有所不同。本来志在必得的比赛,很可能因为核心球员受伤而打得很艰难。你可以从篮球参考网站找到球队的队员名单。例如,上述链接指向的就是2013—2014赛季奥兰多魔术队(Orlando Magic)球员名单——所有NBA球队的类似数据都能从该网站找到。
编写代码,整合队员异动信息,以此作为新特征,可以有效提升模型表现,但是工作量不小!
第 4 章——用亲和性分析方法推荐电影
新数据集
http://www2.informatik.uni-freiburg.de/~cziegler/BX/
很多用于特定领域推荐任务的数据集,都值得探索。例如,Book-Crossing数据集包含来自27.8万用户的100多万条图书打分信息。有些评价信息很明确(用户给出分数),而有些则很模糊。模糊评价的权重不应该跟明确评价的一样高。
音乐网站www.last.fm公开了可用于音乐推荐的数据集:http://www.dtic.upf.edu/~ocelma/MusicRecommendationDataset/。
这里有一个用于笑话推荐的数据集!请见http://eigentaste.berkeley.edu/dataset/。
Eclat算法
http://www.borgelt.net/eclat.html
本章实现的Apriori算法是最常用的关联规则挖掘算法,但不是最好的。比较而言,Eclat算法更年轻也更强大,实现起来也比较容易。
第 5 章——用转换器抽取特征
增加噪音
本章讲到了如何通过删除噪音来提升性能;然而,有些数据集需要增加噪音。原因很简单——防止分类器过拟合训练数据,从而生成适用性更强的规则(但过多的噪音会导致模型过于宽泛,效果反而不好)。尝试实现往数据集中添加噪音的转换器。在UCI ML的数据集上进行测试,看看能否提升在测试集上的表现。
Vowpal Wabbit
Vowpal Wabbit项目用于快速从文本中抽取特征。它针对Python进行了封装,可以直接在Python代码中调用。在大数据集上试试它的效果,比如第12章使用的博客语料。
第 6 章——使用朴素贝叶斯进行社会媒体挖掘3
3社会媒体挖掘相关技术可参考人民邮电出版社出版的《社会媒体挖掘》一书。——编者注
垃圾信息监测
http://scikitlearn.org/stable/modules/model_evaluation.html#scoring-parameter
我们用本章所学到的内容,就可以创建用来监测社会媒体广播是否为垃圾消息的应用。你可以尝试创建由垃圾广播/正常广播组成的数据集,实现文本挖掘算法,评估结果。
垃圾监测算法需要考虑假阳性和假阴性的情况。很多人宁愿多浏览几条垃圾信息,也不愿因为垃圾过滤器过于强大而错过合法的信息。为了满足人们这一需求,你可以把F1值作为评估标准,用网格搜索寻找合适的参数值,具体方法请见上面链接。
自然语言处理和词性标注
http://www.nltk.org/book/ch05.html
本章我们所用到的技术比起其他领域使用的复杂语言模型算是轻量级。例如,别的模型可能使用词性标注来消除同形异义词的歧义,提升准确性。NLTK配套的书4有一章专门讲这个问题,详细内容请见上面的链接。全书也很值得一读。
4中文版书名为《Python自然语言处理》,国内还可以找到英文版的影印版。据NLTK官网介绍2016年上半年将出版第2版。——译者注
第 7 章——用图挖掘找到感兴趣的人
更复杂的算法
https://www.cs.cornell.edu/home/kleinber/link-pred.pdf
关于如何预测包括社交网络在内的图结构中节点之间是否存在边,已经有大量相关研究。例如,David Liben-Nowell和Jon Kleinberg曾就这一主题发表了一篇论文,对于更复杂算法的设计很有帮助,论文请见上面的链接。
NetworkX
如果你以后经常处理图和网络结构,深入研究NetworkX很有必要——可视化选项很好用,算法实现也非常不错。另外一个叫作SNAP的库也针对Python做了封装,请见http://snap.stanford.edu/snappy/index.html。
第 8 章——用神经网络破解验证码
好(坏?)验证码
http://scikitimage.org/docs/dev/auto_examples/applications/plot_geometric.html
我们所破解的验证码比起如今网站常用的要简单不少。你可以使用以下技巧来提升破解难度:
采用不同的转换方法。比如
scikitimage
所提供的(请见上面链接)使用不同的颜色;尝试无法很好转换为灰度模式的颜色
在图像中添加线条或其他形状:http://scikitimage.org/docs/dev/api/skimage.draw.html
深度网络
使用上述技巧产生的验证码会愚弄我们的破解工具,我们只好改进它。尝试使用第11章的深度网络。
网络越大,需要更多数据,因此你可能需要生成几千张验证码图像以达到好的效果。数据集的生成适合用并行方式来处理——因为它包含大量可以被分别处理的小任务。
增强学习
http://pybrain.org/docs/tutorial/reinforcement-learning.html
数据挖掘领域的下一个方向——增强学习势头日猛,虽然它的出现已经有一段时间了!PyBrain提供了几种增强学习算法,值得在刚创建的验证码数据集上一试(其他数据集也行!)。
第 9 章——作者归属问题
增加数据量
本章预测发件人的应用只使用了一部分邮件,数据集中还有很多邮件可以用。增加发件人的数量可能会导致正确率下降,但是使用相似的方法也有可能提升算法的表现。N元语法中的N以及参数到底取什么值,支持向量机能达到最佳效果,使用网格搜索就能解决这两个问题。我们争取在发件人数量很多的情况下,也能取得好的效果。
博客语料
第12章博客语料给出了博主编号(每个编号代表一个博主),把博主编号看成是类别,就能将其用作本章实验语料。此外,性别、年龄、行业和星座都可以作为分类任务来进行预测——解决作者归属的方法擅长处理这些分类问题吗?
局部N元语法
https://github.com/robertlayton/authorship_tutorials/blob/master/LNGTutorial.ipynb
另外一种分类器使用局部N元语法,从每个作者的作品而不是全部作者的作品中选择最佳特征。我写了一篇用局部N元语法解决作者归属问题的教程,请见上面链接。
第 10 章——新闻语料分类
算法评价
聚类算法效果评价是个大难题——一方面,我们也能多少知道好的分簇结果应该是什么样子;另一方面,如果我们确实知道,那就应该标注一部分数据,使用有监督的分类器对数据进行分类!该话题相关文章很多。下面这份文档介绍了聚类算法评价的难点所在:
http://www.cs.kent.edu/~jin/DM08/ClusterValidation.pdf
这里有份关于该主题的更全面(虽然有点过时)的一份文档:http://web.itu.edu.tr/sgunduz/courses/verimaden/paper/validity_survey.pdf。
scikitlearn
实现了几种评价方法,对它们的综述请见http://scikitlearn.org/stable/modules/clustering.html#clustering-performance-evaluation。
有了这些方法,你就能评估使用哪些参数值可以取得更好的聚类效果。网格搜索能帮助我们找到参数的最佳取值——就像在分类中用到的那样!
近期趋势分析
你可以运行我们本章编写的代码几个月。为期间发现的每个簇添加几个标签,便于我们了解哪些主题一直很活跃,从而了解近几个月全世界新闻焦点。
我们可以使用调整互信息等评价标准,比较聚类结果,请见上面评价方法综述链接。观察下一个月、两个月、半年和一年之后聚类的变化结果。
实时聚类
k-means算法可以随着时间的推进,不断训练和更新,而不是在给定时间内做离散分析。你可以通过几种方法跟踪聚类变化——例如,跟踪每个簇中频率最高的几个单词或质心点每天移动的距离。别忘了网站API使用上限——你可能只需要每隔几个小时检查下有无新数据,就能保证结果是实时的。
第 11 章——用深度学习方法为图像中的物体进行分类
Keras和Pylearn2
如果你想进一步了解如何用Python做深度学习,Keras和Pylearn2这两个库有必要了解一下。它们都是以Theano
为基础,但各有各的使用方法和特点。
Keras请见https://github.com/fchollet/keras/。
Pylearn2请见http://deeplearning.net/software/pylearn2/。
写作本书时,这两个库还不成熟,比较起来Pylearn2更稳定。它们都能很好完成你交给它们的任务,在做其他深度学习项目时,可以尝试用下。
另外一个很火的库叫Torch,但是写作本书时,还没有Python接口可用(请见http://torch.ch/)。
Mahotas
Mahotas图像处理包提供更好和更复杂的图像处理方法,使用它们能提升正确率,虽然计算量可能大幅上升。然而,很多图像处理任务适合并行处理,所以计算量加大也不再是问题。图像分类相关研究资料很多,下面这两份文档给出不少资料,可以先从这里找起:
http://luispedro.org/software/mahotas/.
http://ijarcce.com/upload/january/22-A%20Survey%20on%20Image%20Classification.pdf
其他图像数据集有:
http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html
一些学术机构和行业组织也开放了很多图像数据集。上述网站介绍了很多数据集及使用它们的最好算法。要实现这样的一些好算法需要大量代码,但是回报远大于付出。
第 12 章——大数据处理
Hadoop课程
雅虎和谷歌面向不同水平的开发者提供了一系列非常实用的Hadoop课程。虽然侧重点不在Python,但是了解Hadoop概念后,再把它们应用到Pydoop或其他类似的库都能取得很好的效果。
雅虎的课程:https://developer.yahoo.com/hadoop/tutorial/。
谷歌的课程:https://cloud.google.com/hadoop/what-is-hadoop。
Pydoop
Pydoop是一个用来运行Hadoop任务的Python库——教程请见http://crs4.github.io/pydoop/tutorial/index.html。
Pydoop可以跟HDFS配合使用,mrjob有类似功能,但在运行某些任务时,Pydoop能给你更多的控制权。
推荐引擎
创建大型的推荐引擎是测试你大数据技能的好方法。Mark Litwintschik在他的博文中介绍了如何使用大数据技术Apache Spark创建推荐引擎,详见http://tech.marksblogg.com/recommendation-engine-spark-python.html。
更多资源
Kaggle竞赛:www.kaggle.com/
Kaggle定期举行数据挖掘竞赛,一般都会提供奖金。参加Kaggle竞赛是学习处理真实场景数据挖掘任务的好方法。他们的社区用户友善、乐于分享——通常你能见到竞赛前10名选手分享代码!
Coursera在线学习网站:
Coursera网站上有很多关于数据挖掘和数据科学的课程,大多是专注于某个方向,比如有专门讲大数据和图像处理的。吴恩达(Andrew Ng)老师的机器学习课程综合性强,涉及面比较广,这门课程很受欢迎,从它开始学起很不错:https://www.coursera.org/learn/machine-learning/。
这门课所讲的内容比本书难度要大一点,感兴趣的读者可以将其作为今后的学习方向。
神经网络方面,请留意下这门课程:https://www.coursera.org/course/neuralnets。
如果你完成了上述课程的学习,可以关注下这门关于概率图模型的课程:https://www.coursera.org/course/pgm。