2.4 标准化在数据科学项目中的意义
本节名称取为“数据科学”,而不是“机器学习”,表明本节的侧重点在数据、项目与业务更广的范畴。
我们先看一个非常常见的场景:程序员往往会忘记一年前甚至一个月前的代码为什么如此编写,类似地,做数据分析、机器学习项目时,复盘时极有可能已忘记“初心”。此时,标准和规范会让你有迹可循。
了解Python Web开发的读者在使用Django框架时,建立项目只需使用一个命令即可自动生成标准的开发目录,较成型的IT企业在新建软件项目时都有类似标准的项目结构,即项目模板。从程序员的角度来说,之所以形成这种习惯,一是程序员不愿重复做相同的事情,如果一个功能、模式或流程重复3次,那么就应该形成代码,释放双手;其次,说明该类型工作具有共性,能形成标准,且能抽象成模式。那么在数据科学项目中,是否有类似的标准或惯用的开发模式呢?答案是肯定的。在第4章中大家将会看到项目定义、取样、分析、特征、建模、评估、报告等一系列的标准化的流程。
数据科学非常容易出错,且不易发现。如第1章所述,传统软件和机器学习开发模式的差异,前者是确定性的0或1,非对即错;后者则是0到1,没有确定性结果。机器学习求解算法中既有确定性算法(每次运行结果一致),也有不确定性算法(不能保证每次运行结果一致)。你几乎无法通过结果推断在整个处理过程中是否出错,是否有Bug,甚至某个意外或随机性反而能得到更好的模型性能表现,也不确定所使用的开源包是否正确。统计学大师George Box有一句名言:“所有的模型都是错误的,但是有些是有用的。[1]”这句话会让人心生感慨。所以,数据科学项目中除了要保障代码质量,处理方法和流程也一样重要,因为它关乎正确。机器学习中数据处理、调参等过程中包含的个人经验偏多,建模过程和结果是否可重现也是评判项目是否有效的重要依据,而不能是意外得到的结果!
下面我们依然从工程环境的角度出发,研究如何定义数据科学项目目录结构的标准和规范,使项目的启动、开发、构建、分享和交接传承更加便利。想要实现这个目标,需要考虑如下几点:沉淀已有的开发建模经验,比如工作流程、命名规范、常用配置;标准化和规范化的开发和交付;自动化与周边IT系统的潜在集成。这些又可细分为如下几点。
·对数据、代码、文档、模型文件、notebook、报告、描述性文件(背景、业务说明等)等分门别类进行管理。
·代码静态检查(flake8)。
·原始数据不可变,需要保留备份,一般存于数据库或不能被编辑的文件中。
·流程依赖与管道(pipeline)管理。
·环境管理,包括虚拟环境(Pipenv/Virtualenv/Docker等)。
·秘钥管理。私密信息保密,尤其在提交Git时,设置必要的隐藏文件和.gitignore。已有不少的程序员犯过将账号信息提交到了代码仓库的错误。对于使用云的项目,同样需要将连接凭证进行私密保存。
·常用及公用的包和环境设置(python-dotenv)。
·不可随意添加或修改目录结构,尤其是上层的目录结构。
·避免频繁迭代,对变更做好全面评估,做好向后兼容。
这些问题是所有从事数据科学项目的工程师都会面临的问题,大家会把沉淀的最佳实践公开分享。接下来,笔者将结合开源项目,适当地进行人性化修改和处理,并分享给读者。
[1] https://en.wikipedia.org/wiki/All_models_are_wrong