利用Python数据挖掘和机器学习的概述
前言:
本文主要描述了使用Python进行数据挖掘业务的优势并介绍了相关的数据处理工具包pandas和机器学习算法库scikit-learn。
为什么使用python进行数据分析?
对很多人来说,Python是一种很容易让人喜爱的语言,自从1991年Python创始以来, Python已经是最受欢迎的动态编程语言之一,其他的类似语言还有Perl,Ruby等等,Python和Ruby变的特别流行是因为他们拥有庞大的网页框架,例如Django(Python),可以方便的搭建网站,这些语言被称为“脚本语言”因为他们经常被用来做一些短小精悍的程序和编写脚本,与底层语言C/C++搭配可以发挥很大的作用。我不喜欢“脚本语言”这个叫法,因为这种叫法包含着这些语言无法胜任任务指向性的软件的意味。在解释执行语言当中,Python以其强大而活跃的科学计算社区而著称,最近几年,Python科学计算方面的功能在工业界和科学研究界中的应用显著增长。
在数据分析和交互,以及数据挖掘和可视化方面,Python不可避免的被拿来与其他一些主流的广泛使用的开源或商用的编程语言和数据挖掘工具进行比较,例如R(前面几篇文章对R语言进行了调研),MATLAB,SAS,Stata等,最近几年Python在相关的扩展库的帮助下(主要是pandas)已经成为完成数据操控任务强有力的工具,再加上Python相比于其他语言和工具(上述)更加主流的优势,使得python成为了一个用来构建以数据为中心的应用软件的良好选择
Python作为胶水的优势
Python的成功有一部分归结于python作为一个科学计算平台而且拥有对C,C++,FORTRAN代码良好的集成上,大多数现代科学计算环境都有一些遗留下来的C,FORTRAN库来计算一些线性代数,最优化,组合数学,快速傅立叶变换等方面的算法,很多企业和国家实验室也利用python来粘合那些已经使用了30多年的遗留软件系统。
大多数工程代码都是由只占代码量很小一部分却占去大量运行时间的核心代码和占了代码量大部分但运行次数不多的“胶水”代码组成的,通常情况下,胶水代码的运行时间是比较微不足道的,我们通常将努力用在对核心代码的优化上来突破计算速度的瓶颈,
所以这时候需要讲核心代码转为一些速度较快的底层语言比如说C
最近,the Cython project已经成为了一种受欢迎的方式来使用python构建可以快速编译和扩展的应用,并且集成了C/C++代码来提升性能。
解决“两种语言”的问题
在很多组织当中,有一种相当普遍的情况是在研究,测试新idea,雏形描述时使用一种专注于计算的语言比如说MATLAB或者R然后将这些想法变为一个大的产品系统的一个接口,通常这个产品系统通常是用的C++或者JAVA写的,现在大家发现Python不仅可以用来进行研究和雏形的描述,还可以用来构建实际的生产系统,
越来越多的企业意识到通过python让技术人员和科研人员使用同一种语言的好处。
python的缺点
尽管python是搭建计算指向型应用软件和大部分普通用途的系统的完美环境,但是下面几点python存在短板
运行速度
python作为解释执行语言,这一点意味着python代码比同样的用编译型语言写成的代码要慢,比如在一些高频率交易系统中,需要较高的运行速度,这时需要用C++来编写,但是数据挖掘业务当前的构思应用场景例如用户离网和增值业务推荐主要是用SCF生成的数据进行训练然后进行预测,所以对运算速度要求不高。
并发性
python并不是一种适合做高并发和多线程应用的语言,原因是python自身的GIL机制,(GIL机制在此处不多描述),但是我们的业务场景并不直接使用python来做多线程,而是利用SCF(C++)具有高并发的特点,可以方便的进行多线程调用python,所以这个缺点在我看来也不造成影响
并且随着各个开源框架的实现,使用python做并发也不是不可以
进行数据挖掘工作必要的python库
Numpy
Numpy是Numerical Python的缩写,是利用python进行科学计算的最基础的包,包含了实现算法所必需的数据结构
快速而高效的多维数组对象:ndarry
提供多种多维数组运算的方法
对基于多维数组的数据集合读写到硬盘的工具
线性代数运算符,傅立叶变换,随机数生成
将C/C++,FORTRAN代码集成到python中的工具
Numpy除了提供给python快速计算多维数组(矩阵)运算能力,多维数组还有一个主要用途是用来做在算法间传递数据的容器,对数值型数据来说,Numpy的多位数组在存储和计算数据时是一种比其他python内置类型有效很多的方式,而且,用底层语言写成的库,比如C或者FORTRAN,可以直接操纵多维数组中的数据。
pandas
pandas提供了丰富的数据结构和函数,可以对结构化数据进行快速简易并且易于表达的处理工作,pandas严格的要素使python成为了一种强力并且高产的数据分析环境,经常被使用的pandas主要对象是DataFrame(数据框)——一种二维表,拥有行列标签并且按列存储,例如
![Data Frame](/Users/wenxiaole/Desktop/[email protected] =500x)
pandas把Numpy在多维数组运算方面良好的表现和对电子表格(xls)和关系型数据库灵活操作特点结合了起来(这一点很重要,因为要对从关系型数据库到处的结果进行直接操纵),pandas提供了复杂精细的索引功能可以进行矩阵的行,列变换,切片,切块,聚合,挑选特定数据子集的操作。
对于金融行业的用户,pandas提供了大量适用于金融数据的高性能时间序列功能和工具。
对于使用R语言进行统计计算的用户,肯定不会对DataFrame这个名字感到陌生,
因为它源自于R的data,frame对象,但是这两对象并不相同,R的data.frame对象所提供的功能只是DataFrame对象所提供的功能的一个子集。
matplotlib
matplotlib是最流行的用于绘制数据图表的python库,目前有一个庞大的开发人员团队维护,它非常适合创建出版物上的图标,它跟IPython结合得很好,因而提供了一种非常好用的交互式数据回吐环境,绘制的图标也是交互式的。可以利用绘图窗口的工具栏放大图标中的某个区域或对整个图标进行平移浏览。
IPython
IPython是python科学计算标准工具集的组成部分,它将其它所有的东西联系到了一起,它为交互式和探索式计算提供了一个强健而高效的环境,它是一个增强版的python shell,目的是提高编写,测试,调试python代码的速度,它主要用于交互式数据处理和利用matplotlib对数据进行可视化处理。
除标准的基于终端的IPython shell外,该项目还提供了:
一个类似于Mathematica的HTML笔记本
一个基于Qt框架的GUI控制台,其中含有绘图,多行编辑以及语法高亮等功能
用于交互式并行和分布式计算的基础架构
SciPy
SciPy是一组专门解决科学计算中各种标准问题域的包的集合,主要包括下面这些包:
scipy.integrate:数值积分和微分方程求解器
scipy.linalg:扩展了有numpy.linalg提供的线性代数例程和矩阵分解功能
scipy.optimize:函数优化器以及根查找算法
scipy.signal:信号处理工具
scipy.sparse: 稀疏矩阵和稀疏线性系统求解器
scipy.special:实现了许多数学函数的包装器
scipy.stats: 标准连续和离散概率分布,各种统计检验方法以及更好的描述统计法
scipy.weave: 利用内联C++代码加速数组计算的工具
NumPy和SciPy的有机结合完全可以替代MATLAB的计算功能
scikit-learn
scikit-learn是一个强大的基于python的机器学习数据挖掘算法库,封装了基本所有主流的机器学习算法并且使用起来规整方便。开源并且可供商业应用,它依赖于NumPy,SciPy,matplotlib,基于BSD开源许可证,这个项目最早由DavidCournapeau在2007年发起的,目前也是由很多活跃的社区自愿者进行维护,并且拥有谷歌的经费。
scikit-learn在工业界已经被很多有数据挖掘需求的企业所采纳,下面这些企业已经在他们的数据挖掘业务中使用scikit-learn,其中有电信企业,业务场景与我们的类似
scikit-learn的基本功能主要被分为六个部分,分类,回归,聚类,数据降维,模型选择,数据预处理,具体可以参考官方网站上的文档。