在机器学习中,决策树是一种常用的分类与回归方法。为了防止模型过拟合,决策树算法提供了多种剪枝技术。其中,成本复杂性剪枝(Cost Complexity Pruning)是一种有效的控制决策树规模的方法。在Python的scikit-learn库中,通过设置DecisionTreeClassifier
的ccp_alpha
参数,可以进行成本复杂性剪枝。ccp_alpha
的值越大,剪枝的程度越高,树的规模越小。本文将通过实例代码,展示不同ccp_alpha
值对决策树的影响,并介绍如何选择最佳的ccp_alpha
值。
成本复杂性剪枝的基本思想是,在决策树的构建过程中,对于每个节点,计算剪枝前后的代价复杂度,选择最佳的剪枝策略。具体来说,对于每个节点,计算剪枝后树的总不纯度(例如基尼不纯度或信息增益),并与剪枝前的代价进行比较。如果剪枝后的代价复杂度更低,则选择剪枝。在scikit-learn中,可以通过DecisionTreeClassifier.cost_complexity_pruning_path
方法,获取不同ccp_alpha
值下,剪枝树的总不纯度和对应的有效alpha
值。随着alpha
值的增加,剪枝的程度越高,树的总不纯度也越高。
下面是一个使用乳腺癌数据集(Breast Cancer dataset)的实例代码,展示了如何使用成本复杂性剪枝来控制决策树的规模。首先,加载数据集并划分训练集和测试集。然后,使用DecisionTreeClassifier
构建决策树模型,并计算不同ccp_alpha
值下的剪枝路径。接着,绘制剪枝树的总不纯度与有效alpha
值的关系图,以及剪枝树的节点数量、树的深度与alpha
值的关系图。最后,计算不同ccp_alpha
值下的训练集和测试集准确率,并绘制准确率与alpha
值的关系图。
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
# 加载乳腺癌数据集
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# 构建决策树模型并计算剪枝路径
clf = DecisionTreeClassifier(random_state=0)
path = clf.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas, impurities = path.ccp_alphas, path.impurities
# 绘制剪枝树的总不纯度与有效alpha值的关系图
fig, ax = plt.subplots()
ax.plot(ccp_alphas[:-1], impurities[:-1], marker="o", drawstyle="steps-post")
ax.set_xlabel("effective alpha")
ax.set_ylabel("total impurity of leaves")
ax.set_title("Total Impurity vs effective alpha for training set")
plt.show()
在上述代码中,首先加载乳腺癌数据集并划分训练集和测试集。然后,使用DecisionTreeClassifier
构建决策树模型,并计算不同ccp_alpha
值下的剪枝路径。通过绘制剪枝树的总不纯度与有效alpha
值的关系图,可以直观地看到随着alpha
值的增加,剪枝树的总不纯度逐渐增加。
在选择最佳的ccp_alpha
值时,需要综合考虑训练集和测试集的准确率。一般来说,当ccp_alpha
值较小时,决策树容易过拟合,导致训练集准确率很高,但测试集准确率较低。随着ccp_alpha
值的增加,剪枝的程度逐渐增加,决策树的泛化能力逐渐提高,测试集准确率也逐渐提高。当ccp_alpha
值过大时,决策树过于简化,导致训练集和测试集的准确率都较低。因此,需要通过交叉验证等方法,选择一个合适的ccp_alpha
值,使得决策树在训练集和测试集上都能取得较高的准确率。