Как увеличение глубины дерева влияет на дисперсию модели?

Ответ

Увеличение глубины дерева напрямую повышает дисперсию (variance) модели и снижает ее смещение (bias). Глубокое дерево может идеально подогнаться под обучающие данные, включая их шум и случайные флуктуации. Это приводит к переобучению: высокая точность на тренировочном наборе, но плохая способность обобщать на новые, невидимые данные.

Практическая демонстрация на синтетических данных:

import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split

# Генерируем данные с шумом
np.random.seed(42)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# Модель с высокой дисперсией (глубокое дерево)
deep_tree = DecisionTreeRegressor(max_depth=10)
deep_tree.fit(X_train, y_train)
train_score_deep = deep_tree.score(X_train, y_train)  # Будет близко к 1.0
test_score_deep = deep_tree.score(X_test, y_test)      # Существенно ниже

# Модель с низкой дисперсией (мелкое дерево)
shallow_tree = DecisionTreeRegressor(max_depth=3)
shallow_tree.fit(X_train, y_train)
train_score_shallow = shallow_tree.score(X_train, y_train) # Ниже, чем у deep_tree
test_score_shallow = shallow_tree.score(X_test, y_test)     # Выше, чем у deep_tree

Вывод: Слишком большая глубина увеличивает сложность модели и дисперсию. Оптимальную глубину находят через кросс-валидацию, балансируя смещение и дисперсию.

Ответ 18+ 🔞

А, ну это классика, ёпта! Сейчас объясню на пальцах, почему глубокое дерево — это иногда как дать обезьяне гранату: результат будет громкий, но предсказуемым его не назовёшь.

Смотри, в чём суть. Когда ты дереву глубину увеличиваешь до овердохуища, оно начинает вести себя как хитрая жопа. Его дисперсия (variance) взлетает до небес, а смещение (bias), наоборот, падает. Оно на тренировочных данных выучивает вообще всё, до последней соринки, включая случайный шум. Получается идеальная подгонка, но только для тех данных, на которых училось. А как новые дай — тут-то и начинается пиздец. Модель нихрена не обобщает, потому что заучила не закономерность, а конкретные точки с их косяками. Это и есть переобучение в чистом виде: на тренировочной выборке точность — огонь, а на новых данных — удивление пиздец, ни хуя себе.

Давай глянем на практике, как это выглядит. Вот код, тут всё просто:

import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split

# Генерируем данные с шумом
np.random.seed(42)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# Модель с высокой дисперсией (глубокое дерево)
deep_tree = DecisionTreeRegressor(max_depth=10)
deep_tree.fit(X_train, y_train)
train_score_deep = deep_tree.score(X_train, y_train)  # Будет близко к 1.0
test_score_deep = deep_tree.score(X_test, y_test)      # Существенно ниже

# Модель с низкой дисперсией (мелкое дерево)
shallow_tree = DecisionTreeRegressor(max_depth=3)
shallow_tree.fit(X_train, y_train)
train_score_shallow = shallow_tree.score(X_train, y_train) # Ниже, чем у deep_tree
test_score_shallow = shallow_tree.score(X_test, y_test)     # Выше, чем у deep_tree

Что тут происходит? Глубокое дерево (max_depth=10) на тренировочных данных выдаст score почти единицу — ебать мои старые костыли, красота! Но на тесте его результат обвалится, потому что оно перестаралось. А вот неглубокое дерево (max_depth=3) на тренировке покажет поскромнее, зато на тесте — стабильнее и часто лучше. Доверия к такому — больше, терпения ноль ебать не придётся тратить.

Так что вывод, чувак, простой: гнаться за максимальной глубиной — это прямой путь в переобучение. Нужно искать золотую середину через кросс-валидацию, чтобы и смещение, и дисперсию в узде держать. А то получится мартышлюшка с гранатой — много шума, а толку чуть.