【问题标题】:When I use sklearn DecisionTreeClassifier, the tree returned doesn't respect my given parameters当我使用 sklearn DecisionTreeClassifier 时,返回的树不尊重我给定的参数
【发布时间】:2020-05-01 19:40:06
【问题描述】:

我正在处理一个包含 170 个特征和 26000 个观测值的数据集。当我在不通过任何限制的情况下将 DecisionTreeClassifier 模型拟合到该数据集时,它会生成一棵包含所有 170 个特征和 8173 个节点的树。但是,当我尝试使用 max_leaf_nodes 和 max_features(如下所示)限制树的特征并打印出结果树的特征时,它们不尊重我传递给分类器的参数。为什么会发生这种情况?此时我没有注意清除共线变量的数据集,所以我想这可能会影响我的分类,但我仍然感到惊讶的是,该函数似乎忽略了我给它的参数(但它似乎没有完全忽略它们,因为它不会产生与没有任何限制的相同的树)。

tuned_tree = DecisionTreeClassifier(max_leaf_nodes=1000, max_features=40)
tuned_tree.fit(X_train, y_train)

print("Number of features: {}".format(tuned_tree.tree_.n_features))
print("Number of nodes (leaves): {}".format(tuned_tree.tree_.node_count),"\n")

输出:

特征数量:170

节点数(叶子):1999

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    老实说,sklearn 文档有时会让人感到困惑,但我还是会向您推荐它并指出一些细节。来自docs

    max_features:寻找最佳分割时要考虑的特征数量

    现在,您可能会假设最大特征数是树中使用的特征数,但事实并非如此。这是每次拆分要考虑的特征数量。 另见线程How max_features parameter works in DecisionTreeClassifier?

    max_leaf_nodes:以最佳优先方式种植具有 max_leaf_nodes 的树。最佳节点定义为杂质的相对减少。

    我认为这更多的是术语问题。并非所有节点都是叶子,但所有叶子都是节点(具体来说,树中的末端节点;也称为叶子节点)。要获取叶节点,您可以使用:

    tuned_tree.tree_.n_leaves

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 2021-03-21
      • 1970-01-01
      • 2018-01-21
      • 2014-06-20
      • 1970-01-01
      相关资源
      最近更新 更多