本文的标题非常不负责任,概 AI 基础这门课本身的课程内容极具争议的缘故。

拿到了数据后要先进行一些预处理才会拿去做模型训练。这里面的门道比想象中多。

概述

首先我们理清数据预处理的流程,用到的比较具体的技术和方法会在下面专门讲。

首先,我们需要清除一些错误的数据。一个比较有效的统计方法是使用箱线图来去除极端的值。

有些数据的特征可能含有缺失项,如果确实不具备参考价值可以直接删除(pandas 中可以调用 dropna)。但是如果要利用含有缺失项的特征,我们需要适当给予补充修复。常见的做法是使用已有数据平均值/中位数/默认值/相邻的值补全,或者采用某种公式插值(线性插值,例如按照时间排序的温度信息)。

接下来我们需要做一些数据转化。对于实数特征我们可以按照某种公式进行规范化,对于图片我们可以裁剪、压缩等等,对于文本数据可以做分词和词的分类(英文单词的不同变形)等等。

在这之后,我们可以使用特征工程的一些方法来筛选、简化、合并特征,使得之后的(深度)学习过程更加容易。为此我们主要进行特征选择,很多特征选择的方法也会对应特征的合并或者训练上的调整。

箱线图1

箱线图主要用于检测数据中的离群值。

表示所有数值的中位数,表示小于这部分值的中位数(第一四分位数),为大于这部分值的四分位数(第二四分位数)。就是箱子的范围。

为四分位间距 Interquartile range。则就是线段的范围。

落在线段之外的值就是离群值(outlier)。下面就是本次作业的房子数据各个特征的箱线图,可以发现确实有许多离群值:

用到的库是 python 的 seaborn

信息熵

首先我们给出信息熵的定义:对于随机变量,和其服从的概率分布,定义

信息熵可以理解为系统内不同事件信息量的期望。

对于两个随机变量和其联合分布,我们可以定义联合熵

它描述一个联合分布的不确定程度。此外,已知的不确定程度可以用条件熵表征:

条件熵与联合熵的关系是,可以通过推导证明。有了熵,我们就可以定义互信息

结合一下条件熵与联合熵的关系,可以发现,可以画出直观易懂的维恩图。

决策树

决策树可以将一组数据按照其特征进行分类,其中

  • 根节点包含所有数据
  • 每个非叶子节点中的数据会按照某个属性进行分类,将分类的数据放在子节点中
  • 每个叶子节点对应决策结果

要构建决策树,主要考虑的问题是选择什么属性来划分数据最优。直观上我们希望划分后尽量是“均分”的,而不是所有数据归为一类。为了衡量划分的优秀性,我们可以结合上文提到的信息熵。

划分准则

我们可以使用信息增益来度量划分的优秀性。为此首先我们要度量数据集在分类标签集下的纯度

其中表示标签为的数据集合,自然表示划分到类别所占的比例。越高意味着样本纯度越低。

特征的信息增益定义为

单从实现的角度,可以不管。后面的和式描述的是特征的每个取值下样本的纯度。显然纯度越有利于分类,因此我们取一个负号在前面。

信息增益还可以理解为属性与标签之间的互信息。

但是信息增益的问题是如果的取值过多,每个取值下的数据过少,这样的分类效率和泛化性都不高。

我们还可以采用增益率作为划分准则:

这样就缓解了上述问题。

另一种划分准则是基尼指数(Gini index,也称 Gini Impurity):

特征的 Gini 指数为

越小,意味着以特征划分后信息量越少,说明这种划分对提升数据纯度的帮助越大。

事实上我们可以类比信息增益定义 Gini Decrease 为

回归树

上面描述的都是利用离散的特征对数据分类的问题。

如果特征是连续的值,我们可以将其按照某种分度离散化。

如果目标是对数据的标签做回归分析(例如房价预测),我们只需要稍微魔改一下决策树就能解决这个问题。为此我们引入回归树。

回归树与决策树结构相同,但是对于集合纯度我们使用估计。设表示数据集的方差,,那么最优特征定义为

决策树和回归树在 sklearn.tree 中均有对应的 API 可以调用。

数值规范化

常见的规范函数有

  • 线性映射为之间的值(min-max normalization):

  • 映射成均值为,方差为的数据分布(z-score normalization):

  • 十进制缩放(decimal scaling):

    其中为使得的最小的

  • 对数缩放(log scaling):

特征选择

特征选择解决问题是:当可用的特征过多时,选择其中最合适的作为子集,最大化训练模型的效率。首先我们可以使用 Pearson 相关系数、互信息、Gini index 等方法来判断两个特征的相关程度。我们也可以将特征选择的过程和模型训练结合到一起,也就是嵌入法。还可以将特征选择看成搜索问题。

Pearson 相关系数

中学知识:

scipy 中有对应的 API。

嵌入法

对于一个回归问题,以线性回归为例,特征可以抽象为维向量,回归目标为。对于多个数据,目标函数是。使用的模型是

而 Lasso 方法则在线性回归的基础上对的值进行正则化:

正则化下,大部分系数会是一个接近的数字,剩下的绝对值很大的系数对应的是重要的特征。这种方法统称嵌入法。

值得一提的是,Ridge2 回归也使用了相似的思想,即在最小化损失的同时对参数进行规范化,如果要用它做特征选择可能会需要做一些矩阵运算。

迭代法

如果将特征选择看成搜索问题,暴力搜索有种情况,十分不优秀。

此时我们可以使用贪心的方法,从空集开始每次加入一个特征,并计算模型的性能提升程度(递增);或者从全集开始每次减少一个特征,并计算模型的性能降低程度(递减)。

Gini Importance3

也称 Mean Decrease in Impurity (MDI)。Gini Importance 的实现方式目前存在争议。这里我们讲的是 sklearn 的实现方法45

设决策树的结点集合为表示结点上的数据,表示上用于分割的特征。那么特征的 Gini Importance 定义为

Permutation Importance

也称 Mean Decrease in Accuracy (MDA)。

我们可以将数据的某个特征打乱顺序,计算打乱前和打乱后的准确性,那么这个特征的重排重要性就是,以此来估计哪些特征具有保留价值。

sklearn.inspection 中有对应的 API。

SHAP6

SHAP 是一个用于特征解释的工具,也可以用于特征选择。

相关连接

1. https://en.wikipedia.org/wiki/Box_plot

2. https://en.wikipedia.org/wiki/Ridge_regression

3. https://medium.com/the-artificial-impostor/feature-importance-measures-for-tree-models-part-i-47f187c1a2c3

4. https://scikit-learn.org/stable/modules/tree.html#tree-mathematical-formulation

5. https://github.com/scikit-learn/scikit-learn/blob/108486011b833cef8061615d926e2883941b9123/sklearn/tree/_tree.pyx#L1114

6. https://github.com/slundberg/shap