Sklearn决策树的BFS遍历

问题描述 投票:1回答:1

如何处理sklearn决策树的广度优先搜索遍历?

在我的代码中,我尝试了sklearn.tree_库,并使用了诸如tree_.feature和tree_.threshold之类的各种功能来理解树的结构。但是,如果我想做bfs,这些功能会遍历树的dfs吗?

假设

clf1 = DecisionTreeClassifier( max_depth = 2 )
clf1 = clf1.fit(x_train, y_train)

这是我的分类器,生成的决策树是

Decision tree

然后我使用以下功能遍历了树

def encoding(clf, features):
l1 = list()
l2 = list()

for i in range(len(clf.tree_.feature)):
    if(clf.tree_.feature[i]>=0):
        l1.append( features[clf.tree_.feature[i]])
        l2.append(clf.tree_.threshold[i])
    else:
        l1.append(None)
        print(np.max(clf.tree_.value))
        l2.append(np.argmax(clf.tree_.value[i]))

l = [l1 , l2]

return np.array(l)

并且产生的输出是

array([[['address','age',None,None,'age',None,None],[0.5,17.5,2,1,15.5,1,1]],dtype = object)其中第一个数组是节点的特征,或者如果它离开节点,则它被标记为无,第二个数组是特征节点的阈值,对于类节点,它是类,但是这是树的dfs遍历,我想做bfs遍历,我应该怎么做?上面的部分已经回答。

我想知道我们是否可以将树以完整的二叉树的形式存储到数组中,从而使第i个节点的子代存储在2i +1和2i +2索引处?

enter image description here

对于上述生成的树输出是array([['address','age',None,None],[0.5,15.5,1,1]],dtype = object)

但所需的输出是

array([[['address',None,'age',None,None,None,None],[0.5,-1,15.5,-1,-1,1,1]],dtype = object)] >

如果在第一个数组中没有值,而在第二个数组中为-1,则表示该节点不存在。因此,这里是地址的正确子代的年龄为2 * 0 + 2 = 2数组中的索引,分别在数组的2 * 2 +1 =第5个索引和2 * 2 + 2 =第6个索引中,分别找到左和右年龄的孩子。

我如何处理sklearn决策树的广度优先搜索遍历?在我的代码中,我尝试了sklearn.tree_库,并使用了诸如tree_.feature和tree_.threshold之类的各种功能来对...

python-3.x scikit-learn decision-tree
1个回答
0
投票

这样的事情?

© www.soinside.com 2019 - 2024. All rights reserved.