Неделя 5: Деревья решений и ансамбли
1. Теоретическая часть
1.1. Деревья решений
Дерево решений — алгоритм, который строит иерархическую структуру правил для классификации или регрессии.
Ключевые понятия
Критерии разделения:
Gini impurity (классификация): 𝐺=1−∑𝑖=1𝑘𝑝𝑖2G=1−∑i=1kpi2
Entropy (классификация): 𝐻=−∑𝑖=1𝑘𝑝𝑖log2𝑝𝑖H=−∑i=1kpilog2pi
MSE (регрессия)
Глубина дерева: Контролирует сложность модели.
Преимущества и недостатки
Плюсы
Минусы
Интерпретируемость
Склонность к переобучению
Работает с категориальными признаками
Нестабильность (малые изменения данных → другое дерево)
1.2. Ансамбли методов
Комбинирование нескольких моделей для улучшения качества предсказаний.
Бэггинг (Bootstrap Aggregating)
Обучение независимых моделей на разных подвыборках данных.
Усреднение результатов (для регрессии) или голосование (для классификации).
Random Forest — бэггинг над деревьями решений с случайным выбором признаков.
Бустинг
Последовательное обучение моделей, где каждая исправляет ошибки предыдущей.
AdaBoost, Gradient Boosting, XGBoost, LightGBM.
2.1. Деревья решений в Scikit-learn
python
Copy
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.datasets import load_iris
# Загрузка данных
iris = load_iris()
X, y = iris.data, iris.target
# Обучение дерева
clf = DecisionTreeClassifier(max_depth=3, criterion='gini')
clf.fit(X, y)
# Визуализация дерева
plt.figure(figsize=(12, 8))
plot_tree(clf, feature_names=iris.feature_names,
class_names=iris.target_names, filled=True)
plt.show()
2.2. Случайный лес (Random Forest)
python
Copy
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# Обучение
rf = RandomForestClassifier(n_estimators=100, max_depth=3)
rf.fit(X_train, y_train)
# Предсказание
y_pred = rf.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
# Важность признаков
importances = rf.feature_importances_
plt.barh(iris.feature_names, importances)
plt.title("Feature Importance")
plt.show()
2.3. Градиентный бустинг (XGBoost)
python
Copy
import xgboost as xgb
# Обучение
model = xgb.XGBClassifier(n_estimators=100, learning_rate=0.1)
model.fit(X_train, y_train)
# Предсказание
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
# Визуализация важности признаков
xgb.plot_importance(model)
plt.show()
3. Домашнее задание
Задача 1: Подбор гиперпараметров для дерева
1. Загрузите датасет wine из sklearn.datasets.
2. Подберите оптимальные max_depth и criterion через GridSearchCV.
Решение:
python
Copy
from sklearn.model_selection import GridSearchCV
param_grid = {
'max_depth': [2, 3, 5, 10],
'criterion': ['gini', 'entropy']
}
grid = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5)
grid.fit(X_train, y_train)
print("Best params:", grid.best_params_)
Задача 2: Сравнение Random Forest и XGBoost
1. Используя датасет digits, сравните RandomForestClassifier и XGBClassifier по метрике accuracy.
2. Визуализируйте важность признаков для обеих моделей.
Решение:
python
Copy
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
# Random Forest
rf = RandomForestClassifier(n_estimators=100)
rf.fit(X_train, y_train)
print("RF Accuracy:", accuracy_score(y_test, rf.predict(X_test)))
# XGBoost
xgb_model = xgb.XGBClassifier(n_estimators=100)
xgb_model.fit(X_train, y_train)
print("XGB Accuracy:", accuracy_score(y_test, xgb_model.predict(X_test)))
Задача 3: Регрессия с деревьями
1. Загрузите датасет diabetes.
2. Обучите DecisionTreeRegressor и RandomForestRegressor.
3. Сравните их по RMSE.
Решение:
python
Copy
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
X, y = load_diabetes(return_X_y=True)
# Дерево решений
tree = DecisionTreeRegressor(max_depth=3)
tree.fit(X_train, y_train)
print("Tree RMSE:", np.sqrt(mean_squared_error(y_test, tree.predict(X_test))))
# Случайный лес
rf = RandomForestRegressor(n_estimators=100)
rf.fit(X_train, y_train)
print("RF RMSE:", np.sqrt(mean_squared_error(y_test, rf.predict(X_test))))
Итоги недели
✅ Разобрали деревья решений и их критерии разделения.
✅ Изучили ансамбли: бэггинг (Random Forest) и бустинг (XGBoost).
✅ Научились оценивать важность признаков.
✅ Сравнили разные алгоритмы на реальных данных.
Следующая тема: Нейронные сети и PyTorch/TensorFlow. 🧠