Musisz użyć metody przewidywania.
Po szkoleniu drzewa podajesz wartości X, aby przewidzieć ich wynik.
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(random_state=0)
iris = load_iris()
tree = clf.fit(iris.data, iris.target)
tree.predict(iris.data)
wyjściowa:
>>> tree.predict(iris.data)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
Aby uzyskać szczegółowe informacje na temat struktury drzewa, możemy użyć tree_. getstate()
struktura Drzewo przekłada się na sztuce "ASCII" obraz
0
_____________
1 2
______________
3 12
_______ _______
4 7 13 16
___ ______ _____
5 6 8 9 14 15
_____
10 11
drzewo struktury jako tablicę.
In [38]: tree.tree_.__getstate__()['nodes']
Out[38]:
array([(1, 2, 3, 0.800000011920929, 0.6666666666666667, 150, 150.0),
(-1, -1, -2, -2.0, 0.0, 50, 50.0),
(3, 12, 3, 1.75, 0.5, 100, 100.0),
(4, 7, 2, 4.949999809265137, 0.16803840877914955, 54, 54.0),
(5, 6, 3, 1.6500000953674316, 0.04079861111111116, 48, 48.0),
(-1, -1, -2, -2.0, 0.0, 47, 47.0),
(-1, -1, -2, -2.0, 0.0, 1, 1.0),
(8, 9, 3, 1.5499999523162842, 0.4444444444444444, 6, 6.0),
(-1, -1, -2, -2.0, 0.0, 3, 3.0),
(10, 11, 2, 5.449999809265137, 0.4444444444444444, 3, 3.0),
(-1, -1, -2, -2.0, 0.0, 2, 2.0),
(-1, -1, -2, -2.0, 0.0, 1, 1.0),
(13, 16, 2, 4.850000381469727, 0.042533081285444196, 46, 46.0),
(14, 15, 1, 3.0999999046325684, 0.4444444444444444, 3, 3.0),
(-1, -1, -2, -2.0, 0.0, 2, 2.0),
(-1, -1, -2, -2.0, 0.0, 1, 1.0),
(-1, -1, -2, -2.0, 0.0, 43, 43.0)],
dtype=[('left_child', '<i8'), ('right_child', '<i8'),
('feature', '<i8'), ('threshold', '<f8'),
('impurity', '<f8'), ('n_node_samples', '<i8'),
('weighted_n_node_samples', '<f8')])
gdzie:
- Pierwszy węzeł [0] jest węzeł główny.
- Węzły wewnętrzne mają left_child i right_child odnoszące się do węzłów o wartościach dodatnich i większe od bieżącego węzła.
- liście mają wartość -1 dla lewego i prawego węzła podrzędnego.
- węzły 1,5,6, 8,10,11,14,15,16 są liśćmi.
- struktura węzłów została zbudowana przy użyciu algorytmu Głębokość pierwszego wyszukiwania.
- pole funkcji informuje, która z cech iris.data została użyta w węźle do określenia ścieżki dla tej próbki.
- próg informuje nas o wartości użytej do oceny kierunku w oparciu o funkcję.
- nieczystość osiąga 0 na liściach ... ponieważ wszystkie próbki są w tej samej klasie po dotarciu do liścia.
- n_node_samples mówi nam, ile próbek dociera do każdego liścia.
Korzystając z tych informacji, możemy trywialnie śledzić każdą próbkę X do liścia, gdzie ostatecznie ląduje, przestrzegając reguł klasyfikacji i progów skryptu. Dodatkowo, n_node_samples pozwoliłoby nam na wykonanie testów jednostkowych, upewniając się, że każdy węzeł otrzymuje poprawną liczbę próbek. Następnie wykorzystujemy dane wyjściowe drzewa.przewidzieć, możemy przypisać każdy liść do skojarzonej klasy.
Wystąpił podobny problem. Możesz znaleźć moją odpowiedź [tutaj] (http://stackoverflow.com/questions/20224526/how-to-extract-the-decision-rules-crom-scikit-learn-decision-tree/42227468#42227468) (i wspomniana tam instrukcja) jest pomocna. Używa metody, 'decision_path', z wersji 0.18. Zamień 'X_test' na' X_train' w kilku miejscach, jeśli chcesz zobaczyć próbki treningowe. – Kevin