如何从scikit-learn决策树中提取决策规则?

如何从scikit-learn决策树中提取决策规则?,第1张

如何从scikit-learn决策树中提取决策规则?

我相信这个答案比这里的其他答案更正确:

from sklearn.tree import _treedef tree_to_pre(tree, feature_names):    tree_ = tree.tree_    feature_name = [        feature_names[i] if i != _tree.TREE_UNDEFINED else "undefined!"        for i in tree_.feature    ]    print "def tree({}):".format(", ".join(feature_names))    def recurse(node, depth):        indent = "  " * depth        if tree_.feature[node] != _tree.TREE_UNDEFINED: name = feature_name[node] threshold = tree_.threshold[node] print "{}if {} <= {}:".format(indent, name, threshold) recurse(tree_.children_left[node], depth + 1) print "{}else:  # if {} > {}".format(indent, name, threshold) recurse(tree_.children_right[node], depth + 1)        else: print "{}return {}".format(indent, tree_.value[node])    recurse(0, 1)

这会打印出有效的Python函数。这是一个试图返回其输入的树的示例输出,该数字介于0和10之间。

def tree(f0):  if f0 <= 6.0:    if f0 <= 1.5:      return [[ 0.]]    else:  # if f0 > 1.5      if f0 <= 4.5:        if f0 <= 3.5:          return [[ 3.]]        else:  # if f0 > 3.5          return [[ 4.]]      else:  # if f0 > 4.5        return [[ 5.]]  else:  # if f0 > 6.0    if f0 <= 8.5:      if f0 <= 7.5:        return [[ 7.]]      else:  # if f0 > 7.5        return [[ 8.]]    else:  # if f0 > 8.5      return [[ 9.]]

这是我在其他答案中看到的一些绊脚石:

  1. 使用
    tree_.threshold == -2
    来决定一个节点是否为叶是不是一个好主意。如果它是阈值为-2的真实决策节点怎么办?相反,您应该查看
    tree.feature
    tree.children_*
  2. 该行在
    features = [feature_names[i] for i in tree_.feature]
    我的sklearn版本中崩溃,因为某些值
    tree.tree_.feature
    是-2(特别是对于叶节点)。
  3. 递归函数中不需要有多个if语句,只需一个就可以了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5630083.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存