决策树是什么?
决策树是一种常见的机器学习算法,它的思想十分朴素,类似于我们平时利用选择做决策的过程。类似流程图的结构,每个节点都可以进行判断,然后进入不同得决策子树中,直至到达叶子节点。
比如在相亲中,我们要判断是否要见对方,通常会根据几个衡量标准来做出决策,生成的决策树图如下所示:
通过上面例子,我们可以得出两个比较核心的问题:
1. 我们应该选择什么作为划分特征,即年龄、长相、收入等
2. 我们应该选择什么数值作为划分标准,即年龄大于30,小于30等
所以我们应该如何找到这样的特征及标准,可以让我们的决策树可以进行最优的划分?
决策树的最优划分特征
信息熵
熵是热力学中的概念,表示混乱程度。熵越大,热力系统中粒子无规则的运动越剧烈;熵越小,粒子越趋近于静止的状态。引入到信息论中,信息熵表示随机变量的不确定度,即对于一组数据来说,越随机,不确定性就越高,信息熵越大;不确定性越低,信息熵就越小。
熵的公式如下: Pi 是指每一类信息所占的比例。 假设我们有三组数据,每一组数据分为三类,占的比例分别为: 对上面的数据根据公式分别求取信息熵: 我们发现第一组数据的信息熵最大,即当每一类数据出现的概率都相等时,此刻数据 是最不确定的。而第三组数据信息熵最小,即数据全都属于第一类的,数据是确定的。
基尼指数
基尼指数(Gini),也被称为基尼不纯度,表示在样本集合中一个随机选中的样本被分错的概率。 Gini系数越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高,反之,基尼指数集合越不纯。 数学公式为:基尼指数(基尼不纯度)= 样本被选中的概率 * 样本被分错的概率 假设有K个类,样本点属于第K类的概率为Pk,则概率分布的的基尼指数定义为: 用上面的数据进行基尼指数计算 我们得到的结论和信息熵的一样,即基尼指数越小,数据越稳定。 那么信息熵和基尼指数有什么区别呢? 1. 信息熵的计算比基尼系数稍慢 2. Sklearn中默认为基尼指数 3. 对于大多数二分类没有特别的效果优劣如何划分决策树?
信息熵和基尼指数告诉了我们决策树的划分标准,那么我们该如何进行划分呢?于是有了一系列的决策树划分算法:CART、ID3、C4.5等。这里主要来说CART。 CART算法是基于基尼指数来做分类任务的特征选择的。CART算法的一般流程: 算法从根节点开始,用训练集递归建立CART分类树。 输入:训练集D,基尼系数的阈值,样本个数阈值。 输出:决策树T。 1. 对于当前节点的数据集为D,如果样本个数小于阈值或没有特征,则返回决策子树,当前节点停止递归。 2. 计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。 3. 计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数。 4. 在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,左节点的数据集D为D1,右节点的数据集D为D2。 5. 对左右的子节点递归的调用1-4步,生成决策树。Sklearn实现
import numpy as npimport matplotlib.pyplot as pltfrom sklearn import datasets# 加上0.25的噪音X,y = datasets.make_moons(noise=0.25,random_state=666)plt.scatter(X[y==0,0], X[y==0,1])plt.scatter(X[y==1,0], X[y==1,1])plt.show()
# 绘制决策边界def plot_decision_boundary(model, axis): x0, x1 = np.meshgrid( np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1), np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1), ) X_new = np.c_[x0.ravel(), x1.ravel()] y_predict = model.predict(X_new) zz = y_predict.reshape(x0.shape) from matplotlib.colors import ListedColormap custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9']) plt.contourf(x0, x1, zz, cmap=custom_cmap) # 生成决策树模型dt_clf = DecisionTreeClassifier(min_samples_split=10)# 拟合模型dt_clf.fit(X, y)# 绘制plot_decision_boundary(dt_clf, axis=[-1.5, 2.5, -1.0, 1.5])plt.scatter(X[y==0,0], X[y==0,1]) plt.scatter(X[y==1,0], X[y==1,1]) plt.show()
这里设定决策树的参数 min_samples_split:是指对一个内部结点划分时,要求该结点上的最小样本数。此外Sklearn还提供了很多参数,可以根据之前提到的网格搜索方法进行参数调优。
决策树优缺点
优点
1. 决策树易于理解和解释,易提取出规则,便于可视化分析。 2. 可以同时处理标称型和数值型数据。 3. 天然支持多分类。 3. 比较适合处理有缺失属性的样本。 4. 能够处理不相关的特征。缺点
1. 决策树容易发生过拟合,但是随机森林可以很大程度上减少过拟合。 2. 容易忽略数据集中属性的相互关联。 3. 决策树划分的决策边界都是与横平竖直的,对倾斜的数据不能够很好的划分。