Почему мое дерево решений создает разделение, которое фактически не разделяет выборки? - PullRequest
0 голосов
/ 28 апреля 2018

Вот мой основной код для двухкомпонентной классификации хорошо известного Iris набора данных:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from graphviz import Source

iris = load_iris()
iris_limited = iris.data[:, [2, 3]] # This gets only petal length & width.

# I'm using the max depth as a way to avoid overfitting
# and simplify the tree since I'm using it for educational purposes
clf = DecisionTreeClassifier(criterion="gini",
                             max_depth=3,
                             random_state=42)

clf.fit(iris_limited, iris.target)

visualization_raw = export_graphviz(clf, 
                                    out_file=None,
                                    special_characters=True,
                                    feature_names=["length", "width"],
                                    class_names=iris.target_names,
                                    node_ids=True)

visualization_source = Source(visualization_raw)
visualization_png_bytes = visualization_source.pipe(format='png')
with open('my_file.png', 'wb') as f:
    f.write(visualization_png_bytes)

Когда я проверил визуализацию своего дерева, я нашел это:

Tree visualization result

Это довольно нормальное дерево на первый взгляд, но я заметил кое-что странное в этом. В узле № 6 всего 46 образцов, только один из которых в разноцветной форме, поэтому узел помечен как virginica. Это кажется довольно разумным местом для остановки. Однако по какой-то причине я не могу понять, алгоритм решает разделить дальше на узлы № 7 и № 8. Но странным является то, что 1-я версиколор все еще там ошибочно классифицируется, поскольку оба узла в конечном итоге имеют класс virginica. Почему он это делает? Слепо ли он смотрит только на уменьшение Джини, не смотря на то, имеет ли это какое-то значение - мне это кажется странным, и я нигде не могу найти его документированным.

Можно ли отключить или это действительно правильно?

1 Ответ

0 голосов
/ 29 апреля 2018

Почему он это делает?

Потому что это дает больше информации о классе образцов. Вы правы в том, что этот раскол не меняет результат какого-либо прогноза, но модель теперь более точна. Рассмотрим образцы в узле № 8: до разделения модель на 98% уверена в том, что эти образцы являются virginica. Тем не менее, после раскола модель говорит, что эти образцы, несомненно, являются virginica.

Слепо ли он смотрит только на уменьшение Джини, не смотря на то, имеет ли это значение вообще

По умолчанию DecisionTree продолжает разделяться, пока все конечные узлы не станут чистыми. Есть некоторые параметры, влияющие на поведение расщепления. Однако он не учитывает явно, имеет ли значение разделение узла с точки зрения предсказания метки.

Можно ли отключить или это действительно правильно?

Я не думаю, что есть способ заставить DecisionTreeClassifier не разделять, если разделение создает два конечных узла с одинаковой меткой. Однако, тщательно установив параметры min_samples_leaf и / или min_impurity_decrease, вы можете добиться аналогичной вещи.

...