Оценка важности признаков

Сегодня я поделюсь своим опытом и некоторыми практическими советами в этой области.

Настройка гиперпараметров

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

Мой любимый инструмент для настройки гиперпараметров - библиотека Optuna. Вот пример кода для оптимизации параметров LightGBM:

import optuna
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import lightgbm as lgb

def objective(trial):
    data, target = load_breast_cancer(return_X_y=True)
    train_x, test_x, train_y, test_y = train_test_split(data, target, test_size=0.25)
    
    param = {
        'objective': 'binary',
        'metric': 'binary_logloss',
        'verbosity': -1,
        'boosting_type': 'gbdt',
        'lambda_l1': trial.suggest_float('lambda_l1', 1e-8, 10.0, log=True),
        'lambda_l2': trial.suggest_float('lambda_l2', 1e-8, 10.0, log=True),
        'num_leaves': trial.suggest_int('num_leaves', 2, 256),
        'feature_fraction': trial.suggest_float('feature_fraction', 0.4, 1.0),
        'bagging_fraction': trial.suggest_float('bagging_fraction', 0.4, 1.0),
        'bagging_freq': trial.suggest_int('bagging_freq', 1, 7),
        'min_child_samples': trial.suggest_int('min_child_samples', 5, 100),
    }

    gbm = lgb.train(param, lgb.Dataset(train_x, label=train_y), 10000, valid_sets=lgb.Dataset(test_x, label=test_y), early_stopping_rounds=100, verbose_eval=False)
    preds = gbm.predict(test_x)
    pred_labels = np.rint(preds)
    accuracy = sklearn.metrics.accuracy_score(test_y, pred_labels)
    return accuracy

study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)

print('Number of finished trials:', len(study.trials))
print('Best trial:', study.best_trial.params)

Этот код автоматически перебирает различные комбинации гиперпараметров и находит наилучший вариант, максимизирующий точность на тестовой выборке.

Оценка важности признаков

Оценка важности признаков позволяет понять, какие переменные вносят наибольший вклад в предсказания модели. Это помогает отобрать наиболее информативные признаки и отбросить малозначимые, что улучшает интерпретируемость модели и снижает её склонность к переобучению.

Многие алгоритмы, такие как случайный лес и градиентный бустинг, имеют встроенные механизмы для оценки важности признаков. Пример кода для LightGBM:

import lightgbm as lgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

data, target = load_breast_cancer(return_X_y=True)
train_x, test_x, train_y, test_y = train_test_split(data, target, test_size=0.25)

train_data = lgb.Dataset(train_x, label=train_y)
param = {'objective':'binary'}
model = lgb.train(param, train_data, 100)

importances = model.feature_importance(importance_type='split')
feature_names = load_breast_cancer().feature_names
print(dict(zip(feature_names, importances)))

Этот код выводит словарь, где ключи - названия признаков, а значения - их важности. Важность вычисляется на основе того, насколько часто признак использовался для разбиения в деревьях решений.

Также полезным инструментом является рекурсивное исключение признаков (Recursive Feature Elimination, RFE) из библиотеки scikit-learn. RFE постепенно удаляет наименее важные признаки, пока не останется заданное количество.

Настройка гиперпараметров и оценка важности признаков - ключевые этапы разработки моделей машинного обучения. Современные библиотеки, такие как Optuna, LightGBM и scikit-learn существенно упрощают эти задачи. Надеюсь, мои советы и примеры кода будут вам полезны! Удачи в ваших ML-проектах!