决策树属于监督学习算法,是一种树状结构模型,可应用与分类与回归场景。
决策树的三要素:特征选择、决策树的生成 和 决策树的剪枝。
1、特征选择
决策树在划分子树的特征过程中,通常会使用以下三种划分准则:信息增益、信息增益比、基尼系数。
1.1 信息增益
- 熵
度量随机变量 的不确定性,熵值越大,随机变量的不确定性就越大。 - 联合熵
当有两个变量 , 时,定义它们的联合熵: - 条件熵
在随机变量 发生的前提下, 随机变量 发生,定义为 的条件熵: - 信息增益
随机变量的熵 与条件熵 之差,就是信息增益(Information Gain):
1.2 信息增益比
用信息增益作为划分特征的标准时,会倾向于选择类别取值较多的特征,因此提出使用信息增益比(Infirmation Gain Ratio)来校正这个问题。
特征的信息增益与其取值的熵的比值,定义为特征的信息增益比:
1.3 基尼系数
基尼指数(GiniGain)用来度量数据集的不纯度,基尼指数越小,样本纯净度越高。
假设有个类别,样本点属于第类的概率为,则基尼系数的定义为
2、决策树的生成
基于以上三种特征选择的方法,分别对应三种不同的决策树生成算法:ID3、C4.5、CART。
2.1 ID3决策树
ID3决策树使用信息增益作为特征选择的标准。
2.2 C4.5决策树
使用信息增益来选择特征的一个缺点就是容易偏向于优先选择取值种类较多的特征,除此之外,ID3决策树还有两个缺点:不能处理连续值特征,容易过拟合。
正对以上三个缺点,C4.5决策树给出了解决方案:
- 针对缺点1:ID3容易偏向于优先选取取值种类较多的特征。
解决办法就是用信息增益比替代信息增益。
- 针对缺点2:ID3不能处理连续值特征。
C4.5的思路是先将连续的特征离散化。比如,年收入特征是一个连续特征,我们可以先对年收入特征的所有取值进行排序,从小到大依次为“6,8,10,12,14”,它们对应的类别标签依次为“是,是,否,否,否”:找出类别标签有变化的地方,这里只有一次变化,对应的特征取值为 8 到 12 之间,这里取 10 作为划分阈值,即将年收入特征中小于10 的作为一类,大于等于 10 的作为另一类。
- 针对缺点3:ID3容易过拟合。
决策树的过拟合问题主要是由于树的分叉过细造成的。C4.5决策树引入正则化系数进行初步的剪枝来缓解过拟合问题。
除上述三点外,C4.5与ID3决策树几乎一样。
2.3 CART决策树
C4.5决策树虽然在ID3的基础上做了改进,但还是存在一些不足,主要表现在以下三点。
首先,ID3与C4.5每次划分子树的过程会设计大量的对数计算,计算过程较为复杂。
其次,ID3与C4.5都是采用多叉树形式,即每次划分子树都是按照所选特征的所有种类来划分的。也就是说,一旦按某个特征划分完子树后,该特征就不再起作用,导致特征信息的利用率较低。
最后,ID3与C4.5均无法处理回归预测问题。
针对上述问题,提出了一种叫做分类回归树(Classification And Regression Tree,CART)的模型,CART既可以处理分类问题,也可以处理回归问题。
- 针对缺点1:计算过程复杂。
当用于分类任务时,CART选择基尼系数作为特征选择标准,其计算要比基于熵的情况简捷很多。用于回归任务时,采用平方误差最小化准则选择特征。大量减少对数运算问题。
- 针对缺点2:对特征信息的利用率低。
CART决策树采用二叉树来对每一个特征进行划分,使得CART可以对同一个特征进行多次利用。
- 针对缺点3:无法处理回归预测任务。
CART通过计算每一次划分后的结果与实际值之间的均方误差,采用均方误差最小的原则寻找最有划分节点。
3、决策树的剪枝
决策树容易过拟合,所以需要对决策树进行剪枝,又可细分为:预剪枝、后剪枝。
3.1 预剪枝
3.2 后剪枝
参考博客:决策树及决策树生成与剪枝
4、决策树的scikit-learn实现
决策树的scikit-learn实现使用了优化后的CART模型,CART分类树对应的是sklearn.tree.DecisionTreeClassifier,而CART回归树对应的是sklearn.tree.DecisionTreeRegressor,二者参数基本一致。
class sklearn.tree.DecisionTreeClassifier(criterion=‘gini’, splitter=‘best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, class_weight=None, presort=False)
参数:
- criterion: 特征选择标准
- splitter:特征划分点选择标准。默认best,但数据量较大时,为了加快训练速度可以考虑用random
- max_features:划分时考虑的最大特征数
- max_depth:决策树最大深度
- max_leaf_nodes:最大叶子节点数
- min_samples_split:内部节点划分所需最小样本数。如果某节点的样本数小于设置的值,则不会继续分叉。默认是2,当样本数较大时,建议增大这个值。
- min_inpurity_split:节点划分的最小不纯度。限制分叉
- min_samples_leaf:叶子节点最少样本数
- class_weight:样本所属类别的权重。默认为None,当样本分布不均衡时,可设置为balanced
属性:
- feature_importances_:各特征重要程度
- tree_:底层的树对象
方法:
- fit():利用训练集训练模型
- score():返回测试集上的预测准确率
- predict():预测结果标签
- predict_proba():预测类别的概率
我们使用官方的鸢尾花数据集示例决策树算法。
# 导入数据
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:,:2] #为了方便可视化,只取其中两个维度的特征
y = iris.target # 分类标签
# 导入可视化包
import numpy as np
import matplotlib.pyplot as plt
# 模型训练
from sklearn.tree import DecisionTreeClassifier
DT_clf = DecisionTreeClassifier()
DT_clf.fit(X, y)
# 模型预测及分类结果可视化
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02), np.arange(y_min, y_max, .02))
Z = DT_clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx, yy, Z)
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title('Decision Tree use default parameter')
plt.show()