本文参考我自身的项目经验以及 Hands-On Machine Learning with Scikit-Learn &TensorFlow 的 Appendix B 所列举出来的机器学习项目清单。

机器学习项目清单

  1. 在宏观上确定整个问题的架构
  2. 获取数据
  3. 探索性数据分析(Exploratory Data Analysis, EDA)以洞悉数据
  4. 数据准备(Data Prepration)准备数据,将数据中可能隐含的模式暴露给ML算法
  5. 尝试使用多种不同的模型,并列出最佳模型
  6. 模型调参(Fine-tune),并将其结合为一个最好的解决方案
  7. 展示解决方案
  8. 运行、部署、监控及维护机器学习系统

在宏观上确定整个问题的架构

  1. 用业务术语定义目标
  2. 解决方案将如何使用?
  3. 当前有什么解决方案?
  4. 应该如何解决这个问题(有监督/无监督,在线/离线等)?
  5. 应该如何衡量性能?
  6. 性能指标是否符合业务目标?
  7. 达到业务目标所需的最低性能是多少?
  8. 是否有类似的问题?有可以重用的经验/模型/工具吗?
  9. 是否可以把专家的经验加入模型中?
  10. 如何手动解决问题?
  11. 列出目前为止所做的假设
  12. 如有可能,验证假设

获取数据

注意:尽可能地自动化,以便可以轻松获取新数据。

  1. 列出所需的数据内容及量级
  2. 寻找并记录可从何处获得该数据
  3. 检查数据占用空间大小
  4. 检查是否需要获得授权
  5. 获取访问授权
  6. 创建一个workspace(具有足够的存储空间)
  7. 获取数据
  8. 将数据转换为可以轻松操作的格式(无需更改数据本身)
  9. 确保数据已脱敏(被删除或保护)(例如匿名)
  10. 检查数据的大小和类型(时间序列,样本,地理等)
  11. 抽样选出测试集,将其放在一边,再也不要去看它

探索性数据分析(Exploratory Data Analysis, EDA)

注意:请尝试从现场专家那里获取有关这些步骤的见解。

  1. 创建数据副本以进行探索
  2. 创建一个Jupyter笔记本以记录EDA过程
  3. 研究每个属性及其特征:

    • 名称
    • 类型(分类,整数/浮点数,有界/无界,文本,是否结构化等)
    • 缺失值的百分比
    • 是否存在噪声,及噪声类型(随机,离群值,四舍五入误差等)
    • 对模型建立可能有用吗?
    • 分布类型(高斯分布,均匀分布,对数分布等)
  4. 对于有监督的学习任务,确定target属性
  5. 对数据进行可视化
  6. 研究属性之间的相关性
  7. 研究如何手动解决问题
  8. 确定可能想要应用的有希望的转变。
  9. 找出有用的外部数据
  10. 记录所有的发现

数据准备(Data Prepration)

注意:

  • 处理数据副本(保持原始数据集完整)
  • 把所有使用到的数据转换(data transformations)编写成函数,原因有5个:

    • 以便下次获取新的数据集时可以轻松准备数据
    • 可以在以后的项目中应用这些转换
    • 清理及准备测试集
    • 以便解决方案启用后,清理并准备新的数据实例
    • 可以更方便地将准备选择作为超参数
  1. 数据清理:

    • 修复或删除异常值(可选)
    • 补充缺失值(例如,零,均值,中位数…)或删除其行(或列)
  2. 特征选择(可选):删除对任务不提供有用信息的属性
  3. 适当时进行特征工程:

    • 离散化连续特征
    • 分解特征(例如分类,日期/时间等)
    • 为特征添加适合的转换(例如$\log x$,$\sqrt x$,$x^2$等)
    • 将特征融合为适合的新特征。
  4. 特征缩放:标准化或标准化特征。

选取合适的模型

注意:

  • 如果数据量巨大,则可能需要对较小的训练集进行采样,以便可以在合理的时间内训练许多不同的模型(请注意,复杂的模型在这种情况下效果会变差,例如大型神经网络或随机森林)
  • 再次强调,尽可能自动化地执行这些步骤
  1. 使用标准参数训练来自不同类别(例如线性,naiveBayes,SVM,随机森林,神经网络等)的许多quick-and-dirty的模型。
  2. 测量并比较其性能对于每个模型,

    • 使用K-Fold交叉验证,并计算性能的均值和标准差
  3. 分析每种算法的重要变量
  4. 分析模型所犯错误的类型

    • 人们将使用什么数据来避免这些错误
  5. 快速进行特征选择和工程设计
  6. 在前五个步骤中再进行一两次快速迭代
  7. 列出前3-5个最有希望取得最优效果的模型,最好选择会产生不同类型错误的模型。

微调系统

注意:

  • 需要在此步骤中使用尽可能多的数据,尤其是在即将进行微调时
  • 一如既往地自动化
  1. 使用交叉验证对超参数进行微调

    • 将数据转换选择视为超参数,尤其是当不确定它们时(例如,我应该将缺失值替换为零还是中位数?还是只删除行?)
    • 除非要探索的超参数值很少,否则应优先选择随机搜索而不是网格搜索。如果训练时间很长,可能更适合使用贝叶斯优化方法(例如,使用高斯先验过程)
  2. 尝试集成方法,组合最好的模型通常会比单独运行它们更好
  3. 一旦对最终模型有信心,就可以在测试集上衡量其性能,以估计泛化误差

解决方案展示

  1. 记录所做的事情
  2. 创建一个漂亮的演示文稿,确保首先突出显示大图
  3. 解释为什么解决方案可以实现业务目标
  4. 不要忘了提出一路上注意到的有趣观点

    • 描述什么有效,什么无效
    • 列出假设和系统的局限性
  5. 确保通过漂亮的可视化效果或易于记忆的陈述传达主要发现(例如,“中位数收入是房价的第一预测因子”)。

运行、部署、监控及维护机器学习系统

  1. 准备解决方案以进行部署(加入生产数据的输入,编写单元测试等)
  2. 部署代码,使用开源活云端部署工具进行部署
  3. 编写监控代码,以定期检查系统的实时性能,并在系统down掉时触发警报

    • 也要注意模型效率的缓慢的降低:随着数据的更新,模型泛化能力会变差
    • 衡量模型效率可能需要人工进行
    • 监视输入数据的质量(例如,传感器出现故障,发送了随机值,或者另一个团队的输出有问题),这对于在线学习系统尤其重要
  4. 定期根据新数据重新训练模型(retrain)(尽可能自动化进行)。
最后修改:2021 年 06 月 01 日 02 : 22 PM
如果觉得我的文章对你有用,请随意赞赏