Вот мой основной код для двухкомпонентной классификации хорошо известного 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](https://i.stack.imgur.com/9CfJR.png)
Это довольно нормальное дерево на первый взгляд, но я заметил кое-что странное в этом. В узле № 6 всего 46 образцов, только один из которых в разноцветной форме, поэтому узел помечен как virginica. Это кажется довольно разумным местом для остановки. Однако по какой-то причине я не могу понять, алгоритм решает разделить дальше на узлы № 7 и № 8. Но странным является то, что 1-я версиколор все еще там ошибочно классифицируется, поскольку оба узла в конечном итоге имеют класс virginica. Почему он это делает? Слепо ли он смотрит только на уменьшение Джини, не смотря на то, имеет ли это какое-то значение - мне это кажется странным, и я нигде не могу найти его документированным.
Можно ли отключить или это действительно правильно?