【问题标题】:Decision tree split implementation决策树拆分实现
【发布时间】:2022-07-19 21:48:29
【问题描述】:

这是我大学作业的一部分,但我在网上找不到任何关于如何正确实施的资源。 我已经阅读了大量关于定义最优集合分割的指标(如熵、基尼等)的材料,因此我了解我们如何选择一个最优的特征值来将学习集分割成左右节点。

但是我完全不明白的是实现的复杂性,考虑到我们还必须选择最优特征,这意味着在每个节点上计算最优值需要 O(n^2),考虑到这是不好的真正的 ML 数据集的形状约为 10^2 x 10^6,这在计算成本方面确实很大。

我是否遗漏了某种可用于帮助降低复杂性的方法?

我目前有这个基线实现来选择最好的特性和价值来分割,但我真的想让它变得更好:

    for f_idx in range(X_subset.shape[1]):
        sorted_values = X_subset.iloc[:, f_idx].sort_values()
        for v in sorted_values[self.min_samples_split - 1 : -self.min_samples_split + 1]:
            y_left, y_right = self.make_split_only_y(f_idx, v, X_subset, y_subset)
            if threshold is not None:
                G = calc_g(y_subset, y_left, y_right)
                if G < tr_G:
                    threshold = v
                    feature_idx = f_idx
                    tr_G = G
            else:
                threshold = v
                feature_idx = f_idx
                tr_G = G

    return feature_idx, threshold

【问题讨论】:

    标签: machine-learning decision-tree machine-learning-model


    【解决方案1】:

    所以,由于没有人回答,所以我在这里找到了一些东西。

    首先,是的,这项任务的计算量非常大。但是,可以使用一些技巧来减少“长出一棵树”所需执行的拆分数量。

    这一点尤其重要,因为你并不真正想要一棵巨大的过拟合树——它没有任何价值,更重要的是获得弱模型,它可以在某种情况下与其他人一起使用组合技巧。

    至于正则化技巧,以下是我自己使用的几个:

    • 限制树的最大深度
    • 限制节点中项目的最小数量
    • 限制树中叶子的最大数量
    • 在执行最佳拆分后限制拆分标准中的最小质量变化

    对于算法部分,有一种方法可以智能地构建树。如果您按照我之前发布的代码执行此操作,时间复杂度将在 O(h * N^2 * D) 左右,其中 h 是树的高度。为了解决这个问题,有几种方法,我没有亲自编码,但阅读了:

    • 使用动态规划来累积每个特征的统计信息,因此您不必每次拆分都重新计算它们
    • 使用数据分箱和桶排序进行 O(n) 排序

    信息来源:https://ml-handbook.ru/chapters/decision_tree/intro (使用谷歌翻译,因为网站是俄语)

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2014-08-29
      • 1970-01-01
      • 2013-02-15
      • 2012-05-06
      • 2016-05-05
      • 2018-11-17
      • 2011-03-25
      • 2017-05-22
      相关资源
      最近更新 更多