如果你很关心模型的可解释性,那么决策树(Decision Tree)算法当之无愧为首选。
决策树算法如何工作
套用西瓜书上的一个图来说明决策树算法是如何工作的:
我们挑选西瓜时,都会考虑西瓜脐部、色泽、根蒂以及敲一敲听声音等因素(特征),决策树就是对这些考虑因素进行逐个拆解,从而判断西瓜(样本)是好瓜还是坏瓜(类别)。
从上面来看,这些特征好像都是离散型的,对于 Iris 数据集中数值特征来说,我们可以设定一个阈值,比如判断萼片宽度(sepal width)是否小于 2.5 厘米。
决策树算法从树根开始,选择能够产生最大信息增益(Information Gain,IG)的特征进行数据集拆分,一直到叶子节点为止,所有叶子节点中的样本都属于同一个类别,这样就可能会产生非常深的树,从而引发过拟合问题,所以就需要对树进行剪枝以限制树的深度(模型复杂度)。
最大化信息增益
信息增益的公式定义如下
f 是要执行拆分的特征,Dp 和 Dj 表示父节点 p 和第 j 个孩子节点中的样本集,Np 和 Nj 分别表示父节点 p 和第 j 个孩子节点中的训练样本数量。I 就表示节点的纯度。
所以信息增益就是衡量父节点纯度和所有孩子节点纯度加权和的差异。
包括 scikit-learn 在内的大多数机器学习库的决策树算法都会将父节点分裂成左右两个孩子节点,所以信息增益公式可以简化为:
三种纯度衡量指标
现在有 Gini 纯度、熵和分类错误三种节点纯度衡量指标。
首先我们看一下熵(entropy):
p(i|t) 表示节点 t 中属于类别 i 的样本占该节点中所有样本的比例。如果节点 t 中所有样本都属于同一个类别,那么熵就是 0,表示这个节点没有不确定性;如果节点 t 中的每个样本都分属于不同的类别,那么此时熵最大,表示这个节点的不确定性最大。
Gini 纯度可以看作是最小化误分类概率的指标:
在实际应用中,Gini 纯度和熵表现很类似,所以不建议花很多精力去比较在选择哪种纯度衡量指标。相反更应集中精力实验不同决策树剪枝技巧。
最后一个就是分类错误:
这个指标适合用来做决策树剪枝,但是由于它对于节点中类别概率分布不敏感,所以它不适合用来生成决策树。
生成决策树
我们现在使用 scikit-learn 提供的 DecisionTreeClassifier 构建一个深度为 4,采样 Gnini 纯度的分类决策树,还是使用 Iris 数据集。
决策树算法不要求特征缩放。
可以看到这些决策边界几乎和坐标轴平行。
我们可以可视化生成的决策树,从而也能对模型的预测结果做出解释。
树分支的左孩子表示满足父节点中的判断条件,右孩子表示不满足条件。
联合多棵树组成随机森林
集成方法因其良好的分类性能和对过拟合的鲁棒性而被广泛应用。
随机森林(Random Forest)算法就是结合了多个决策树模型来组合一个性能更好,不易于过拟合的集成模型。该算法主要有 4 步:
-
从训练集中有放回地抽取 n 个样本组成 bootstrap 样本集。
-
从 bootstrap 样本集中生成决策树:
-
无放回地随机选择 d 个特征。
-
根据最大化信息增益或者其他目标函数选择合适的特征进行节点分裂。
-
-
重复 1-2 步 k 次。
-
通过多数投票原则从生成的 k 个决策树模型投票结果中选择最终结果。
我们在选择 n 值时要注意。n 越小则导致每个决策树之间的差异变大,使得随机森林算法更随机,不过也会导致随机模型性能降低。n 越大会导致 同一个样本被反复抽取到的概率增大,从而使每个决策树模型都相似,最终导致随机森林模型过拟合。
建议 n 取原始数据集的大小,假设原始数据集中样本有 m^2 个特征,那么 d = m 比较合适。
现在我们就来构建一个具有 25 棵决策树的随机森林:
我们通过 n_estimators 参数指定森林中树的数量,n_jobs 参数指定要使用的 CPU 核数。
默认随机森林使用 Gini 纯度。