Как мне выполнить первый обход в поиске дерева решений sklearn?
В своем коде я попробовал библиотеку sklearn.tree_ и использовал различные функции, такие как tree_.feature и tree_.threshold, чтобы понять структура дерева. Но эти функции выполняют обход дерева dfs, если я хочу сделать bfs, как мне это сделать?
Предположим,
clf1 = DecisionTreeClassifier( max_depth = 2 )
clf1 = clf1.fit(x_train, y_train)
, это мой классификатор, и полученное дерево решений
![Decision tree](https://i.stack.imgur.com/i4NOA.jpg)
Затем я прошел по дереву, используя следующую функцию
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)
, и в результате получился массив
( [['address', 'age', None, None, 'age', None, None], [0.5, 17.5, 2, 1, 15.5, 1, 1]], dtype = object), где 1-й массив является признаком узел или если это конечный узел, то он помечается как none и 2-й массив является порогом для узла признаков, а для узла класса это класс, но это обход dfs дерева. Я хочу сделать обход bfs, что мне делать? Ответ на вышеуказанную часть получен.
Я хотел бы знать, можем ли мы сохранить дерево в массиве таким образом, чтобы оно представляло собой полное двоичное дерево, чтобы дочерние элементы i-го узла сохранялись в 2i + 1-й и 2i +2-й индекс?
![enter image description here](https://i.stack.imgur.com/Ad3HM.jpg)
Для вышеприведенного дерева выводится массив ([['address', 'age', None, None], [ 0,5, 15,5, 1, 1]], dtype = object)
, но желаемым выводом является массив
([['address', None, 'age', None, None, None , None], [0.5, -1, 15,5, -1, -1, 1, 1]], dtype = object)
Если значения отсутствуют в 1-м массиве и -1 во 2-м массиве, это будет означать этот узел не существует. Таким образом, здесь возраст, являющийся правым потомком адреса, находится в 2 * 0 + 2 = 2 индекса в массиве, и аналогично левый и правый ребенок возраста находится в 2 * 2 + 1 = 5-й индекс и 2 * 2 + 2 = 6-й индекс массива соответственно.