简介
数据科学与传统的程序开发开发有些许不同,数据科学面向非专业的研发人员,更需要简单的,所见即所得的开发方式。因此,通常选择一种可交互的解释型语言,如Python、Ruby、Scala等。其次,数据科学更加注重推理的逻辑与过程,因此它需要可读性强的注释、图标,这往往通过Notebook来实现,这类Notebook可以实现代码的直接运行与保存结果,并且在代码中嵌入macdown来添加详细的讲解注释。本文主要涉及下面几个方面:
- 开发语言:Python。这里我们选择了最常见、最容易入门的开发语言Python3,由于Python3与python2并不完全兼容,在不特殊说明的情况下,我们使用Python3作为标准。
- Notebook:Jupyter。这也是Python最常用的Notebook,可以在其中选择编译环境,运行Pythhon代码,添加macdown代码块。绘制图标这些常见的功能。值得注意的是,Jupyter只是一个前端显示笔记本,其后端可以支持除了Python以外的其他语言。
- 环境管理:Conda。由于Python版本兼容问题,不同的package可能需要不同的Python环境。因此,需要一款可以管理不同环境的工具,Conda提供了一个虚拟的环境,我们可以在不同环境中设置不同的Python版本,开发包版本,并且可以在这些环境中切换(类似的工具有virtualenv)。
环境管理:Conda
我们可以安装miniconda。由于完整版的Anaconda比较大(500MB,包含默认安装各种常用库,pydata库)推荐用miniconda,再依据需要安装package。
比较conda与pip
- conda与pip区别
- conda是专注数据领域的,pip不是
- conda不仅仅包括python包,也包括非python工具。pip只是python的。
- conda对于python库而言并不全。如果在conda中没有,可以用pip安装,没有冲突。
- conda下载的版本是预编译好的(使用MKL库编译,对速度进行了优化),而pip不是。所以版本可能不是最新的。
- conda还是一个环境管理工具(类似virtualenv,pyenv),可以不同项目用不同的环境,而pip不是。常见的应用是
- py3与py2同时安装,避免冲突。
- 需要旧版本功能时,安装不同版本的numpy。
常见操作
安装miniconda
brew install Caskroom/cask/miniconda
## 可选
conda upgrade conda
conda upgrade --all # 默认环境升级到了python3
PS:不要忘记,覆盖了以前的python环境 export PATH=~/miniconda3/bin:"$PATH"
安装完成后,系统的Python环境默认是root环境(conda自带),此时使用pip/conda安装package会安装到此环境中。请使用 where python
&& where pip
确认。
配置
conda安装完了可以直接使用,不需要特别的配置。但是这里提一个概念channels,他是最常用的配置选项,我们可以通过选择不同的channels来安装其他人的扩展包。 通过类似 conda install -c some-channel packagename
的命令来从其他源安装软件。最常见的源是conda-forge,一个开源的代码库,许多软件通过这个源来安装。
# 显示配置
conda config --show
# 单独显示channels
conda config --get channels
# 添加 conda-forge channel到源(示例,建议直接通过-c方式指定channel安装)
conda config --add channels conda-forge
# 通过conda-forge源安装tensorflow 1.1.0
conda install -c conda-forge tensorflow=1.1.0
使用
conda list
:查看当前环境中所有的packageconda env list
:查看系统中所有的环境与当前的环境,注意默认环境root
conda install xxx
可以在当前环境中安装package- 创建新环境并安装一些包:
conda create -n env_name list_of_packages
conda create -n py3 python=3
conda create -n py2 python=2
- 进入环境
source activate my_env
- 直接在环境内安装包:
conda install package
- 退出环境
source deactivate
- 删除环境
conda env remove -n env_name
- 共享环境安装的package
- 导出:
conda env export > environment.yaml
- 导入:
conda env create -f environment.yaml
- 导出:
实践技巧
如何加速package安装速度
由于墙的存在,我们需要镜像来加速conda install/pip install的安装速度。建议使用清华tuna的Anaconda镜像和豆瓣的pip镜像
- 加速默认源:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes
- 加速conda-forege channel
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
- 或者
conda install -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge tensorflow=0.11.0
- 加速pip
pip install packagename -i https://pypi.douban.com/simple
如何Python分配环境
- 分别建立python2和python3的环境,并安装常用的package,如jupyter
conda create -n py3 python=3 ipykernel
conda create -n py2 python=2 ipykernel
- 为每个项目创建环境建立独立的env。比如为你博客创建一个python环境。
笔记本:Jupyter Notebook
Jupyter Notebook可以方便我们开发测试与Review整个研发的过程。一个有用的提示,在github可以识别Jupyter,直接打开渲染好的.ipynb
笔记本文件。另外,要打开其他任何地方的Jupyter文件可以使用这个网站。
安装jupyter
我们可以为conda中有需要的环境安装jupyter notebook,下面以默认环境为例,如果需要jupyter可以识别、切换其他conda环境,需要先切换到对应的env中重复执行下面的安装命令。
conda install jupyter notebook # pip也行
conda install nb_conda_kernels # 为notebook添加conda环境识别功能,似乎安装ipykernel也可以
如果出无jupyter前端无法识别多个环境的问题,参考stackoverflow的这篇文章说明miniconda与jupyter结合的问题
安装完成后,访问访问http://localhost:8888,如果启动多个notebook,访问http://localhost:8889 ,端口+1。
使用
常用
- 一个code cell中定义的变量可以在另一个中访问
- 默认输出最后一行的结果,可以直接用print输出
- tab代码补全
- shift+tab 查看文档
- shift+tab两次,查看详细文档
快捷键
- control+enter :运行
- Shift + Control/Command + P 命令板
- DD 删除
- A 新建
- H 帮助
- L 代码行数
Magic命令
magic命令可以大大增强jupyter的能力,添加一下功能。
%
作用于一行
timeit
计算单元格的运行时间
-
绘图
%matplotlib xxx
xx代表后端(显示的终端)%matplotlib inline
matplotlib库在notebook中内联显示图像- 在retina屏显示:
%matplotlib inline %config InlineBackend.figure_format = 'retina'
-
debug
%pdb
打开调试,当出现错误时自动中断,可以查看变量值。输入q退出。
-
其他:http://ipython.readthedocs.io/en/stable/interactive/magics.html
其他功能
- 转换ipynb格式:ipynb本质是一个json文档可以,转换成html,macdown等格式
jupyter nbconvert --to html notebook.ipynb
- macdown
- 幻灯片
- 制作幻灯片:效果不错
- 在web中,点击 View > Cell Toolbar > Slideshow
- 在每个cell上面选择样式
- side
- sub-side
- fragment
- skip
- notes
- 生成
jupyter nbconvert notebook.ipynb --to slides --post serve
Python与数据科学常用的Lib
python的基本语法在此不再赘述,下面介绍一下常用的功能。
Python特性
Python2与Python3的区别
- print的改变:py2中使用
print "hello"
,py3中使用print("hello")
- 原来
1/2
(两个整数相除)结果是0,现在是0.5了 xrange
重命名为range
,并且返回不是list了,是可遍历的range对象,可以使用list()
在转换一下*
的作用,python3中加在list前,可以展开list,作为多个参数传入函数。
强大的列表/字典推导式
基本格式,其中if过滤条件可有可无。
- 生成列表
[expr for value in collection if condition]
- 生成字典
{ key_expr: value_expr for value in collection if condition }
- 生成集合
{ expr for value in collection if condition }
# example
names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
# 列表的例子,注意if位置
# 过滤 ['ALICE', 'JERRY', 'WENDY', 'SMITH']
[name.upper() for name in names if len(name)>3]
# 按照条件赋新值 [False, False, True, True, True, True]
[ True if len(name)>3 else False for name in names]
# 字典的例子
# {'Bob': 3, 'Smith': 5, 'Jerry': 5, 'Wendy': 5, 'alice': 5, 'Tom': 3}
{name:len(name) for name in names}
# 集合的例子
# {3, 5}
{len(name) for name in names}
# 遍历嵌套list的例子
names = [['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],
['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']]
# ['Jefferson', 'Wesley', 'Steven', 'Jennifer']
[name for lst in names for name in lst if name.count('e')>=2]
星号的使用
def test(*args, **kwargs):
print args, kwargs
a={"a":1, "b":2}
# ({'a': 1, 'b': 2},) {}
test(a)
# ('a', 'b') {}
test(*a) #这里等同于test('a', 'b')
# () {'a': 1, 'b': 2}
test(**a) #这里等同于test(a=1, b=2)
一个星号就是把一个序列拆解传入,如果变量本身是字典,会退化成key的序列。两个星号就是把key-value拆解传入。可以当是语法糖。
常用内置函数
- zip
- range
- str 对象转换成可打印字符串
- type
- filter/map/reduce
- 其他,参考blog
基础库
numpy
一个科学计算的基础库,为Python提供了最常用的向量&&矩阵这个功能(N-dimensional array object)。以及他们常见的操作函数,如转置、点积等。具体的使用参考官方文档,这里一般性的介绍。
- 虽然都是N纬度的数组,但是请区分向量与矩阵
np.array([1,2,3]):
是一个向量==>shape (3,)
np.array([1,2,3],ndmin=2)
:是一个矩阵==>shape(1,3)
。因此,矩阵才有转置T,np.array([1,2,3],ndmin=2).T
==>shape(3,1)
。
- 乘法规则:区别点乘与element-wise相乘
- 点乘的规则
- np.dot(向量,向量):向量的点积 a1b1+a2b2
- np.dot(矩阵,矩阵):两个矩阵相乘
- np.dot(向量,矩阵)
- np.dot(矩阵,向量)
- element-wise相乘:广播机制--不同shape的矩阵运算
- 点乘的规则
- numpy中的range:
np.arange(10)
==>array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
。 - 生成zeros数据:
np.zeros(len(vocab),dtype=np.int_)
向量类型是int
(默认是float
) np.rollaxis(self.train_x, 3)
把第三纬度换到第0纬度- 随机
- shuffle:
np.random.shuffle([1,2,3])
np.random.randn(10,5)
10*5的随机矩阵np.random.randint(0,100)
,生成0--100的随机数一个
- shuffle:
scipy
对numpy库的扩展,提供了更多的函数。scipy似乎包含了numpy的所有函数,应当优先考虑使用他们。深度学习课程中使用的并不多。
all of the Numpy functions have been subsumed into the scipy namespace so that all of those functions are available without additionally importing Numpy.
panda
一个极受欢迎的 Python 数据处理库,为Python提供了结构化的数据结构Series、DataFrame。是数据处理里面经常使用的库,可以把数据组织成表格的形式。数据的输入时常用,尤其是读取cvs表格数据。参考:10 分钟讲解 Pandas。
import pandas as pd
# 读入cvs表格为dataframe数据结构,df由data,column,index组成,行与列都可以理解成Series
data = pd.read_csv("data_file.csv") # cvs的格式是第一行是col名字,所有数据用逗号分割
# 获取列
df = data[['ColumnName']] # 返回df
series = data['ColumnName'] # 注意这个返回的是Series
# 获取行(返回Series) ,index的概念
data.ix[0]
# 某一行的N列
data.ix[0,["ColumnName","ColumnName2"]]
##### 转换为numpy #####
df.values ==> 二维 array
series.values ==> 一维 array
Matplotlib
Python 图表绘制与可视化库,在本课程中经常使用来展现数据(如准确率的变换)。参考Matplotlib 官方教程。
机器学习库
TensorFlow
Google出品的机器学习/深度学习库,提供了张量Tensor的底层表示和运算方法,此外,还包含了构建神经网络以及构建/训练各种model的常用函数,属于比较底层的库,很多高级API基于他实现。这个会在后面的文章中重点介绍。
高层API—scikit-learn,keras,tf-learn,TensorLayer
-
scikit learn:一套高层次通用机器学习API,是综合性 Python 机器学习库(API也很经典,其他的库都有类似的API),提供了传统的机器学习方法,功能全面,后端可以选择Tensorflow。由于包含很多传统机器学习方法,可以与其他库配合使用。参考Scikit-learn 官方教程。推荐一个不错的中文视频教程。
-
keras:一个高层次的深度学习API,专注于深度学习方面。后端可以选择Tensorflow/Theano,封装的比较死??据说Keras准备作为官方默认API了???
-
tf-learn:是tf.contrib包中的深度学习API,也是一个高层次的API,后端只能选择Tensorflow。类似scikit-learn,通过简单的几行代码就可以开始深度学习。事实上tflearn期初是Scikit Flow (SKFlow)这个独立的项目。
skflow : Simplified interface for TensorFlow (mimicking Scikit Learn) for Deep Learning.
-
TensorLayer:一个比较新的库,对TensorFlow的封装,很灵活,运行速度快。教程很强大,中文文档更新速度基本与英文文档同步,还包含了 Google TensorFlow 官网的模块化实现。同时提供scikit-learn式的 fit(), test(), predict() 的API和专业级的API,适合新手到老手过渡。
总结
至此,学习深度学习需要的开发环境与工具介绍完毕,Conda为我们提供方便的环境管理,提供了环境的隔离机制,解决了不同python版本/Lib版本切换的问题。Jupyter Notebook为我们提供了方便的前端开发环境与展示工具,使得记录数据探索的过程更具加高效。最后,Python以及相关的库是深度学习的核心与基础。后面我们就要启程,从传统的机器学习方法开始一步步走向深度学习。