sklearn中决策树初始化 DecisionTreeClassifier 的参数说明

本文详细介绍了决策树算法中的重要参数,如criterion(基尼指数或信息熵)、splitter(最佳或随机切分)、max_features(最大特征数)、max_depth(最大深度)、min_samples_split(内部节点划分最小样本数)、min_samples_leaf(叶节点最小样本数)等,这些参数直接影响模型的复杂度和性能。理解并合理设置这些参数对于避免过拟合和提升模型泛化能力至关重要。同时,还提到了min_weight_fraction_leaf、max_leaf_nodes、class_weight、random_state等其他参数的作用,帮助读者更好地理解和应用决策树模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

criterion

        特征选择标准,可选参数,默认是gini,可以设置为entropy。gini是基尼指数,entropy是信息熵(香农熵)

  • ID3算法使用的是 信息熵
  • C4.5用的信息增益比
  • CART算法使用的则是 基尼指数

        注意,sklearn 中实现的决策树是 CART 的,那怕你该参数为 entropy,也只是几乎等同与 ID3 ,请参考这个讨论 python sklean中的决策树是用的哪一种决策树算法?

       

splitter

        特征划分点选择标准,可选参数,默认是best,可以设置为random。best参数是根据某种标准选择最佳的切分特征,例如gini、entropy。random随机的在部分划分点中找局部最优的划分点。默认的”best”适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐”random”。

       

max_features

        划分时考虑的最大特征数,可选参数,默认是None。寻找最佳切分时考虑的最大特征数(n_features为总共的特征数),有如下6种情况:

  • 如果max_features是整型的数,则考虑max_features个特征;

  • 如果max_features是浮点型的数,则考虑int(max_features * n_features)个特征;

  • 如果 max_features 设为 auto,那么max_features = sqrt(n_features);

  • 如果 max_features 设为 sqrt,那么max_featrues = sqrt(n_features),跟auto一样;

  • 如果 max_features 设为 log2,那么max_features = log2(n_features);

  • 如果 max_features 设为 None,那么max_features = n_features,也就是所有特征都用。

        一般来说,如果样本特征数不多,比如小于50,我们用默认的”None”就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。

       

max_depth

        决策树最大深度,可选参数,默认是None。这个参数是这是树的层数的。如果这个参数设置为None,那么决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。或者如果设置了 min_samples_slipt 参数,那么直到少于min_smaples_split个 样本为止。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

       

min_samples_split

        内部节点再划分所需最小样本数,可选参数,默认是2。这个值限制了子树继续划分的条件。

  • 如果 min_samples_split 为整数,那么在切分内部结点的时候,min_samples_split作为最小的样本数,也就是说,如果样本已经少于 min_samples_split 个样本,则停止继续切分。
  • 如果min_samples_split为浮点数,那么 min_samples_split 就是一个百分比,ceil(min_samples_split * n_samples),数是向上取整的。

        如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

       

min_samples_leaf

        默认是1 ,在一个叶节点上所需的最小样本数。在任何深度上的分裂点只有在它在每个左右分支中至少留下min_samples_leaf训练样本时才会被考虑。

        上面三个参数主要用来约束树的复杂度,可以理解成剪枝

min_weight_fraction_leaf

        叶子节点最小的样本权重和,可选参数,默认是0。这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

       

max_leaf_nodes

        最大叶子节点数,可选参数,默认是None。通过限制最大叶子节点数,可以防止过拟合。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

       

class_weight

:类别权重,可选参数,默认是None,也可以字典、字典列表、balanced。指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。类别的权重可以通过{class_label:weight}这样的格式给出,这里可以自己指定各个样本的权重,或者用balanced,如果使用balanced,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的None。

       

random_state

        可选参数,默认是None。随机数种子。

       

min_impurity_split

        节点划分最小不纯度,可选参数,默认是1e-7。这是个阈值,这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。

       

presort

        数据是否预排序,可选参数,默认为False,这个值是布尔值,默认是False不排序。一般来说,如果样本量少或者限制了一个深度很小的决策树,设置为true可以让划分点选择更加快,决策树建立的更加快。如果样本量太大的话,反而没有什幺好处。问题是样本量少的时候,我速度本来就不慢。所以这个值一般懒得理它就可以了。

       

最后的碎碎念

        当样本数量少但是样本特征非常多的时候,决策树很容易过拟合,一般来说,样本数比特征数多一些会比较容易建立健壮的模型如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。其中特征选择就是我在做的一个工作

### 如何在 Python 中使用 sklearn 库实现决策树模型 要在 Python 的 `scikit-learn` 库中实现决策树模型,可以按照以下方式构建代码并理解其参数。 #### 导入必要的模块 首先需要导入所需的库来处理数据集以及训练决策树模型。 ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score ``` 上述代码片段展示了如何加载标准的数据集、分割训练和测试集合、定义分类器以及评估模型准确性[^1]。 #### 加载数据集 这里以经典的鸢尾花 (Iris) 数据集为例: ```python data = load_iris() X, y = data.data, data.target ``` 通过 `load_iris()` 函数获取特征矩阵 (`X`) 和目标向量 (`y`)。 #### 划分训练集与测试集 为了验证模型的效果,通常会将数据划分为训练集和测试集: ```python X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) ``` 其中 `test_size=0.3` 表示保留 30% 的数据作为测试集,而 `random_state=42` 是用于重现实验结果的随机种子设置。 #### 创建决策树模型实例 初始化一个 `DecisionTreeClassifier` 对象,并指定一些常用的超参数: ```python clf = DecisionTreeClassifier(criterion='gini', max_depth=None, min_samples_split=2, random_state=42) ``` 以下是这些参数的意义解释: - **criterion**: 设置分裂质量的标准,默认为 `'gini'`(基尼不纯度),也可以选择 `'entropy'` 来衡量信息增益。 - **max_depth**: 控制树的最大深度。如果设为 None,则节点会展开直到所有的叶子都是纯净的或者满足其他条件为止。 - **min_samples_split**: 定义内部节点再划分所需最小样本数。默认值是 2。 - **random_state**: 随机状态控制,确保每次运行的结果一致。 #### 训练模型 利用 `.fit()` 方法基于训练数据拟合决策树模型: ```python clf.fit(X_train, y_train) ``` #### 进行预测 应用已训练好的模型对未知数据做出预测: ```python predictions = clf.predict(X_test) ``` #### 评价模型表现 最后计算预测准确率以评估模型效果: ```python accuracy = accuracy_score(y_test, predictions) print(f"Accuracy: {accuracy * 100:.2f}%") ``` 完整的代码如下所示: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score # 载入数据 data = load_iris() X, y = data.data, data.target # 分割数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 初始化分类器 clf = DecisionTreeClassifier(criterion='gini', max_depth=None, min_samples_split=2, random_state=42) # 模型训练 clf.fit(X_train, y_train) # 使用测试集做预测 predictions = clf.predict(X_test) # 输出精度得分 accuracy = accuracy_score(y_test, predictions) print(f"Accuracy: {accuracy * 100:.2f}%") ``` 此段程序实现了从数据准备到最终评估整个流程的操作指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中南自动化学院至渝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值