您的位置:

机器学习之决策树

一、什么是决策树?

决策树是一种基于树形结构的机器学习算法,用于进行分类和回归分析。在分类问题中,决策树将数据分成不同的类别,每一个叶子节点代表一个类别。在回归问题中,决策树用于预测数值型数据。决策树表现为一棵树,其中每一个内部节点表示一个在输入数据中的特征,每一个分支代表这个特征可能的结果,而每一个叶子节点代表一个类别(或者一个数值)。

决策树的生成主要通过一种自顶向下的递归分治方法,方法是根据不同的特征对数据集进行划分,从而生成树形分类模型。对于每一个分支节点,算法选择对数据集进行最大化的增益(或最小化的不纯度)的划分。这个过程会不断重复,直到所有数据都被分到叶子节点为止。

二、决策树算法原理

决策树的核心原理是分治策略。它将一个大问题分成数个小问题,每个小问题的解决对应树中一步的执行。决策树的生成主要分为两个步骤:节点的分裂和停机。

节点的分裂是指将已有节点划分为多个子节点,通过这种方式,可以使得每个节点的规模变小,从而更加容易处理。对于每一个分裂,需要选择一个特征,使得通过这个特征可以最好地区分不同的样本。

停机是指对决策树生成的停止条件。通常情况下,停止条件可以有三种,分别是:所有样本都属于同一类,无法分裂节点,达到指定的树的深度。判断是否停止生成可以根据不同的算法有不同的方式。

三、使用决策树进行分类

下面通过一个实例来展示如何使用决策树进行分类。我们有以下的数据集:

Outlook,Temperature,Humidity,Windy,PlayTennis
sunny,hot,high,false,No
sunny,hot,high,true,No
overcast,hot,high,false,Yes
rainy,mild,high,false,Yes
rainy,cool,normal,false,Yes
rainy,cool,normal,true,No
overcast,cool,normal,true,Yes
sunny,mild,high,false,No
sunny,cool,normal,false,Yes
rainy,mild,normal,false,Yes
sunny,mild,normal,true,Yes
overcast,mild,high,true,Yes
overcast,hot,normal,false,Yes
rainy,mild,high,true,No

每个样本有四个属性,分别为 Outlook、Temperature、Humidity 和 Windy。我们使用决策树对样本进行分类。

首先我们计算数据集中每个属性的信息熵和信息增益,然后用信息增益来选择最好的节点进行分裂。运用这个方法,我们获得以下的决策树:

Outlook?
|   sunny?
|   |   Humidity?
|   |   |   high: No (2)
|   |   |   normal: Yes (1)
|   |   windy?
|   |   |   false: Yes (1)
|   |   |   true: No (1)
|   |   overcast: Yes (1)
|   overcast: Yes (4)
|   rainy?
|   |   Windy?
|   |   |   false: Yes (2)
|   |   |   true: No (1)
|   |   |   Humidity?
|   |   |   |   high: No (1)
|   |   |   |   normal: Yes (1)
|   |   mild?
|   |   |   Humidity?
|   |   |   |   high: No (1)
|   |   |   |   normal: Yes (1)
|   |   cool: Yes (1)

通过这个决策树,我们可以对新样本进行分类判断,具体的分类方法是,从根节点开始,依次将样本按照节点的属性进行判断,直到叶子节点,最终判断出样本属于哪个类别。

四、优缺点分析

优点

决策树具有如下优点:

  • 决策树易于实现和理解。决策树生成的过程容易理解,得到的结果易于解释,并且可以可视化展示。
  • 决策树可以处理离散型和连续型数据、多输出问题、缺失数据和错误数据,因此具有很高的适用性。
  • 决策树的计算复杂度低,速度快。

缺点

决策树具有如下缺点:

  • 决策树容易过拟合,因此需要进行剪枝操作。
  • 决策树的性能受到数据集含有噪声和不一致数据的影响很大。
  • 决策树的结果可能不是最优解。
  • 当数据很少,决策树容易过度训练,导致产生高方差模型。

五、代码示例

下面是使用Python实现决策树分类的代码示例:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree.export import export_text
 
# 加载Iris数据集
iris = load_iris()
X = iris['data']
Y = iris['target']
 
# 构建决策树模型
clf = DecisionTreeClassifier(random_state=0, max_depth=2)
clf.fit(X, Y)
 
# 输出决策树模型
r = export_text(clf, feature_names=iris['feature_names'])
print(r)