最近在看Hands-On Machine Learning with Scikit-Learn and TensorFlow,其中提到机器学习处理解决一个完成的任务需要的步骤,做个简单记录
机器学习完整工程大概有以下8个步骤:
- 总览问题和目标,希望得到什么结果
- 获取数据
- 探索数据,进一步获取更深层次的信心。
- 准备,预处理数据,以便模型训练最合适的数据。
- 选择不同的模型加以训练,得到最好的一个或几个。
- 微调模型(超参数), 有必要时进行模型组合。
- 演示,部署模型
- 启动,监视和维护模型。
最后,根据需求进行调节选择。
下面针对每一步做个大概说明:
总览问题, 目标
- 用机器学习的术语定义目标
- 如何使用解决方案
- 目前的解决方案/变通方案(如果有的话)是什么?
- 判断是什么类型的问题,监督非监督,在线离线等等
- 怎么进行性能评估
- 有类似的问题吗?是否可以重用解决方案和工具
- 列出所有可能的假设
- 如果可能的话,确认这些假设。
获取数据
尽量做到自动化,这样可以更方便得到新的数据。
- 列出所需要的数据
- 找到并记录可以在哪获取这些数据
- 检查需要占用的空间
- 有必要的话,检查法律,获取授权
- 新建一个工作目录,要有足够的空间
- 获取数据
- 对数据进行格式转换,以便维护(不能修改数据)
- 确认是否需要隐藏部分信息
- 检查数据的大小和类型,比如时间序列,样本,和地理位置。
- 随机(分层)抽样出一个测试集,用于最后测试,不能做数据分析。
探索数据
- 创建数据集的一个副本。如有必要,取样到适合大小。
- 创建jupyter文件,保存数据探索的过程。
- 研究每个属性及其特征
- 名称
- 类型(数值型,类别型,文本等)
- 缺失值的百分比(很重要)
- 噪声和噪声类型(随机、异常值、舍弃误差等)
- 分布类型,高斯?正态?均匀?对数?
- 如果是监督问题,确定标记出目标值。
- 可视化数据
- 研究不同属性间的相关性(corr)
- 研究通常怎么解决该问题
- 确定您可能想要应用的有希望的转换。
- 记录所得到的结果
准备数据
注意: 处理副本数据(保持原数据集的完整性) 将可能应用到的转换写成函数,优点如下:
- 下次得到新的数据时可以方便的进行转换。
- 在以后应用这些转换
- 清理和准备测试集数据
- 方案上线后,可以方便的清理和准备新数据
- 数据清洗
- 修复或删除异常值(可选)
- 填充缺失值(0, 平均数,中位数),或者删除该特征或对应的实例
- 特征选择(可选)
- 移除哪些对该任务无用的信息
- 在适当的地方进行特征工程
- 离散化连续性特征
- 分解特征(例如,分类、日期/时间等)
- 对特征值进行转换,取对数,开发,平方等。
- 对不同的特征尝试组合成新的特征
- 特征缩放,标准化或者归一化
得到较合适的模型
注意:
- 如果数据过大,可以将抽样出一个小的数据集来训练不同的模型,节省时间。不过对神经网络和随机森林可能会有较大的影响
- 再提醒,应尽量自动化这些步骤
- 使用标准参数,从不同的类别(例如线性、朴素贝叶斯、SVM、随机森林、神经网络等)快速训练基本的模型。
- 度量,比较不同模型之间的性能
- 对于不同模型,使用n folds进行交叉验证,计算平均值和方差。
- 分析对每个算法最重要的特征
- 分析模型所犯的错误类型,通常怎么处理
- 快速进行特征工程和特征选择
- 再次快速对以上步骤进行一两次迭代
- 列出最优的3到5个模型,尤其是有不同类型错误的模型
微调模型
注意:
希望在此步骤中使用尽可能多的数据,尤其是在接近微调的末尾时。
自动化处理。
- 使用交叉验证微调超参数
- 将数据转换也视为超参数,特别是不那么确定时。(比如是用0还是平均值填充缺失值,还是都删掉)
- 除非可以探索的超参数比较少,否则都首先使用随机搜索而不是网格搜索。(如果训练时间过长,可能需要使用贝叶斯优化方法)
- 尝试集成方法,对表现最好的模型进行组合,通常比单独的模型要好。
- 一旦确信这就是最终的模型,接着在测试集测量性能,估计泛化错误。
演示解决方案
- 记录已经完成的工作
- 做一个好的演讲,首先确保突出目标
- 解释为什么该方案实现了目标
- 不要忘记展示有趣的点
- 确保你的关键发现是通过漂亮的可视化或容易记住的陈述来传达。
启动
- 为生产环境准备解决方案
- 编写监控代码,检查系统的实时性能,并在它下降时触发警报。 3.随着新数据的加入定期重新训练模型(自动化)