2.3 Python 数据分析工具
Python本身的数据分析功能不强,需要安装一些第三方扩展库来增强它的能力。本书用到的库有Numpy、Scipy、Matplotlib、Pandas、Scikit-Learn、Keras和Gensim等,下面将对这些库的安装和使用进行简单的介绍。
如果读者安装的是Anaconda发行版,那么它已经自带了以下库:Numpy、Scipy、Mat-plotlib、Pandas和Scikit-Learn。
本章主要是对这些库进行简单的介绍,在后面的章节中,会通过各种案例对这些库的使用进行更加深入的说明。本书的介绍是有所侧重的,读者可以到官网阅读更加详细的使用教程。值得一提的是,本书所介绍的扩展库,它们的官网上的帮助文档都相当详细。
用Python进行科学计算是很丰富的学问,本书只是用到了它的数据分析和挖掘相关的部分功能,所涉及的一些库如表2-4所示。读者可以参考书籍《用Python做科学计算》了解更多信息。
表2-4 Python数据挖掘相关扩展库
限于篇幅,我们仅仅介绍本书的案例中会用到的一些库,还有一些很实用的库并没有介绍,如涉及图片处理可以用Pillow(旧版为PIL,目前已经被Pillow代替)、涉及视频处理可以用OpenCV、涉及高精度运算可以用GMPY2等,而对于这些额外的知识,建议读者在遇到相应的问题时,自行到网上搜索相关资料。相信通过对本书的学习后,读者解决Python相关问题的能力一定会大大提高的。
2.3.1 Numpy
Python并没有提供数组功能。虽然列表可以完成基本的数组功能,但它不是真正的数组,而且在数据量较大时,使用列表的速度就会慢得让人难以接受。为此,Numpy提供了真正的数组功能,以及对数据进行快速处理的函数。Numpy还是很多更高级的扩展库的依赖库,后面章节介绍的Scipy、Matplotlib、Pandas等库都依赖于它。值得强调的是,Numpy内置函数处理数据的速度是C语言级别的,因此在编写程序的时候,应当尽量使用它们内置的函数,避免出现效率瓶颈的现象(尤其是涉及循环的问题)。
在Windows中,Numpy安装跟普通的第三方库安装一样,可以通过pip安装:
pip install numpy
也可以自行下载源代码,然后用
python setup.py install
安装。在Linux下上述方面也是可行的。此外,很多Linux发行版的软件源中都有Python常见的库,因此还可以通过Linux自带的软件管理器进行安装,如在Ubuntu下可以用
sudo apt-get install python-numpy
安装。安装完成后,可以使用以下命令进行测试。
代码清单2-1 Numpy基本操作
# -*- coding: utf-8 -* import numpy as np #一般以np作为numpy的别名 a = np.array([2, 0, 1, 5]) #创建数组 print(a) #输出数组 print(a[:3]) #引用前三个数字(切片) print(a.min()) #输出a的最小值 a.sort() #将a的元素从小到大排序,此操作直接修改a,因此这时候a为[0, 1, 2, 5] b= np.array([[1, 2, 3], [4, 5, 6]]) #创建二维数组 print(b*b) #输出数组的平方阵,即[[1, 4, 9], [16, 25, 36]]
Numpy是Python中相当成熟和常用的库,因此关于它的教程有很多,最值得一看的是它官网的帮助文档,还有很多中英文教程,读者遇到相应的问题时,可以自行搜索对应的内容。
参考链接:
http://reverland.org/python/2012/08/22/numpy/。
2.3.2 Scipy
如果说Numpy让Python有了Matlab的味道,那么Scipy就让Python真正地成为了半个Matlab了。Numpy提供了多维数组功能,但它只是一般的数组,并不是矩阵。例如,当两个数组相乘时,只是对应元素相乘,而不是矩阵乘法。Scipy提供了真正的矩阵,以及大量基于矩阵运算的对象与函数。
Scipy包含的功能有最优化、线性代数、积分、插值、拟合、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算,显然,这些功能都是挖掘与建模必备的。
Scipy依赖于Numpy,因此安装它之前得先安装Numpy。安装Scipy的方式与安装Numpy的方法大同小异,需要提及的是,在Ubuntu下也可以用类似的
sudo apt-get install python-scipy
安装Scipy。安装好Scipy后,可以通过以下命令简单试用。
代码清单2-2 Scipy求解非线性方程组和数值积分
# -*- coding: utf-8 -* #求解非线性方程组2x1-x2^2=1,x1^2-x2=2 from scipy.optimize import fsolve #导入求解方程组的函数 def f(x): #定义要求解的方程组 x1 = x[0] x2 = x[1] return [2*x1 - x2**2 - 1, x1**2 - x2 -2] result = fsove(f, [1,1]) #输入初值[1, 1]并求解 print(result) #输出结果,为array([ 1.91963957, 1.68501606]) #数值积分 from scipy import integrate #导入积分函数 def g(x): #定义被积函数 return (1-x**2)**0.5 pi_2, err = integrate.quad(g, -1, 1) #积分结果和误差 print(pi_2 * 2) #由微积分知识知道积分结果为圆周率pi的一半
参考链接:
http://reverland.org/python/2012/08/24/scipy/。
2.3.3 Matplotlib
不论是数据挖掘还是数学建模,都免不了数据可视化的问题。对于Python来说,Matplotlib是最著名的绘图库,它主要用于二维绘图,当然它也可以进行简单的三维绘图。它不但提供了一整套和Matlab相似但更为丰富的命令,让我们可以非常快捷地用Python可视化数据,而且允许输出达到出版质量的多种图像格式。
Matplotlib的安装并没有什么特别之处,可以通过pip install matplotlib安装或者自行下载源代码安装,在Ubuntu下也可以用类似的。
sudo apt-get install python-matplotlib
安装。Matplotlib的上级依赖库相对较多,手动安装的时候,需要逐一把这些依赖库都安装好。安装完成后就可以牛刀小试了,下面是一个简单的作图例子,它基本包含了Matplotlib作图的关键要素,作图效果如图2-5所示。
代码清单2-3 Matplotlib作图的基本代码
# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt #导入Matplotlib x = np.linspace(0, 10, 1000) #作图的变量自变量 y = np.sin(x) + 1 #因变量y z = np.cos(x**2) + 1 #因变量z plt.figure(figsize = (8, 4)) #设置图像大小 plt.plot(x,y,label = '$\sin x+1$', color = 'red', linewidth = 2) #作图,设置标签、 线条颜色、线条大小 plt.plot(x, z, 'b--', label = '$\cos x^2+1$') #作图,设置标签、线条类型 plt.xlabel('Time(s) ') # x轴名称 plt.ylabel('Volt') # y轴名称 plt.title('A Simple Example') #标题 plt.ylim(0, 2.2) #显示的y轴范围 plt.legend() #显示图例 plt.show() #显示作图结果
图2-5 Matplotlib基本的作图例子
如果读者使用的是中文标签,就会发现中文标签无法正常显示。这是由于Matplotlib的默认字体是英文字体所致,解决它的办法是在作图之前手动指定默认字体为中文字体,如黑体(SimHei)。
plt.rcParams['font.sans-serif'] = ['SimHei'] #这两句用来正常显示中文标签
另外,保存作图图像时,负号有可能显示不正常,可以通过以下代码解决:
plt.rcParams['axes.unicode_minus'] = False #解决保存图像是负号'-'显示为方块的问题
这里有一个小建议给读者:有时间多去Matplotlib提供的“画廊”欣赏它做出来的漂亮效果,也许你就慢慢地爱上Matplotlib作图了。(画廊:http://matplotlib.org/gallery.html)
参考链接:
http://reverland.org/python/2012/09/07/matplotlib-tutorial/。
2.3.4 Pandas
终于谈到本书的主力工具——Pandas了。Pandas是Python下最强大的数据分析和探索工具(貌似没有之一)。它包含高级的数据结构和精巧的工具,使得在Python中处理数据非常快速和简单。Pandas构建在NumPy之上,它使得以NumPy为中心的应用很容易使用。Pandas的名称来自于面板数据(Panel Data)和Python数据分析(Data Analysis),它最初被作为金融数据分析工具而开发出来,由AQR Capital Management公司于2008年4月开发出来,并于2009年底开源。
Pandas的功能非常强大,支持类似于SQL的数据增、删、查、改,并且带有丰富的数据处理函数;支持时间序列分析功能;支持灵活处理缺失数据等。事实上,单纯Pandas工具就足以写一本书,读者可以阅读Pandas的主要作者之一Wes McKinney写的《利用Python进行数据分析》一书,学习更详细的内容。
(1)安装
Pandas的安装相对来说比较容易,安装好Numpy之后,就可以直接安装了,通过pip install pandas或下载源码后python setup.py install安装均可。由于我们频繁用到读取和写入Excel,但默认的Pandas还不能读写Excel文件,需要安装xlrd(读)和xlwt(写)库才能支持Excel的读写,方法如下。
pip install xlrd #为Python添加读取Excel的功能
pip install xlwt #为Python添加写入Excel的功能
(2)使用
在后面的章节中,我们会逐步展示Pandas的强大功能,而在本节,我们先以简单的例子一睹为快。
Pandas基本的数据结构是Series和DataFrame。顾名思义,Series就是序列,类似一维数组;DataFrame则是相当于一张二维的表格,类似二维数组,它的每一列都是一个Series。为了定位Series中的元素,Pandas提供了Index对象,每个Series都会带有一个对应的Index,用来标记不同的元素,Index的内容不一定是数字,也可以是字母、中文等,它类似于SQL中的主键。
类似地,DataFrame相当于多个带有同样Index的Series的组合(本质是Series的容器),每个Seiries都带有唯一的表头,用来标识不同的Series。
代码清单2-4 Pandas的简单例子
# -*- coding: utf-8 -*- import pandas as pd #通常用pd作为pandas的别名。 s = pd.Series([1,2,3], index=['a', 'b', 'c']) #创建一个序列s d = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns = ['a', 'b', 'c']) #创建一个表 d2 = pd.DataFrame(s) #也可以用已有的序列来创建表格 d.head() #预览前5行数据 d.describe() #数据基本统计量 #读取文件,注意文件的存储路径不能带有中文,否则读取可能出错。 pd.read_excel('data.xls') #读取Excel文件,创建DataFrame。 pd.read_csv('data.csv', encoding = 'utf-8') #读取文本格式的数据,一般用encoding指定编码。
由于Pandas是本书的主力工具,在后面将会频繁使用它,因此在这里就不进行详细介绍了,在后面的使用过程中将会更加详尽地讲解Pandas的使用方法。
参考链接:
http://pandas.pydata.org/pandas-docs/stable/。
http://jingyan.baidu.com/season/43456。
2.3.5 StatsModels
Pandas着眼于数据的读取、处理和探索,而StatsModels则更加注重数据的统计建模分析,它使得Python有了R语言的味道。StatsModels支持与Pandas进行数据交互,因此,它与Pandas结合,成为了Python下强大的数据挖掘组合。
安装StatsModels相当简单,既可以通过pip安装,又可以通过源码安装。对于Windows用户来说,官网上甚至已经有编译好的exe文件以供下载。如果手动安装的话,需要自行解决好依赖问题,StatModel依赖于Pandas(当然也依赖于Pandas所依赖的),同时还依赖于pasty(一个描述统计的库)。
下面是一个用StatsModels来进行ADF平稳性检验的例子。
# -*- coding: utf-8 -*- from statsmodels.tsa.stattools import adfuller as ADF #导入ADF检验 import numpy as np ADF(np.random.rand(100)) #返回的结果有ADF值、p值等
参考链接:
http://statsmodels.sourceforge.net/stable/index.html。
http://jingyan.baidu.com/season/43456。
2.3.6 Scikit-Learn
从该库的名字可以看出,这是一个机器学习相关的库。不错,Scikit-Learn是Python下强大的机器学习工具包,它提供了完善的机器学习工具箱,包括数据预处理、分类、回归、聚类、预测和模型分析等。
Scikit-Learn依赖于NumPy、SciPy和Matplotlib,因此,只需要提前安装好这几个库,然后安装Scikit-Learn就基本上没有什么问题了,安装方法和前几节一样,要不就是pip install scikit-learn安装,要不就是下载源码自己安装。
创建一个机器学习的模型很简单:
# -*- coding: utf-8 -*- from sklearn.linear_model import LinearRegression #导入线性回归模型 model = LinearRegression() #建立线性回归模型 print(model)
1)所有模型提供的接口有:
model.fit():训练模型,对于监督模型来说是fit(X,y),对于非监督模型是fit(X)。
2)监督模型提供的接口有:
model.predict(X_new):预测新样本
model.predict_proba(X_new):预测概率,仅对某些模型有用(比如LR)
model.score():得分越高,fit越好
3)非监督模型提供的接口有:
model.transform():从数据中学到新的“基空间”。
model.fit_transform():从数据中学到新的基并将这个数据按照这组“基”进行转换。
Scikit-Learn本身提供了一些实例数据,比较常见的有安德森鸢尾花卉数据集、手写图像数据集等。我们有一百五十个鸢尾花的一些尺寸的观测值:萼片长度、宽度,花瓣长度和宽度。还有它们的亚属:山鸢尾(Iris setosa)、变色鸢尾(Iris versicolor)和维吉尼亚鸢尾(Iris virginica)。
# -*- coding: utf-8 -*- from sklearn import datasets #导入数据集 iris = datasets.load_iris() #加载数据集 print(iris.data.shape) #查看数据集大小 from sklearn import svm #导入SVM模型 clf = svm.LinearSVC() #建立线性SVM分类器 clf.fit(iris.data, iris.target) #用数据训练模型 clf.predict([[ 5.0, 3.6, 1.3, 0.25]]) #训练好模型之后,输入新的数据进行预测 clf.coef_ #查看训练好模型的参数
参考链接:
2.3.7 Keras
虽然Scikit-Learn足够强大,但是它并没有包含一种强大的模型——人工神经网络。人工神经网络是功能相当强大的、但是原理又相当简单的模型,在语言处理、图像识别等领域有着重要的作用。近年来逐渐火起来的“深度学习”算法,本质上也就是一种神经网络,可见在Python中实现神经网络是非常必要的。
本书用Keras库来搭建神经网络。事实上,Keras并非简单的神经网络库,而是一个基于Theano的强大的深度学习库,利用它不仅仅可以搭建普通的神经网络,还可以搭建各种深度学习模型,如自编码器、循环神经网络、递归神经网络、卷积神经网络等。由于它是基于Theano的,因此速度也相当快。
有必要介绍一下Theano,它也是Python的一个库,它是由深度学习专家Yoshua Bengio带领的实验室开发出来的,用来定义、优化和高效地解决多维数组数据对应数学表达式的模拟估计问题。它具有高效地实现符号分解、高度优化的速度和稳定性等特点,最重要的是它还实现了GPU加速,使得密集型数据的处理速度是CPU的数十倍。
用Theano就可以搭建起高效的神经网络模型,但是对于普通读者来说门槛还是相当高的,Keras正是为此而生,它大大简化了搭建各种神经网络模型的步骤,允许普通用户轻松地搭建并求解具有几百个输入节点的深层神经网络,而且定制的自由度非常大,甚至可能惊呼:搭建神经网络可以如此简单!
(1)安装
安装Keras之前首先需要安装Numpy、Scipy和Theano。安装Theano先要准备一个C++编译器,这在Linux下是自带的。因此,在Linux下安装Theano和Keras非常简单,只需要下载源代码,然后用python setup.py install安装就行了,具体可以参考官方文档。
可是在Windows下就没有那么简单了,因为它没有现成的编译环境。一般而言是先安装MinGW(Windows下的GCC和G++),然后再安装Theano(提前装好Numpy等依赖库),最后安装Keras。如果要实现GPU加速,还需要安装和配置CUDA(天下没有免费的午餐,想要速度、易用两不误,那么就得花点心思)。限于篇幅,本书不详细介绍在Windows下Theano和Keras的安装配置方法。
值得一提的是,在Windows下Keras的速度会大打折扣,因此,想要在神经网络和深度学习方面进行深入研究的读者,请在Linux下搭建相应的环境。
参考链接:
http://deeplearning.net/software/theano/install.html#install。
https://github.com/fchollet/keras。
(2)使用
用Keras搭建神经网络模型的过程相当简洁,也相当直观,就像搭积木一般。通过短短几十行代码,我们就可以搭建起一个非常强大的神经网络模型,甚至是深度学习模型。简单搭建一个MLP(多层感知器),如下:
# -*- coding: utf-8 -*- from keras.models import Sequential from keras.layers.core import Dense, Dropout, Activation from keras.optimizers import SGD model = Sequential() #模型初始化 model.add(Dense(20, 64)) #添加输入层(20节点)、第一隐藏层(64节点)的连接 model.add(Activation('tanh')) #第一隐藏层用tanh作为激活函数 model.add(Dropout(0.5)) #使用Dropout防止过拟合 model.add(Dense(64, 64)) #添加第一隐藏层(64节点)、第二隐藏层(64节点)的连接 model.add(Activation('tanh')) #第二隐藏层用tanh作为激活函数 model.add(Dropout(0.5)) #使用Dropout防止过拟合 model.add(Dense(64, 1)) #添加第二隐藏层(64节点)、输出层(1节点)的连接 model.add(Activation('sigmoid')) #输出层用sigmoid作为激活函数 sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) #定义求解算法 model.compile(loss='mean_squared_error', optimizer=sgd) #编译生成模型,损失函数为平均 误差平方和 model.fit(X_train, y_train, nb_epoch=20, batch_size=16) #训练模型 score = model.evaluate(X_test, y_test, batch_size=16) #测试模型
要注意的是,Keras的预测函数与Scikit-Learn有所差别,Keras用model.predict()方法给出概率,model.predict_classes()方法给出分类结果。
参考链接:
http://radimrehurek.com/gensim/。
http://www.52nlp.cn/如何计算两个文档的相似度二。
2.3.8 Gensim
在Gensim的官网中,它对自己的简介只有一句话:topic modelling for humans!
Gensim是用来处理语言方面的任务,如文本相似度计算、LDA、Word2Vec等,这些领域的任务往往需要比较多的背景知识,通常的情况是:研究这方面的读者,已经不需要我再多说什么;不研究这方面的读者,在这里也说不清楚。(所以Gensim的介绍只有一句话也就不奇怪了。)
因此,在这一节中,只是提醒读者有这么一个库的存在,而且这个库很强大,如果用得到这个库,请读者去阅读官方帮助文档或参考链接。
需要一提的是,Gensim把Google公司在2013年开源的著名的词向量构造工具Word2Vec编译好了作为它的子库,因此需要用到Word2Vec的读者也可以直接用Gensim而无需自行编译了。据说Gensim的作者对Word2Vec的代码进行了优化,据说它在Gensim下的表现比原生的Word2Vec还要快。(为了实现加速,需要准备C++编译器环境,因此,建议用到Gensim的Word2Vec的读者在Linux下环境运行。)
下面是一个Gensim使用Word2Vec的简单例子。
# -*- coding: utf-8 -*- import gensim, logging logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) #logging是用来输出训练日志 #分好词的句子,每个句子以词列表的形式输入 sentences = [['first', 'sentence'], ['second', 'sentence']] #用以上句子训练词向量模型 model = gensim.models.Word2Vec(sentences, min_count=1) print(model['sentence']) #输出单词sentence的词向量。
参考链接:
http://radimrehurek.com/gensim/。
http://www.52nlp.cn/(如何计算两个文档的相似度二)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论