控制决策树的复杂度
设置 max_depth=4,这意味着只可以连续问 4 个问题
# 控制决策树的复杂度
# 我们在乳腺癌数据集上更详细地看一下预剪枝的效果
# 我们固定树的 random_state,用于在内部解决平局问题
from sklearn.tree import DecisionTreeClassifier
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, stratify=cancer.target, random_state=42)
tree = DecisionTreeClassifier(random_state=0)
tree.fit(X_train, y_train)
print("Accuracy on training set: {:.3f}".format(tree.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(tree.score(X_test, y_test)))
Accuracy on training set: 1.000
Accuracy on test set: 0.937
# 不出所料,训练集上的精度是 100%,这是因为叶结点都是纯的,树的深度很大,足以完
# 美地记住训练数据的所有标签。测试集精度比之前讲过的线性模型略低,线性模型的精度
# 约为 95%
# 如果我们不限制决策树的深度,它的深度和复杂度都可以变得特别大。
# 因此,未剪枝的树容易过拟合,对新数据的泛化性能不佳。
# 现在我们将预剪枝应用在决策树上,这可以在完
# 美拟合训练数据之前阻止树的展开。一种选择是在到达一定深度后停止树的展开。
# 这里我
# 们设置 max_depth=4,这意味着只可以连续问 4 个问题(参见图 2-24 和图 2-26)。限制树的
# 深度可以减少过拟合。这会降低训练集的精度,但可以提高测试集的精度
tree = DecisionTreeClassifier(max_depth=4, random_state=0)
tree.fit(X_train, y_train)
print("Accuracy on training set: {:.3f}".format(tree.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(tree.score(X_test, y_test)))