Python中决策树的剪枝方法和剪枝前后的效果对比
决策树的剪枝方法有两种:前剪枝和后剪枝。
前剪枝(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$值对应的子树进行了评估。评估的标准是在测试集上的准确率,最终选择准确率最高的子树作为剪枝后的模型。
通过比较剪枝前后的准确率,我们可以看到后剪枝的效果是非常显著的。
相关文章