如何手工创建scikit学习树?

时间:2019-12-20 16:20:06

标签: python scikit-learn decision-tree

为了测试一些代码,我希望能够手动创建sklearn.tree._tree.Tree,而不是通过拟合某些数据。

具体来说,我想要一棵将实线上的点分为间隔(-infinity,5],(5,6]或(6,infinity)的树。我想要的树形为

----0----
|        |
|     ---2---
|     |      |
1     3      4

其中节点0在5处分割实线,节点2在6处分割实线。

如何执行此操作?我看到树有一个__setstate__方法,看着__getstate__的输出,看来我需要类似

state = {
        'n_features_': 1,
        'max_depth': 2,
        'node_count': 5,
        'nodes': np.array([(1 ,   2,  0,  5., 0.375, 3, 3.),
                           (-1,  -1,  0, -2., 0.   , 1, 1.),
                           (3 ,   4,  0,  6., 0.,  , 2, 2.),
                           (-1,  -1,  0, -2., 0.,  , 1, 1.),
                           (-1,  -1,  0, -2., 0.,  , 1, 1.),
                           ],
                          dtype=[('left_child', '<i8'), ('right_child', '<i8'), ('feature', '<i8'),('threshold', '<f8'), ('impurity', '<f8'), ('n_node_samples', '<i8'), ('weighted_n_node_samples', '<f8')]),
}

但是我并不太真正理解这些参数的含义,无论如何我一开始都没有看到如何用这种状态初始化树。

1 个答案:

答案 0 :(得分:0)

经过数小时的尝试手动更改节点后。我找到了解决方案。 确实,你是对的。通过使用设置状态,您可以进行树的自定义。 “节点”键必须如下:

  • 元组的numpy数组
  • 每个元组必须类似于以下内容:(left_child [i],right_child [i],feature [i],threshold [i],杂质[i],n_node_samples [i],weighted_n_node_samples [i])

-1(代表左/右子代)和-2(代表功能)代表叶子。

训练分类器时,您将拥有另一个键:“值”。

相关问题