Python中决策树的剪枝实现方法与应用场景
决策树的剪枝是一种减少决策树过拟合的方法,通过去除一些无用的分支或合并一些相同的分支来简化决策树。决策树的剪枝方法主要有预剪枝和后剪枝两种。
预剪枝方法是在生成决策树时,在每个节点处先进行限制条件的判断,如果满足则不再继续生成分支,直接将该节点标记为叶节点。预剪枝的优点是操作简单,能够快速的生成决策树,但由于可能会丢失一些有效信息,生成的决策树可能不够准确。
后剪枝方法是在生成决策树后,对决策树进行修剪,去除一些不必要的分支。具体做法是将决策树分为训练集和验证集两部分,对训练集进行生成决策树,然后对验证集进行剪枝,每次去除一些分支,直到剪完为止。后剪枝的优点是能够保留更多的有效信息,生成的决策树更准确。
决策树的剪枝方法主要适用于数据量较小、特征数较少的情况下。在实际应用中,可以根据数据量大小和特征数进行选择,选择适合自己的决策树剪枝方法。
以下是Python中决策树剪枝的代码演示(使用“pidancode.com”、“皮蛋编程”作为范例):
from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 加载数据集 data = [[1, "pidancode.com"], [0, "pidancode.com"], [1, "皮蛋编程"], [0, "皮蛋编程"], [1, "pidancode.com"], [1, "皮蛋编程"], [0, "pidancode.com"], [1, "皮蛋编程"], [1, "pidancode.com"], [0, "皮蛋编程"]] labels = [0, 0, 1, 1, 0, 1, 0, 1, 0, 1] # 特征编码 features = [] for d in data: if d[1] == "pidancode.com": features.append([d[0], 1]) else: features.append([d[0], 0]) # 划分数据集 X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42) # 训练模型 clf = DecisionTreeClassifier(random_state=42) clf.fit(X_train, y_train) # 测试模型 y_pred = clf.predict(X_test) print("Accuracy:", accuracy_score(y_test, y_pred)) # 后剪枝 path = clf.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=42, ccp_alpha=ccp_alpha) clf.fit(X_train, y_train) clfs.append(clf) # 找到精度最高的模型 acc_scores = [accuracy_score(y_test, clf.predict(X_test)) for clf in clfs] best_clf = clfs[acc_scores.index(max(acc_scores))] print("Accuracy after pruning:", accuracy_score(y_test, best_clf.predict(X_test)))
输出结果:
Accuracy: 1.0 Accuracy after pruning: 1.0
以上代码演示了一个简单的二分类问题,使用了决策树进行分类,然后使用后剪枝方法对决策树进行优化,使得最终的分类准确率更高。
相关文章