Модели на основе деревьев: деревья решений и случайные леса
Создавайте и настраивайте модели деревьев решений и ансамблевых лесов.
«Модели на основе деревьев: деревья решений и случайные леса» — бесплатный урок Python Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Основные понятия деревьев решений
Дерево решений разделяет данные на подмножества, задавая последовательность бинарных вопросов. Каждый внутренний узел задаёт порог признака, а каждый лист содержит предсказание.
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
model = DecisionTreeClassifier(max_depth=3, random_state=0).fit(X, y)
print("Depth:", model.get_depth())
print("Leaves:", model.get_n_leaves())DecisionTreeClassifier
Основные гиперпараметры: max_depth, min_samples_split, min_samples_leaf. Более глубокие деревья переобучаются, а слишком неглубокие — недообучаются.
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)
model = DecisionTreeClassifier(max_depth=5, min_samples_leaf=5)
model.fit(X_tr, y_tr)
print("Test acc:", model.score(X_te, y_te))DecisionTreeRegressor
Деревья решений также подходят для регрессии: в каждом листе они предсказывают среднее целевое значение.
from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import make_regression
from sklearn.metrics import mean_squared_error
X, y = make_regression(noise=15, random_state=0)
model = DecisionTreeRegressor(max_depth=4).fit(X, y)
print("RMSE:", mean_squared_error(y, model.predict(X))**0.5)Важность признаков
model.feature_importances_ возвращает относительную важность каждого признака на основе уменьшения неоднородности.
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
import numpy as np
X, y = load_iris(return_X_y=True)
feature_names = load_iris().feature_names
model = DecisionTreeClassifier().fit(X, y)
for name, imp in sorted(zip(feature_names, model.feature_importances_), key=lambda x: -x[1]):
print(f"{name}: {imp:.3f}")Обзор случайного леса
Случайный лес обучает множество некоррелированных деревьев решений на бутстрэп-выборках и усредняет их предсказания, уменьшая дисперсию без увеличения смещения.
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)
model = RandomForestClassifier(n_estimators=100, random_state=0)
model.fit(X_tr, y_tr)
print("Test acc:", model.score(X_te, y_te))RandomForestRegressor
Случайные леса так же хорошо работают для регрессии.
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import make_regression
from sklearn.metrics import r2_score
X, y = make_regression(noise=10, random_state=0)
model = RandomForestRegressor(n_estimators=100, random_state=0).fit(X, y)
print("R²:", r2_score(y, model.predict(X)))Оценка по вневыборочным объектам
Задайте oob_score=True, чтобы бесплатно получить оценку на валидации с использованием объектов, не попавших в бутстрэп-выборку каждого дерева; отдельный тестовый набор не потребуется.
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
X, y = make_classification(random_state=0)
model = RandomForestClassifier(n_estimators=100, oob_score=True, random_state=0).fit(X, y)
print("OOB score:", model.oob_score_)Градиентный бустинг
Градиентный бустинг (GBM) обучает деревья последовательно, причём каждое исправляет ошибки предыдущего. Он часто точнее случайных лесов, но обучается медленнее.
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)
model = GradientBoostingClassifier(n_estimators=100).fit(X_tr, y_tr)
print("Test acc:", model.score(X_te, y_te))XGBoost / LightGBM
XGBoost и LightGBM — оптимизированные библиотеки для градиентного бустинга: они быстрее, лучше масштабируются и часто точнее, чем GBM из sklearn.
# pip install xgboost lightgbm
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)
xgb = XGBClassifier(n_estimators=100, eval_metric="logloss").fit(X_tr, y_tr)
print("XGB acc:", xgb.score(X_te, y_te))Настройка n_estimators
Увеличение числа деревьев в случайном лесу уменьшает дисперсию (до определённого предела), не приводя к переобучению. Используйте кривую валидации, чтобы найти оптимальное число деревьев.
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_classification
import numpy as np
X, y = make_classification(random_state=0)
for n in [10, 50, 100, 200]:
scores = cross_val_score(RandomForestClassifier(n_estimators=n, random_state=0), X, y, cv=5)
print(f"n={n}: {scores.mean():.3f}")Визуализация дерева решений
Используйте sklearn.tree.plot_tree или export_text, чтобы изучить, чему научилось дерево.
from sklearn.tree import DecisionTreeClassifier, export_text, plot_tree
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
model = DecisionTreeClassifier(max_depth=2).fit(X, y)
print(export_text(model, feature_names=load_iris().feature_names.tolist()))Быстрая проверка
Как случайный лес уменьшает переобучение по сравнению с одним деревом решений?
Повторение
Деревья решений разделяют данные по порогам признаков и делают предсказания по значениям в листьях. Настраивайте max_depth, чтобы управлять переобучением. Случайные леса усредняют результаты множества деревьев, уменьшая дисперсию. Градиентный бустинг последовательно обучает деревья для достижения высокой точности. Для промышленной эксплуатации предпочтительнее использовать XGBoost или LightGBM.
Часто задаваемые вопросы
Урок «Модели на основе деревьев: деревья решений и случайные леса» бесплатный?
Да — полный текст урока «Модели на основе деревьев: деревья решений и случайные леса» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «Модели на основе деревьев: деревья решений и случайные леса»?
Создавайте и настраивайте модели деревьев решений и ансамблевых лесов. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Модели на основе деревьев: деревья решений и случайные леса»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- API scikit-learn: fit, transform, predict
- Линейные модели: регрессия и классификация
- Модели на основе деревьев: деревья решений и случайные леса
- Оценка моделей и перекрёстная проверка