前段时间,基于scikit-learn
这个库,对机器学习 相关的主要方面写了一系列的文章,
其中包括数据加载方面,数据预处理方面,比较知名的一些监督算法和无监督算法的介绍,以及模型的评估和持久化相关的内容。
基本囊括了一个机器学习项目所需要的方方面面。
本篇作为机器学习的一个总结,整理了在机器学习项目中,各个阶段需要特别注意的事项。
题目中的"最佳实践",只是我个人目前的最佳实践,文中如有不当之处,欢迎指正。
1. 机器学习项目流程
一个机器学习项目,一般分为四个阶段:
- 数据收集
- 数据清洗
- 模型训练
- 模型部署
这四个阶段并不是严格的自上而下依次执行的,
比如,数据清洗 时如果发现缺失太多,获取数据错误较多的话,是要回到第一步重新采集的;
即使在模型训练阶段,训练效果不好如果是数据问题,也会回到第一步重新收集数据。
下面整理的各个阶段的**"最佳实践"**,目的之一就是保证每个阶段能够尽量完善,进入下一个阶段后,尽量避免再次回到上一个阶段,提高完成机器学习项目的效率。
2. 数据收集阶段
数据收集是第一个阶段,没有数据,机器学习无从谈起。
不过,这个阶段不是一上来就想着如何用各种爬虫技术去收集数据,而是先透彻理解项目目标。
将要进行的机器学习项目究竟为了得到什么样的模型?为了解决什么问题?为了配合什么业务?
了解项目为什么做之后,再根据目标来确定需要什么样的数据。
采集数据时,每类数据的字段尽量多采集一些,否则以后补采集很困难,甚至有些数据过了时间就采集不到了。
比如,采集房产销售数据,成交价,成交时间,以及房屋面积等等信息很重要自不必说,
采集数据时,也可以顺带采集房屋的挂牌时间,挂牌价,阳台朝向,是否有电梯等等。
这些信息看似暂时用不上,后续难保不会用上,如果后续要用,一方面补采麻烦,另一方面如果时间长了不一定能采集到(比如链家上,某一地区的成交信息只提供最近的几千条)
另外,采集信息时,相同的名词保持一致。
比如,采集南京雨花台区 的房产交易数据,所以数据统一用南京雨花台区 ,不要有的房产用南京雨花 ,有的用雨花台区 等等。
特别是日期字段,统一成 年/月/日 ,或者 月/日/年 等方式,所有数据用一种方式表示时间。
3. 数据清洗阶段
数据清洗阶段需要注意的包含数据预处理 和特征工程两个部分。
3.1. 数据预处理
首先,处理采集来的数据中的缺失值 和重复值 。
因为机器学习算法本身 是不考虑缺失值 和重复值,我们需要自己来保证提供给算法的数据尽量精确。
对于重复值 ,一般就是删除,对于缺失值,根据情况,可以删除或者用插值来填补。
其次,用数值代替类别型特征,
比如,对于一些定性的数据,比如风险级别、职业和兴趣等,需要转换为数值型便于后续算法计算。
还可以对类别型特征进行编码,将其编码成数值,比如常用的one-hot
编码。
最后,数据的属性如果数量级差别 很大,还需要做数据缩放处理。
对数据取值范围不敏感的算法,比如朴素贝叶斯,基于树的算法对率回归和线性回归等等,不一定需要缩放数据;
而其他涉及样本数据之间任何形式的距离的算法,需要缩放特征和标准化处理。
3.2. 特征工程
特征工程 的目的是提取数据中的有用信息,并将这些信息转换为适合用于机器学习模型的格式,以提高模型的性能。
特征工程需要一定的专业背景知识,带着领域知识做特征工程,利用业务经验和洞察力,将数据中与预测目标相关的信息以形式化的方式表示出来。
特征工程中,最重要的是从数据中提取出最有效的特征,删除冗余或不相关的特征,减少预测模型的训练时间。
注意 ,不一定每次都是对数据进行降维 处理,若数据包含的相关特征很少,有时会去组合新的特征,也就是升维 。
这时,每个特征生成方法要保留,训练模型失败后,需要回过头来重新生成或者调整特征,这时需要知道特征是怎么来的。
如果我们缺少领域知识,是不是就无法做特征工程 了?如果能做的话,如何做特征工程 呢?
答案是如果缺少领域知识,仍然有一些方法帮助我们做特征,比如:
- 二值化:设定好阈值,将数值型特征转化为二值型
- 离散化:将数值型特征转化为有限个类别型特征
- 交互型:包括求和,相乘或两个数值特征之间的任意运算,还有两个类别型特征的联合条件检验
- 多项式转换:生成多项式和交互特征的过程
4. 模型训练阶段
模型训练 阶段的重点在于准备算法 和评估训练效果 。
模型训练 开始前,其实是不知道哪种算法是最合适的,一般会准备3个左右 的备选算法。
确定备选算法前,需要考虑:
- 训练集大小
- 数据集的维度
- 数据是否线性可分
- 特征之间是否独立
- 偏差和方差的容忍度,如何权衡
- 是否要求线上学习
- 等等。。。
评估模型 训练效果,最关注的要属欠拟合 和过拟合 。
一般通过绘制学习曲线来诊断过拟合和欠拟合,诊断有拟合问题的话,可以尝试下面方法来解决:
- 交叉检验
- 正则化
- 尽可能保持模型的简单,模型越复杂,就越可能过拟合
- 集成学习,整合一系列较弱的模型,形成更强大的模型
5. 模型部署阶段
模型部署阶段的最佳实践比较简单,主要做好以下几点。
首先,模型一定要序列化保存 ,使得模型可以在其他机器上重用,也避免每次使用模型都要重新训练。
其次,模型使用中,随时监控模型 的性能,记录使用中发现的模型的不足之处。
最后,定期更新模型,即使训练出符合评估效果的模型也不是一劳永逸,随着新的数据产生,监控模型时发现的问题,需要定期更新数据和算法参数,训练新的模型来替换原有模型。
6. 总结
各个阶段的 "最佳实践" 要点总结如下:
- 数据收集阶段
- 理解项目目标
- 数据相关字段尽量多采集
- 数据中相同的名词保持一致
- 数据清洗阶段
- 处理缺失值和重复值
- 类别型数据数值化
- 类别型数据编码
- 数据缩放处理
- 特征工程
- 模型训练阶段
- 准备算法
- 评估模型
- 模型部署阶段
- 模型保存,重用
- 监控模型
- 定期更新模型