决策树是一种树状结构,最初用于决策分析,现在已成为机器学习中处理分类问题的强大算法。这些决策树以其在数据挖掘过程中捕捉数据模式的能力而闻名。然而,任何事物过量都是有害的,决策树因过度拟合训练数据而臭名昭著,导致在部署时对新数据集的表现不佳。幸运的是,就像熟练的机械师工具箱中有各种尺寸的扳手一样,熟练的数据科学家也有一系列技术来应对各种问题。本文将探索这些技术。
理解基尼指数的重要性及其在决策树算法中的作用。了解预剪枝技术在减轻决策树过拟合中的重要性。通过逐步教程获得实践经验,包括根节点选择和后剪枝等概念。
剪枝是用于克服过拟合问题的技术之一。从字面上理解,剪枝是一种实践,涉及选择性地移除树木(或植物)的某些部分,如树枝、芽或根,以改善树木的结构并促进健康生长。这正是剪枝对决策树的作用。它使决策树更加通用,以便在输入新数据时能够适应,从而解决过拟合问题。
剪枝通过减少决策树的大小,可能会略微增加训练误差,但会大幅降低测试误差,从而使模型更具适应性。最小成本复杂度剪枝是决策树剪枝的一种类型。这种算法由参数α(≥0)参数化,称为复杂度参数。复杂度参数用于定义给定树T的成本复杂度度量Rα(T):Rα(T)=R(T)+α|T|,其中|T|是T中的终端节点数,R(T)传统上定义为终端节点的总误分类率。
将使用鸢尾花数据集来拟合决策树。可以从这里下载数据集。首先,让导入所需的基本库和数据集。目标是基于花的萼片长度和宽度预测花的种类。将数据集分为两部分——训练和测试。这样做是为了让模型也能在未见数据上表现良好。将使用sklearn.model_selection中的train_test_split函数来分割数据集。
现在,让拟合一个决策树到训练部分,并在测试和训练部分进行预测。将为此目的使用sklearn.tree中的DecisionTreeClassifier。默认情况下,决策树函数不执行任何剪枝,并允许树尽可能地生长。在训练和测试部分分别获得了0.95和0.63的准确度分数,如下所示。可以说模型是过拟合的,即记住了训练部分,但在测试部分不能同样表现良好。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 训练决策树模型
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
# 预测
train_accuracy = clf.score(X_train, y_train)
test_accuracy = clf.score(X_test, y_test)
print(f"训练准确度: {train_accuracy:.2f}, 测试准确度: {test_accuracy:.2f}")
alphas, impurities = clf.cost_complexity_pruning_path(X_train, y_train)