摘要: 在一个新的数据科学项目,你应该如何组织你的项目流程?数据和代码要放在那里?应该使用什么工具?在对数据处理以前,须要考虑哪些方面?读完本文,会让你拥有一个更加科学的工做流程。
假如你想要开始一个新的数据科学项目,好比对数据集进行简单的分析,或者是一个复杂的项目。你应该如何组织你的项目流程?数据和代码要放在那里?应该使用什么工具?在对数据处理以前,须要考虑哪些方面?html
数据科学是当前一个不太成熟的行业,每一个人都各成一家。虽然咱们能够在网上参照各类模板项目、文章、博客等建立一个数据科学项目,可是目前也没有教科书对这些知识作一个统一的回答。每一个数据科学家都是从经验和错误中不断的探索和学习。如今,我逐渐了解到什么是典型的“数据科学项目”,应该如何构建项目?须要使用什么工具?在这篇文章中,我但愿把个人经验分享给你。git
尽管数据科学项目的目标、规模及技术所涉及的范围很广,但其基本流程大体以下:github
如上图所示,项目不一样,其侧重点也会有所不一样:有些项目的某个过程可能特别复杂,而另外一些项目可能就不须要某一过程。举个例子来讲,数据科学分析项目一般就不须要“部署”(Deployment)和“监控”(Monitoring)这两个过程。如今,咱们逐一来细说各个过程。web
不论是你接触到人类基因组仍是iris.csv,一般都会有 “原始源数据”这一律念。数据有不少种形式,能够是固定的,也能够是动态变化的,能够存储在本地或云端。其第一步都是对源数据访问,以下所示:算法
一般来讲,在设置数据源的时候能够遵循如下规则:docker
上面这个步骤很重要。后续项目会你可能会犯任何错误,好比源文件无效、误用方法等等,若是没有记住数据的含义、位置及访问过程,那将很麻烦。数据库
数据处理的目的是将数据转化为“干净”的数据,以便建模。在多数状况下,这种“干净”的形式就是一个特征表,所以,“数据处理”一般归结为各类形式的特征工程(feature engineering),其核心要求是:确保特征工程的逻辑可维护,目标数据集可重现,整个管道能够追溯到源数据表述。计算图(computation graph)即知足以上要求。具体例子以下:apache
首先,容许用户轻松的跟踪当前所定义的特征,而不用存储在大型数据表中。特征定义仅在代码运行期间有效;其次,模型从部署到生产很是简单,假设实时数据库使用相同的模式,你就只须要复制相应的视图。此外,还可使用CTE语句将全部的特征定义编译为模型最终预测的单个查询语句。flask
在进行数据处理时,请注意一下问题:api
1.重复以计算图的形式处理数据。
2.考虑计算基础架构。是否进行长时间计算?是否须要并行计算仍是聚类?是否能够从具备跟踪任务执行的管理UI做业中获益?
3.若是想要将模型部署到生产环境中,请确保系统支持该用例。若是正在开发一个包含JAVA Android应用程序模型,可是仍是想用Python开发,为了不没必要要的麻烦,就可使用一个专门设计的DSL,而后将这个DSL转换为Java或PMML之类的中间格式。
4.考虑存储特征或临时计算的元数据。能够将每一个特征列保存在单独的文件中,或使用Python函数注释。
完成数据处理和特征设计后便可开始进行建模。在一些数据科学项目中,建模能够归结为单个m.fit(X,y)或某个按钮;而在其余项目中则可能会涉及数周的迭代和实验。一般来讲,你能够从“特征工程”建模开始,当模型的输出构成了不少特征时,数据处理和建模这两个过程并无明确的界限,它们都涉及到计算。尽管如此,将建模单独列出来做为一个步骤,仍然颇有意义,由于这每每会涉及到一个特殊的需求:实验管理(experiment management)。具体例子以下:
在实际应用中,模型最终都要部署到生产环境中,必定要有一个有效的计划,下面有些例子:
咱们对模型部署作一下总结:
1.模型部署的方式有不少种。在部署以前必定要了解实际状况,并提早作计划:是否须要将模型部署到其余语言编写的代码库中?若是使用REST服务,服务的负载时多少?可否进行批量预测?若是打算购买服务,费用是多少?若是决定使用PMML,那么就要确保它可以支持你的预期预处理逻辑。若是在训练期间使用第三方数据源,那么就要考虑是否在生产中可以与它们集成,以及如何在管道导出模型中对访问信息进行编码。
2.模型一旦部署到生产环境,它就转变为一行行实际的代码,因此也要知足全部需求,所以,这就须要测试。在理想状况下,部署管道应该产生用于部署的模型包以及测试时须要的全部内容。
将模型成功部署到生产环境,也许训练集中的输入分布与现实不一样,模型须要从新练或从新校准;也许系统性能没有达到预期。所以,你须要收集模型性能的数据并对其进行监控。这就须要你设置一个可视化仪表板,具体事例以下:
在整个数据科学项目中,你还须要尝试不一样的假设,以生成图标和报告。这些任务与构建管道有所不一样,主要体如今两个方面:
首先,大部分任务不须要可再现性,即不用包含在计算图中。另外,也不必使用模型的可重复性,在Jupyter中手动绘制图便可。
其次,这些“进一步探索”的问题每每具备不可预测性:可能须要分析性能监控日志中的一个异常值;或者测试一个新的算法。这些探索会塞满你的笔记本中,团队中的其余人可能看不懂你的记录。所以按照日期排列子项目很重要。
./2017-01-19 - Training prototype/
(README, unsorted files)
./2017-01-25 - Planning slides/
(README, slides, images, notebook)
./2017-02-03 - LTV estimates/
README
tasks/
(another set of
date-ordered subfolders)
./2017-02-10 - Cleanup script/
README
script.py
./... 50 folders more ...
注意,你能够根据须要自由组织每一个子项目的内部目录,由于每一个子项目极可能也是一个“数据科学项目”。在任何状况下,在每一个子项目中都要有个README文件夹或README.txt文件,简要列出每一个子项目目录的信息。
若是项目列表太长,你须要从新组织项目目录,好比压缩一部分文件移动到存档文件夹中。“探索性”的任务有两种形式,即一次性分析和可重复性使用的代码,这时候创建一些约定颇有必要。
数据科学项目可能会依赖一些服务,能够指定提供如下9个关键服务,来描述指望:
1.文件存储。任何一个数据科学项目都必须有个存储项目的地方,且须要整个团队共享。它是网络驱动器上的一个文件夹?仍是Git存储库中的一个文件夹?
2.数据服务。如何存储和访问数据?这里的“数据”指的是计算机读取或输出的全部内容,包括源数据、中间结果及第三方数据集访问、元数据、模型及报告等。
3.版本。代码、数据、模型、报告和文档都须要有版本控制,另一定要备份!
4.元数据和文档。如何记录项目及子项目?是否有任何机器均可读的特征、脚本、数据集或模型的元数据?
5.交互式计算。在交互式计算中,你选择JupyterLab、RStudio、ROOT、Octave仍是Matlab?您是否为交互式并行计算设置了一个聚类(如ipyparallel或dask)?
6.做业队列和调度程序。代码如何运行?是否须要安排按期维护?
7.计算图。如何描述计算图并创建可重复性?
8.实验管理。如何收集、查看和分析模型培训进度和结果?使用 ModelDB、Hyperdash仍是 FloydHub?
9.监控仪表板。如何收集和跟踪模型在生产环境中的具体表现?使用元数据库、Tableau、 PowerBI仍是Grafana?
最后,我总结了一个电子表格,包含了本文提到的全部工具,可自行下载使用。
本文为云栖社区原创内容,未经容许不得转载。