对于机器学习项目来说,你开始获得之后有一个总体思路很重要,也需要一些默认遵守的原则.
个人记录翻译
Hands-On Machine Learning with Scikit-Learn and TensorFlow 附录B
指导你完成你机器学习项目的清单列表
主要是有8个主要步骤:
- 从整体上思考观察所需要解决的问题.
- 获得数据.
- 仔细观察你的数据得到对这些数据的思路与想法.
- 将数据处理成符合机器学习算法所需要求.
- 找不同算法模型, 并寻找效果最好一个.
- 微调模型并将它们组合成一个很好的解决方案.
- 提出解决方法.
- 启动,监控和维护.
<1>从整体上思考所需要解决的问题
- 定义业务目标的解决方案.
- 解决方案如何使用?
- 目前的解决方案是什么(如果之前存在的话)?
- 如何去构建解决方案(监督学习/无监督学习, 线上/线下)?
- 如何衡量性能效果(例误差率这些)?
- 性能效果的提升与否是否与业务目标一致?
- 业务目标所需的最低性能标准是多少?
- 是否存在类似的项目, 是否存在可以重用的工具或者经验?
- 是否有人类专业知识?
- 你将会如何手动解决问题?
- 列出至今为止做出的假设.
- 如果可能验证假设.
<2>获得数据
Note: 尽可能地自动化,以便轻松地获取数据
- 列出需要的数据列表与数据量大小.
- 寻找数据并且记录找到这些数据的方法.
- 检查这需要多少空间.
- 检查法律义务,必要时申请授权.
- 获得访问权限授权.
- 创建工作空间.
- 取得数据.
- 将数据成方便你操作的类型(无需改变数据本身).
- 确保删除或者删除隐私信息.
- 检查数据的大小和类型(时间序列,样本,地理位置等).
- 抽取一部分数据集作为测试集,放到一边不要看.
<3>探索你的数据
Note: 跟领域专家探讨下列这些步骤
- 复制数据(如果需要, 抽样成一个可管理的大小).
- 创建一个 Jupyter notebook 记录探索数据过程.
- 研究每个特征和属性:
– 名称
– 类型(明确,有界/无界,文本,结构化的,等等)
– 数据缺失率
– 噪声与噪声类型(随机,异常值,舍入误差等)
– 可能对项目有用嘛?
– 数据分布情况(高斯分布,均匀,对数).
<4>准备数据
Notes:
- 在复制数据上工作(保证源数据的完整性)
- 为所有数据的转换编写函数,为下列5个理由:
- 为了更容易地准备数据当你获取得新数据
- 可以应用这些转换在未来的项目
- 清洗和准备测试集
- 清洗和准备新数据一旦解决方案是实时的
- 便于选择超参数
- 数据清洗
–修复或者移除离群值(可选).
–填充缺失值(0,平均值,中位数等等)或者删除这一行或列 - 特征选择(可选)
–删除不提供任务有用信息的属性 - 特征工程,恰当时
– 分离连续特征
– 分解特征(例如:分类,日期/时间等)
– 添加可能有用的特征转换(log(x), sqrt(x), x^2 等)
– 聚合特征去形成可能有效果的新特征 - 特征缩放,标准化特征
<5>列出可能有效的模型列表
Notes:
– 如果你有大数据集,你可能想要抽样小数据集便于在可能的时间内多次试用不同的模型(但要记得小数据集会惩罚复杂的模型,如随机森林,大型神经网络等)
– 一再强调,尽可能地自动化这些步骤:
- 训练来自不同类别的许多快速的模型(例如,线性,朴素
贝叶斯,SVM,随机森林,神经网络等)使用标准参数。 测量和比较他们的表现
– 对于每个模型,使用N折交叉验证,测试每个模型性能的平均值与标准差.分析每个模型的最重要属性.
分析每个模型出现误差的原因.
– 人们一般如何解决这些误差快速进行功能选择和工程设计.
- 对上述5个步骤进行一次或两次快速迭代.
- 找出最可能表现得最好的3到5个模型, 更倾向于那些误差原因不同的模型.
<6>微调模型
Notes:
– 尽可能地准备更多的数据以用于模型微调.
– 尽可能自动化
使用验证微调你的超参数.
– 将数据选择转换视为超参数,特别当你不确定时(例如缺失值是否用平均值,中位数填充,或者干脆删除)
– 除非要探索的超参数值非常少,否则更喜欢随机
搜索网格搜索。 如果训练时间很长,您可能更喜欢贝叶斯训练
优化方法.尝试合并的方法.组合表现最好的模型往往比你单独使用他们表现来得好.
- 一旦决定你的最终模型,测量它在测试集上的性能表现,用于评价模型误差.
ps:测量泛化误差后,请勿调整模型,你只是开始过度拟合测试集.(不明白)
<7>提出你的解决方案
- 记录你完成的事情.
- 创建一个漂亮的演示文稿
- 解释解决方案实现业务目标的原因.
不要忘记提出一些有趣的点.
– 如哪一些有效,哪一些无效,列出你的假设与系统的限制确保通过可视化一些精美的图表与容易记住的陈述来传达您的主要发现.
<8>启动
- 准备好生产解决方案(插入生产数据输入,写入
单元测试等)。 - 编写监控代码,以定期检查系统的实时性能。
vals并在它下降时触发警报。 - 谨防缓慢退化:随着数据的发展,模型往往会“腐烂”。
- 测量性能可能需要人工管道(例如,通过人群 -
服务)。 - 还监控输入的质量(例如,发送故障的传感器 -
dom值,或其他团队的输出变得陈旧)。 这尤其如此
对在线学习系统很重要。 - 定期在新数据上重新训练模型(尽可能自动化)
BLE)