机器学习的建模流程

机器学习项目一般遵循一个固定的流程,从定义问题到部署模型。Figure 1 展示了一个典型的 pipeline:先明确研究问题,然后采集数据、清洗数据、预处理数据,接着做特征工程和建模,最后评估和部署。

Figure 1 Pipeline of Machine Learning


研究问题

在做机器学习之前,首先得搞清楚要解决什么问题。

一个清楚的研究问题应该包括:

  • 输入数据是什么?
  • 要预测的目标变量是什么?
  • 这是监督学习还是无监督学习?
    • 监督学习:有标签,比如回归、分类
    • 无监督学习:没标签,比如聚类、降维
  • 最终评价模型好坏的指标是什么?

问题定义不清楚,后面模型再好也没用。比如,预测房价是回归问题;判断邮件是不是垃圾邮件是二分类问题;把用户按行为分组是聚类问题。

研究问题也决定了要采集什么数据、用什么模型。所以别急着收集数据,先把问题想明白。


采集数据

数据是机器学习的基础,没数据就没法训练模型。

数据来源可以有很多:

  • 公开数据集,比如 Kaggle、UCI、政府开放数据
  • 业务系统里积累的数据,比如日志、交易记录
  • 自己通过爬虫或传感器采集的数据
  • 问卷调查或人工标注的数据

采集数据时要注意:

  • 数据量要足够,太少的话模型学不到规律
  • 数据质量要高,噪声太多会影响模型效果
  • 数据要尽量覆盖实际场景,不然模型上线后可能表现很差
  • 注意数据的合法性,别乱用用户隐私数据

收集到的数据通常比较脏,不能直接拿来用,所以下一步就是数据清洗。


数据清洗

在采集到的数据中,可能有丢失的,比如 NaN 或者 null,这种数据是不能直接拿来用的。为了解决这个问题,这部分数据会被 imputed,具体 impute 的方法要根据数据的类型来决定。

比如,把缺失的数据替换为某个数值,这个数值可以是平均值、随机值、中值或者众数。

再比如,有时候把整行或者整列删掉,因为它们会影响模型的预测结果。


预处理数据

不同模型,应用不同算法,需要不同的预处理方式。

比如,SVM 和回归通常需要数据标准化(均值 0,方差 1)。

再比如,决策树需要清理掉 NaN 和 null 值。

还比如,有些算法可以把数据缩放到 0-1 的区间(归一化),但是即便归一化了,也要关注离群点。


特征工程

为啥要进行特征工程呢?如果特征太少,那模型就没什么可学的;反之特征太多,就可能存在很多冗余的信息。

特征工程可能把两个或多个特征合并为一个新特征,或者使用某个函数(比如 log transform)将特征转换为另一个值。

标签编码

大部分模型要求数据为数字格式,整型或者浮点型。

像日期或字符串,需要被转换为数字类型,此过程被称为标签编码。

One-Hot encoding

Figure 2 One-Hot encoding

这种方法将一列中的类别值分散到多个状态位中,并给它们分配 0 或 1。这些二进制值表达了分组和编码的列之间的关系。

Dummy encoding

Figure 3 Dummy encoding

基于数据集的某一特征的 N 个状态值,用 N-1 位编码来作区别,Dummy encoding 和 One-Hot encoding 很相似,区别在于最后一个状态位。如果前几位都是 0,那么默认最后一位为 1。

log 变换

如果数据分布是偏斜的,log 变换可以让数据更加接近于正态分布,同时,离群值或异常值的影响会变小,模型会更 robust。

但是,必须确认模型的数据是的。


相关性 correlation

当模型的变量之间相互关联时,就会出现多重共线性。但是理想情况下,自变量之间应该是独立的,如果变量间的相关性太高,在模型拟合时就会出现问题。

如何解决变量间的高相关性

  • 删除一些高度相关的自变量。
  • 线性组合自变量,比如把它们加在一起。
  • 执行为高度相关的变量设计的分析,如主成分分析(PCA)或偏最小二乘回归。
  • LASSO 和 Ridge 回归是回归分析的高级形式,可以处理多共线性。

数据采样

涉及到把数据集分为 训练集测试集

  • 训练集:用于训练一个机器学习模型
  • 测试集:是用来最终评估训练好的机器学习模型

交叉验证一般在训练集上进行。

一般两个数据集的比例是 7:3 或者 8:2。