理解sklearn.tree中的决策树剪枝方法
决策树剪枝是一种用于减小决策树复杂度和提高预测性能的技术。在scikit-learn库中,决策树剪枝方法主要有两种:预剪枝和后剪枝。本文将分别介绍这两种方法,并通过使用例子来展示它们的使用。
1. 预剪枝(Pre-pruning):
预剪枝是指在构建决策树的过程中,在树的构建之前进行某些限制或规定,以避免树的过拟合。常用的预剪枝参数有以下几个:
- max_depth:限制树的最大深度,当树的深度达到这个限制时,停止树的继续生长。
- max_leaf_nodes:限制树的叶节点数量,当叶节点数量达到这个限制时,停止树的继续生长。
- min_samples_split:指定一个节点上所需的最小样本数,当节点上的样本数小于这个限制时,停止树的继续生长。
- min_samples_leaf:指定一个叶节点上所需的最小样本数,当叶节点上的样本数小于这个限制时,停止树的继续生长。
下面使用一个简单的例子来展示预剪枝的使用:
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.2, random_state=0)
# 创建决策树分类器对象
dt_classifier = DecisionTreeClassifier(max_depth=3, min_samples_split=5)
# 使用训练集训练分类器
dt_classifier.fit(X_train, y_train)
# 使用测试集评估分类器性能
accuracy = dt_classifier.score(X_test, y_test)
print("预剪枝决策树分类器的准确率:", accuracy)
在上述代码中,我们先使用train_test_split函数将数据集划分为训练集和测试集,然后创建了一个决策树分类器对象dt_classifier。在创建分类器对象时,设置了预剪枝参数max_depth=3和min_samples_split=5。最后使用训练集训练分类器,并使用测试集评估其性能。
2. 后剪枝(Post-pruning):
后剪枝是指在决策树构建完成后,通过去掉一些节点或子树来减小决策树的复杂度。在scikit-learn库中,可以使用cost_complexity_pruning_path函数获取一系列决策树对应的ccp_alphas值和相应的总不纯度减小量。然后可以通过逐渐增大ccp_alpha值来剪枝决策树。下面是一个后剪枝的使用例子:
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
# 加载数据集
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.2, random_state=0)
# 创建决策树分类器对象
dt_classifier = DecisionTreeClassifier(random_state=0)
# 使用训练集训练分类器
dt_classifier.fit(X_train, y_train)
# 使用测试集评估分类器性能
y_pred = dt_classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("决策树分类器的准确率:", accuracy)
# 获取决策树的ccp_alphas值和总不纯度减小量
path = dt_classifier.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas, impurities = path.ccp_alphas, path.impurities
# 剪枝决策树
clfs = []
for ccp_alpha in ccp_alphas:
clf = DecisionTreeClassifier(ccp_alpha=ccp_alpha, random_state=0)
clf.fit(X_train, y_train)
clfs.append(clf)
# 绘制不同ccp_alpha值下的决策树深度和准确率变化曲线
train_scores = [clf.score(X_train, y_train) for clf in clfs]
test_scores = [clf.score(X_test, y_test) for clf in clfs]
fig, ax = plt.subplots()
ax.set_xlabel("ccp_alpha")
ax.set_ylabel("accuracy")
ax.set_title("Accuracy vs. ccp_alpha for training and testing sets")
ax.plot(ccp_alphas, train_scores, marker='o', label="train",
drawstyle="steps-post")
ax.plot(ccp_alphas, test_scores, marker='o', label="test",
drawstyle="steps-post")
ax.legend()
plt.show()
上述代码中,首先使用train_test_split函数将数据集划分为训练集和测试集,然后创建了一个决策树分类器对象dt_classifier,并使用训练集训练分类器。接着使用测试集评估分类器性能。然后,通过调用cost_complexity_pruning_path函数获取决策树的ccp_alphas值和总不纯度减小量,并使用这些值来剪枝决策树。最后,绘制了不同ccp_alpha值下的决策树深度和准确率变化曲线。
以上是scikit-learn库中决策树剪枝方法的使用介绍及示例。预剪枝和后剪枝是两种常用的决策树剪枝方法,可以有效地减小决策树的复杂度和提高预测性能。通过设置相应的剪枝参数,可以控制决策树的生长和剪枝过程,从而得到更好的模型。
