问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

sklearn中的决策树-分类树:剪枝参数

创作时间:
作者:
@小白创作中心

sklearn中的决策树-分类树:剪枝参数

引用
CSDN
1.
https://m.blog.csdn.net/hbkybkzw/article/details/145838504

决策树是一种常用的机器学习算法,广泛应用于分类和回归问题。然而,决策树容易过拟合,因此剪枝是优化决策树性能的关键步骤。本文将详细介绍sklearn中决策树分类器的剪枝参数,并通过代码示例和可视化图表帮助读者理解这些参数的作用。

剪枝参数

在不加限制的情况下,一棵决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止。这样的决策树往往会导致过拟合。为了让决策树有更好的泛化能力,我们需要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心。

sklearn为我们提供了多种剪枝策略:

max_depth

限制树的最大深度,超过设定深度的树枝将被剪掉。这是最常用的剪枝参数,在高维度低样本量的情况下非常有效。决策树每增加一层,对样本量的需求会增加一倍,因此限制树的深度可以有效地防止过拟合。在集成算法中也非常实用。实际使用时,建议从3开始尝试,根据拟合效果决定是否增加设定深度。

min_samples_leaf & min_samples_split

  • min_samples_leaf:限定一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向发生。这个参数的数量设置得太小会引起过拟合,设置得太大就会阻止模型学习数据。一般来说,建议从5开始使用。如果叶节点中含有的样本量变化很大,建议输入浮点数作为样本量的百分比来使用。同时,这个参数可以保证每个叶子的最小尺寸,可以在回归问题中避免低方差、过拟合的叶子节点出现。对于类别不多的分类问题,通常min_samples_leaf=1就是最佳选择。

  • min_samples_split:限定一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生。

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import pandas as pd
import graphviz

# 加载数据
wine = load_wine()
data = pd.DataFrame(wine.data, columns=wine.feature_names)  # X
target = pd.DataFrame(wine.target)  # y

# 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.3)

clf = tree.DecisionTreeClassifier(criterion="entropy",
                                  random_state=30,
                                  splitter="random",
                                  max_depth=3,
                                  min_samples_leaf=10,
                                  min_samples_split=25)

clf.fit(X_train, y_train)
score = clf.score(X_test, y_test)  # 返回预测的准确度

# 保存决策树图
feature_name = ['酒精', '苹果酸', '灰', '灰的碱性', '镁', '总酚', '类黄酮', '非黄烷类酚类',
                '花青素', '颜色强度', '色调', 'od280/od315稀释葡萄酒', '脯氨酸']
dot_data = tree.export_graphviz(clf,
                                feature_names=feature_name,
                                class_names=["琴酒", "雪莉", "贝尔摩德"],
                                filled=True,  # 填充颜色
                                rounded=True)  # 圆角
graph = graphviz.Source(dot_data)
graph.render(view=True, format="png", filename="./save/decisiontree_pdf")

# 特征重要性
feature_importances = clf.feature_importances_
a = pd.DataFrame([*zip(feature_name, feature_importances)])
a.columns = ['feature', 'importance']
a.sort_values('importance', ascending=False, inplace=True)
print(a)

max_features & min_impurity_decrease

  • max_features:限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。这个参数和max_depth异曲同工,主要用于限制高维度数据的过拟合。但其方法比较暴力,是直接限制可以使用的特征数量而强行使决策树停下的参数。在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA、ICA或者特征选择模块中的降维算法。

  • min_impurity_decrease:限制信息增益的大小,信息增益小于设定数值的分枝不会发生。这是在0.19版本中更新的功能,在0.19版本之前使用的是min_impurity_split

确定最优剪枝参数(超参数曲线)

那具体怎么来确定每个参数填写什么值呢?这时候,我们就要使用确定超参数的曲线来进行判断了,继续使用我们已经训练好的决策树模型clf。超参数的学习曲线,是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,它是用来衡量不同超参数取值下模型的表现的线。在我们建好的决策树里,我们的模型度量指标就是score。

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import pandas as pd
import matplotlib.pyplot as plt

# 加载数据
wine = load_wine()
data = pd.DataFrame(wine.data, columns=wine.feature_names)  # X
target = pd.DataFrame(wine.target)  # y

# 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.3)

test = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(max_depth=i+1,
                                      criterion="entropy",
                                      random_state=10,
                                      splitter='random')
    clf = clf.fit(X_train, y_train)
    score = clf.score(X_test, y_test)
    test.append(score)

plt.plot(range(1,11), test, color="red", label="max_depth")
plt.legend()
plt.show()

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号