Дерево даёт 100% на train и 60% на test — какие ручки крутить и как проверить эффект?
DecisionTreeClassifier с настройками по умолчанию даёт идеальную метрику на обучении и около 60% на отложенной выборке.
Ограничения: признаки и данные те же; менять только контроль сложности модели и оценивать каждое изменение на отложенных данных, а не по подгонке.
tree = DecisionTreeClassifier(random_state=0).fit(X_train, y_train)
print(tree.score(X_train, y_train)) # 1.00
print(tree.score(X_test, y_test)) # 0.60
print(tree.get_n_leaves()) # очень много
# TODO: ограничить дерево и доказать эффект на отложенных данных
Найдите ручки и корректно проверьте исправление.
Дерево запомнило данные — неограниченная глубина позволяет листьям хранить по одной строке. Ограничьте max_depth, поднимите min_samples_leaf либо обрежьте дерево перебором ccp_alpha. Проверяют кросс-валидацией, а не числом листьев: обрезка помогла, если метрика выросла и разрыв сузился.
- ✗Принимают уменьшение дерева за доказательство роста обобщения
- ✗Подбирают глубину по тестовой выборке и её же приводят как результат
- ✗Опираются только на max_depth, игнорируя ограничения на размер листа
- →Как перебрать ccp_alpha кросс-валидацией, а не по одному разбиению?
- →За какую ручку возьмётесь первой при сильном дисбалансе классов?
Разрыв 100% против 60% — классическое запоминание: при неограниченной глубине дерево дробит выборку до листьев из одной строки, и такой лист описывает шум, а не закономерность.
Ограничивают сложность двумя способами. Pre-pruning — max_depth, min_samples_leaf, min_impurity_decrease. Post-pruning — перебор ccp_alpha по пути cost-complexity.
from sklearn.model_selection import cross_val_score
path = tree.cost_complexity_pruning_path(X_train, y_train)
for alpha in path.ccp_alphas[::5]:
m = DecisionTreeClassifier(random_state=0, ccp_alpha=alpha)
print(round(alpha, 5), round(cross_val_score(m, X_train, y_train, cv=5).mean(), 3))
Ключевое — критерий проверки. Уменьшение числа листьев ничего не доказывает: дерево можно обрезать до пня и получить меньше листьев при худшем качестве. Обрезка сработала, если выросла кросс-валидационная метрика и сузился разрыв train-test. Тестовую выборку трогают один раз, в самом конце.