决策树是一种常见的监督学习方法,用于分类和回归。

主要思想:将数据递归地按特征分割,构建一个树形结构,表示输入和输出之间的映射关系。

特点:非参数化模型,可以处理数值和分类数据,易于理解和解释。

算法:常用ID3、C4.5、CART等,通过选取最优特征进行数据分割。

  1. 分割标准:信息增益、GINI指数等,度量分割的好坏。
  2. 停止条件:没有特征可选或达到树的最大深度。
  3. 预测:从根节点开始,测试数据在树中传播,直到达叶节点获得预测。
  4. 剪枝:防止过拟合,后剪枝或预剪枝。
  5. 集成学习:决策树容易过拟合,通常使用随机森林、GBDT等集成学习方法。

决策树通过递归分割构建树模型,易于理解和解释,是一种常用的基础分类与回归方法。

下面通过鸢尾花数据来进行一个简单的演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import os

os.environ['PATH'] = os.pathsep + r'C:\Program Files (x86)\Graphviz2.38\bin'

from sklearn.datasets import load_iris
from sklearn import tree
import graphviz

iris = load_iris() # 加载鸢尾花原始数据集
X = iris.data[:, :2] # 取前两个特征,已经分割好
y = iris.target # 将特征存储在变量X中,而目标值(类别)存储在变量y中

clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, y) # 创建了一个决策树分类器并将数据 X 和对应的目标值y用于训练模型。

# 可视化决策树
dot_data = tree.export_graphviz(clf, out_file=None)# export_graphviz可以导出决策树的DOT图描述文件
graph = graphviz.Source(dot_data)
graph.render("Iris")

# 对新样本进行预测
print(clf.predict([[2.4, 2.05]])) # [0]
print(clf.predict([[4.9, 2.05]])) # [1]

  1. iris原始数据集存在于scikit-learn数据集模块中,可以通过load_iris()直接导入使用。

    1. iris.data - 150x4的NumPy数组,包含4个特征,分别是花萼长度、花萼宽度、花瓣长度、花瓣宽度,这里只取前了两个特征
    2. iris.target - 150x1的NumPy数组,包含每朵鸢尾花对应的类别,0/1/2代表Setosa/Versicolor/Virginica
  2. 通过代码提取iris的数据特征和目标值进行训练,得到一个决策树分类器模型clf。

  3. 决策树模型clf包含了训练后的树结构,但此时树结构还没有可视化。

  4. 使用export_graphviz可以导出决策树的DOT图描述文件。

  5. 使用graphviz模块将DOT文件转换为图像格式,如PDF。

  6. 所以最终我们得到了可视化的决策树图像iris.pdf。

在决策树的图示中:

gini:表示该节点的基尼系数(Gini index),它衡量了该节点的不纯度,值越小表示样本集合的纯度越高。

samples:表示该节点包含的样本数量。

value:表示该节点包含的不同类别的样本数目,是个数组。

例如在根节点的信息:

gini = 0.667

samples = 150

value = [50, 50, 50]

意义是:

基尼系数为0.667,表示根节点的不纯度较高。

总样本量为150,即包含全部的150朵鸢尾花。

值数组[50, 50, 50]表示共有3类,每类样本数量分别为50。