2016-09-26 23 views
5

Zaobserwowałem, że scikit-learn clf.tree_.feature okazjonalnie zwraca ujemne wartości. Na przykład -2. O ile rozumiem, clf.tree_.feature powinien zwracać sekwencyjną kolejność funkcji. Jeśli mamy tablicę nazw funkcji ['feature_one', 'feature_two', 'feature_three'], wówczas -2 będzie się odnosić do feature_two. Jestem zaskoczony użyciem ujemnego indeksu. W bardziej sensownym sensie odnosić się do feature_two przez indeks 1. (-2 jest odniesieniem dogodnym dla trawienia człowieka, a nie do obróbki maszynowej). Czy czytam to poprawnie?clf.tree_.feature - jaki jest wynik? (scikit-learn)

Aktualizacja: Oto przykład:

def leaf_ordering(): 
    X = np.genfromtxt('X.csv', delimiter=',') 
    Y = np.genfromtxt('Y.csv',delimiter=',') 
    dt = DecisionTreeClassifier(min_samples_leaf=10, random_state=99) 
    dt.fit(X, Y) 
    print(dt.tree_.feature) 

Oto pliki X i Y

Oto wynik:

[ 8 9 -2 -2 9 4 -2 9 8 -2 -2 0 0 9 9 8 -2 -2 9 -2 -2 6 -2 -2 -2 
    2 -2 9 8 6 9 -2 -2 -2 8 9 -2 9 6 -2 -2 -2 6 -2 -2 9 -2 6 -2 -2 
    2 -2 -2] 
+0

Czy możesz podać przykład? – tfv

+0

@tfv, Właśnie napisałem przykład. – user1700890

Odpowiedz

3

Czytając kod źródłowy Cython dla generator drzewa widzimy, że -2 są po prostu fikcyjnymi wartościami dla funkcji spli w węzłach liścia t atrybut.

Line 63

TREE_UNDEFINED = -2 

Line 359

if is_leaf: 
    # Node is not expandable; set node as leaf 
    node.left_child = _TREE_LEAF 
    node.right_child = _TREE_LEAF 
    node.feature = _TREE_UNDEFINED 
    node.threshold = _TREE_UNDEFINED 
1

Trochę dodatkowych informacji dla każdego, kto natyka tym starym pytaniem prostu tak zrobiłem.

Podczas zapisu OP, clr.tree_.feature zwraca węzły/liście w kolejności sekwencyjnej jako algorytm wyszukiwania Głębokość-Pierwszy. Najpierw zaczyna się od węzła głównego, a następnie podąża za lewymi potomkami, aż osiągnie liść (zakodowany za pomocą -2), po osiągnięciu liścia wspina się po drzewie od liścia do liścia, aż dotrze do węzła. Po dotarciu do węzła ponownie opada w hierarchii, aż osiągnie węzeł liścia.

Patrząc na przykład OP, węzeł główny to funkcja 8, która ma lewe dziecko, cecha 9. Następnie, jeśli zejdziemy z hierarchii, natychmiast osiągamy węzeł liścia. Więc zaczynamy iść w górę, aż dotrzemy do węzła bez liści. Kolejnym węzłem (prawym dzieckiem) jest również węzeł liścia (dwoje dzieci z elementu 9 to oba węzły liści), a następnie wspinając się na drzewo, do którego ponownie docieramy do elementu 9 na pierwszym poziomie hierarchii. W tym przypadku funkcja 9 ma lewe dziecko, funkcję 4, która ma węzeł liściowy jako lewe dziecko, następnie patrzymy na prawe dziecko elementu 4, które znowu jest elementem 9 i tak dalej.