Пример 1. Подбор гиперпараметров методом Grid Search

Гиперпараметры определяются до начала обучения модели. К ним относятся, например, глубина дерева, параметр C у SVM и коэффициент регуляризации.

Grid Search выполняет перебор заданных комбинаций гиперпараметров и оценивает их с помощью перекрёстной проверки.

Рассмотрим пример из лекции: четыре значения глубины дерева и три значения learning_rate.

Количество комбинаций:

4 × 3 = 12.

При пятикратной перекрёстной проверке:

12 × 5 = 60 обучений.

После выбора лучшей конфигурации модель дополнительно обучается на всей обучающей выборке.

Реализация на Python:

from sklearn.datasets import make_regression

from sklearn.model_selection import (

    train_test_split,

    GridSearchCV

)

from sklearn.ensemble import GradientBoostingRegressor

 

X, y = make_regression(

    n_samples=300,

    n_features=5,

    noise=15,

    random_state=42

)

 

X_train, X_test, y_train, y_test = train_test_split(

    X, y,

    test_size=0.2,

    random_state=42

)

 

param_grid = {

    "max_depth": [1, 2, 3, 4],

    "learning_rate": [0.01, 0.05, 0.1]

}

 

search = GridSearchCV(

    estimator=GradientBoostingRegressor(

        n_estimators=50,

        random_state=42

    ),

    param_grid=param_grid,

    cv=5,

    scoring="neg_mean_squared_error"

)

 

search.fit(X_train, y_train)

 

print("Количество комбинаций:", len(search.cv_results_["params"]))

print("Лучшие параметры:", search.best_params_)

print("Тестовый R²:", round(search.score(X_test, y_test), 3))

Grid Search исследует все 12 комбинаций параметров.

Выбор гиперпараметров выполняется на обучающих данных с помощью перекрёстной проверки. Тестовая выборка используется только после завершения поиска.

Пример 2. Случайный поиск гиперпараметров

Random Search отличается от Grid Search тем, что исследует заданное количество случайно выбранных конфигураций.

Это позволяет ограничить число экспериментов при большом пространстве гиперпараметров.

Реализация на Python:

from sklearn.datasets import make_classification

from sklearn.model_selection import (

    train_test_split,

    RandomizedSearchCV

)

from sklearn.tree import DecisionTreeClassifier

from sklearn.metrics import accuracy_score

 

X, y = make_classification(

    n_samples=300,

    n_features=6,

    n_informative=4,

    n_redundant=0,

    random_state=42

)

 

X_train, X_test, y_train, y_test = train_test_split(

    X, y,

    test_size=0.2,

    stratify=y,

    random_state=42

)

 

param_distributions = {

    "max_depth": [2, 3, 4, 5, 6, 7],

    "min_samples_leaf": [1, 2, 3, 4, 5]

}

 

search = RandomizedSearchCV(

    estimator=DecisionTreeClassifier(random_state=42),

    param_distributions=param_distributions,

    n_iter=10,

    cv=5,

    random_state=42

)

 

search.fit(X_train, y_train)

 

predictions = search.predict(X_test)

 

print("Проверено конфигураций:", len(search.cv_results_["params"]))

print("Лучшие параметры:", search.best_params_)

print(

    "Точность:",

    round(accuracy_score(y_test, predictions), 3)

)

В данном эксперименте случайный поиск исследует 10 конфигураций вместо полного перебора 30 комбинаций.

Байесовская оптимизация также относится к подходам поиска гиперпараметров, упомянутым в лекции, но использует результаты предыдущих испытаний для выбора следующих конфигураций.

Пример 3. Интерпретация модели с помощью Permutation Importance

Permutation Importance оценивает важность признака по ухудшению метрики после случайного перемешивания значений этого признака.

Если перемешивание приводит к существенному снижению качества, признак важен для прогнозов модели в условиях данного эксперимента.

Реализация на Python:

from sklearn.datasets import make_classification

from sklearn.model_selection import train_test_split

from sklearn.ensemble import RandomForestClassifier

from sklearn.inspection import permutation_importance

 

X, y = make_classification(

    n_samples=400,

    n_features=5,

    n_informative=3,

    n_redundant=0,

    shuffle=False,

    random_state=42

)

 

X_train, X_test, y_train, y_test = train_test_split(

    X, y,

    test_size=0.2,

    stratify=y,

    random_state=42

)

 

model = RandomForestClassifier(

    n_estimators=100,

    random_state=42

)

 

model.fit(X_train, y_train)

 

result = permutation_importance(

    model,

    X_test,

    y_test,

    scoring="accuracy",

    n_repeats=10,

    random_state=42

)

 

for index, importance in enumerate(result.importances_mean):

    print(

        f"Признак {index}:",

        round(importance, 4)

    )

Значения показывают среднее изменение качества при перемешивании каждого признака.

При коррелированных признаках такая оценка может быть нестабильной.

Другой метод интерпретации, SHAP, объясняет локальные вклады признаков относительно базового значения прогноза. При этом объяснение SHAP не доказывает причинно-следственную связь.