Оценка важности признаков
Сегодня я поделюсь своим опытом и некоторыми практическими советами в этой области.
Настройка гиперпараметров
Гиперпараметры - это параметры модели, которые не обучаются в процессе тренировки, а задаются заранее. Примеры: глубина деревьев в случайном лесе, скорость обучения в градиентном бустинге и т.д. Подбор оптимальных значений гиперпараметров позволяет существенно улучшить качество модели.
Мой любимый инструмент для настройки гиперпараметров - библиотека 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-проектах!