Python是搞Data Science的不二选择。对于新手来说(比如我) ,需要快速学会使用Python的常用package。这篇博客主要就是总结一下用Python搞Data Science的大体步骤和一些细节。 PS. 我在美国的第一个学期,选了一门课叫做 Data Science Fundamentals,课程链接。使用的教材是《The Data Science Design Manual》 ,这本书的可读性很强,涉及面广,深入浅出,是给我们上课的老师自己写的一本书。
数据科学的项目大多遵循如下四个步骤:获得数据,数据预处理,建模和分析,评估和展现。
Step | Name | Packages |
---|---|---|
1 | Get Data | Pandas, Beautiful soup, … |
2 | Data Preprocessing | Pandas, Numpy, NLTK, Scikit-image, … |
3 | Modeling and Analysis | Scikit-learn, Numpy, Scipy, Sympy, Tensorflow, … |
4 | Evaluate and Present | Jupyter Notebook, Matplotlab, Seaborn, … |
做 data science 项目最好使用anaconda,这个东西可以理解为:Python + 很多很多packages。安装完anaconda之后,大部分需要的packages都有了,比如 numpy, pandas, matlabplot等等。
命令 | 说明 |
---|---|
conda install xxx | 缺啥packages就补啥,类似于 pip install,不过既然用了conda,就不用pip了 |
conda list –revisions | 万一conda环境蹦了,看看你做了什么,类似于 git log |
conda install –revision [revision number] | 退回到以前的conda版本,类似于 git reset –hard xxx |
conda create -n myenv python=3.6 | 建立一个conda环境,类似于virtualenv -p /usr/bin/… myenv |
conda activate myenv | 激活某个conda环境 |
Python是一门面向对象的语言(object oriented programming)。但是在做data science的过程中,需要切换思维,切换成面向数组/表的编程(array or table oriented porgramming),基本上,你的数据都是以数组/表的形式组织的。这种思维在面向GPU编程的时候也是很需要的。
Pandas is used to get data from a web url, a local file, or data you just created in the program. HERE is a great ten minute code example guide to Pandas。建议把这个网页里面的代码在Notebook里面抄一遍。
Pandas 用三种数据结构来存储数据。
数据结构 | 维数 | 元素 |
---|---|---|
Series | 1 维 | Scalar Value |
DataFrame | 2 维 | Series |
Panal | 3 维 | DataFrame |
其中DataFrame的使用最为广泛。DataFrame是用来存储二维数据的。二维数据包括:数据库里面的表(table),和csv格式的spreadsheet文件。table和spreadsheet这种二维关系型数据的广泛使用,使得DataFrame这个数据结构广泛使用。打印一个DataFrame对象就是一个表,垂直向下的方向是X轴(row,index,axis=0),水平向右方向是Y轴(column,axis=1)。X轴的row代表一行一行的record(记录),Y轴的column代表feature(特征属性)。 df.iloc[3,4]代表第4行记录的第5个属性(下标从0开始)。注意:这里千万不要和平面直角坐标系联系在一起。在平面直角坐标系里面,垂直向上的是Y轴,水平向右的是X轴。
我在学习用Beautiful soup写爬虫程序的时候,主要参考了这个网页。我写爬虫脚本的最大感想是:不要有畏惧心理,勇敢的去写,不断测试改进,没有爬虫脚本一开始就是如你所愿的。这个是我自己写的爬歌曲genre的程序。
其实,真正的问题在于,数据在哪里?阿里巴巴,Kaggle等公司的大数据挑战项目,每次的挑战任务都会提供一个很大的csv spreadsheet。但是如果自己做Data Science Project呢?那么就要需要花费很多心思去寻找数据在哪里。没有数据简直就是“巧妇难为无米之炊”。数据获取方式包括:网络爬虫,网站提供API,网站直接提供数据下载,自己调研手动输入数据,给有数据的机构发邮件请求数据,花钱买数据。。。俗话说:好的开始就是成功的一半。有了高质量的数据就是好的开始。
我团队在做 Project #8:Do Popular Songs Endure时,获取歌曲数据有如下几种方式:
我门在做这个项目的过程中,估计接近百分之80的时间花在搞数据上面了!
数据预处理主要是data cleaning,还包括scaling,encoding等等。
原始的数据常常是无法直接使用的,需要做“清洁”。做data cleaning我还是使用Pandas。常见的date cleaning包括:
Scaling的意思是,改变数值数据的范围,比如:normalization和log
在data cleaning之后,拿ML算法建模之前,把数据的取值范围按照公式运算一下,这个公式一般是Z-score。做完z-score之后,该feature的均值为0,方差为1。做normalization的目的是使feature之间的数值具有可比性。
有时候,在z-score之前,还要做一个logarithm。这就涉及到power law分布了。我们的project中,犯了这个错误被老师指出来了。Billboard排行榜是对歌曲的流行度的一个排名,从第1到第100。那么假设第一名和第三名之间的流行程度相差X,第五十一名和五十三名之间相差Y,那么X和Y想等么?显然不是,应该X>>Y。这篇论文公式6描述了billboard排行榜单和流行程度之间的函数关系。
Encoding是指把categorical(分类)数据转换成numerical(数值)型数据。字符串就是categorical数据,sklearn的库不能接受字符串。一种方法是直接删除整个字符串特征数据。还有一种方法叫做onehotencoding。我在做project的时候,使用了pd.get_dummies。我的使用情景是:一首歌属于一个genre,但是genre属性是categorical的,为了能够使用sklearn的回归算法,就用get_dummies把genre变成了0-1的数值型数据。
在做好前期的数据工作之后,建模和分析就变得轻松了,在我做的project中,所谓建模就是两三行代码,如下:
model = linear_model.LinearRegression()
model = model.fit(feature, target)
建模之后,就是拿模型去预测测试数据:
pred = model.predict(test)
所以到底用那个模型(机器学习算法)呢?除了大概了解这些算法的运行机理之外,就是把这些sklearn算法都拿来一一试一遍。
–
Evaluation的话,就是拿pred和真实值做对比,没有对比就没有伤害。伤害完了还要去做evaluation评估。基本的评估包括:mean/median absolute err-or(MAE), mean squeared error(MSE)等,还做图:误差分布图,和预测-真实值图,其中纵坐标为预测值,横坐标为真实值。一个evaluation report例子,这例子的permutation可以不做。
我们可以写一个程序(一个函数),一次运行就可以生成各种evaluation结果。这样可以快速得知我们的数据和模型如何。
Jupyter Notebook combines code, data, equations, visualizations and explanatory text all in one. Super easy to use. You code, run results and write documentations in a web browser. For data science project, I believe Jupyter notebook is better than IDEs such as Pycharm or Visual Studio. Even if you use an IDE to write your code, you still will need a tool to write the report, such as Word or LaTex, which is miseralbe. When you use Jupyter Notebook, after you finish wirting your code, your data science project’s report is already almost finished.
HERE are shortcut keys for Jupyter Notebook. In the notebook, there are two modes: command mode and edit mode (just like Vim has three modes). Press Esc
to get into command mode, and press Enter
to get into edit mode. In edit mode, Tab
completion works just like the tab completion in Linux/Unix. Tab自动补全一个编程利器,加快效率。
HERE 是如何修改Jupyter Notebook的起始目录,可以把起始目录改成项目的路径。HERE 是如何将Notebook 连接到 remote server。Here 是如何将 Notebook连接到Google Cloud。
Seaborn基于Matplotlib。HERE是如何seaborn绘制一个漂亮的heatmap热力图。
没错,pandas无处不在,它也可以用来作图,我还挺喜欢用它来作图的。我觉得Pndas.plot比matplotlib用起来方便快速一些。
原生的Python程序比较慢,特别是 for loop。加快Python 程序的速度的两个简单的方法是:能用 Numpy 的地方,绝不用 list;使用 Numba,它是一个编译优化工具,HERE 是一个简易的Numba教程。最后,如果程序的瓶颈是大规模的数字,矩阵运算的话,可以使用GPU来加速程序,在这里可以使用 CUDA 库。
这个GitHub有我CSE519 Data Science Fundamentals所有的作业,代码和报告。这篇博客包含了这门课的回忆录。
Last updated: 2018/8/16