Python中决策树的剪枝方法和剪枝前后的效果对比

2023-04-15 00:00:00 方法 效果 剪枝

决策树的剪枝方法有两种:前剪枝和后剪枝。

前剪枝(Pre-Pruning)指在构建决策树时,在节点未展开前就进行剪枝操作。这种方法的优点是简单快速,但容易出现欠拟合问题。因为在节点展开前,我们无法确定哪些特征更加重要,因此可能会过度剪枝,丢失一些重要的分支。

后剪枝(Post-Pruning)则指在构建完整的决策树之后,对一些分支进行剪枝操作。这种方法的优点是可以充分利用数据集,避免欠拟合问题。但是,相对于前剪枝来说,后剪枝需要更多的时间和计算资源。

下面是一个使用sklearn库的决策树进行前剪枝的例子:

from sklearn.tree import DecisionTreeClassifier

X = [[0, 0], [1, 1]]
y = [0, 1]

clf = DecisionTreeClassifier(max_depth=1)
clf.fit(X, y)

print(clf.predict([[2, 2]]))

这个例子中,我们限制了构建决策树的深度为1,即只展开了一层节点。这就是前剪枝的一种简单形式。

接下来是一个使用sklearn库的决策树进行后剪枝的例子:

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

X = [[0, 0], [1, 1], [2, 2], [3, 3]]
y = [0, 1, 1, 0]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)

score_before_pruning = clf.score(X_test, y_test)

clf_pruned = DecisionTreeClassifier()
clf_pruned.fit(X_train, y_train)

path = clf_pruned.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(random_state=0, ccp_alpha=ccp_alpha)
    clf.fit(X_train, y_train)
    clfs.append(clf)

scores = [clf.score(X_test, y_test) for clf in clfs]
best_score_index = np.argmax(scores)
best_clf = clfs[best_score_index]

score_after_pruning = best_clf.score(X_test, y_test)

print("Accuracy before pruning: ", score_before_pruning)
print("Accuracy after pruning: ", score_after_pruning)

在这个例子中,我们使用决策树的cost_complexity_pruning_path方法构造了一条路径,对每个$\alpha$值对应的子树进行了评估。评估的标准是在测试集上的准确率,最终选择准确率最高的子树作为剪枝后的模型。

通过比较剪枝前后的准确率,我们可以看到后剪枝的效果是非常显著的。

相关文章