决策树是一种树形结构,树结构中的每个节点都可以理解为是一个规则,通过对规则处理的结果进行分类,最终完成对整体数据的分类,当然也可以用于回归。下面我们就来拿一个是否去爬山的案例来说明,比如通过判断明天是否下雨、是否降温来决定是否去爬山,可以构造出如下的决策树:

要实现一个决策树,最核心的就是要确定每个节点要通过哪个特征来分类,比如在我们上面举的例子中,到底是先判断是否下雨这个特征,还是先判断是否降温这个特征。通常有两种方式可以选择:
第一种就是交叉熵,所谓熵,英文是Entropy,最初是一个热力学中的概念,后来在信息论这门学科中出现了“信息熵”的概念,用来表示随机变量的不确定性。比如在ID3,C4.5和C5.0算法中会用到,由于流行度不如CART,所以这里不重点介绍。
第二种就是基尼指数,通常用gini来表示,它指从数据集中随机抽取两个样本,类别不一致的概率,它常被用于CART算法中,而且计算也比较简单,它的计算公式为:Gini(D) = 1 - Σ(pᵢ²)。
这里我们还是拿sklearn内置的鸢尾花数据来做演示说明,代码如下:
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier, plot_tree from sklearn.metrics import accuracy_score import matplotlib.pyplot as plt import graphviz from sklearn.tree import export_graphviz # 加载鸢尾花数据集 iris = load_iris() X = iris.data y = iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 创建决策树模型 clf = DecisionTreeClassifier(random_state=42, max_depth=3) # 训练模型 clf.fit(X_train, y_train) # 预测测试集 y_pred = clf.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print(f"决策树模型的准确率: {accuracy:.2f}") # 使用 matplotlib 可视化决策树 plt.figure(figsize=(12, 8)) plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True) plt.title(" Decision Tree") plt.show() # 使用 graphviz 可视化决策树 dot_data = export_graphviz(clf, out_file=None, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, rounded=True, special_characters=True) graph = graphviz.Source(dot_data) graph.render("iris_decision_tree", format=png, cleanup=True, view=True)由于上面代码都有注释,因此就不过多解释了,值得说明的是,这里使用DecisionTreeClassifier直接得到一个决策树分类器,然后通过max_depth来指定最大深度为3,然后就是通过fit来训练,通过predict来进行预测,然后就是通过graphviz来绘制出完整的决策树。
我们先来看一下预测结果的准确率,可以看到是100%,如下所示:
对于生成的决策树,这里看一下效果:
这里来说一下决策树的每个节点中的信息都是什么意思,比如以下面的这个绿色的节点为例:
这个节点的含义表示:
第一行的petal width(cm)≤1.6表示这个分类里面都是花瓣宽度小于1.6厘米的数据,第二行的gini=0.059表示这一个节点的基尼指数都是0.059,第三行的samples=33表示这个节点的样本数有33个,第四行的value=【0,32,1】表示这33个样本里面属于第一类的有0个,属于第二类的有32个,属于第三类的有1个,第五行的class则说明这一类主要属于versicolor这个类别,也就是鸢尾花三类中的“变色鸢尾”这个类别。
对于决策树来说,就介绍到这里啦,决策树最大的优点就是易于理解和解释,因为可以把整个流程用画图的方式展示出来,而且也可以通过构建多棵决策树来实现随机森林,来提高准确率,后面我们再介绍随机森林。