Машинное обучение на основе древовидных моделей в Python
Elie Kawerk
Data Scientist
Модель машинного обучения:
параметры: обучаются на данных
гиперпараметры: не обучаются на данных, задаются до обучения
max_depth, min_samples_leaf, критерий разбиения ...Задача: найти оптимальный набор гиперпараметров для алгоритма обучения.
Решение: подобрать гиперпараметры, дающие оптимальную модель.
Оптимальная модель: достигает наилучшей оценки.
Оценка: в sklearn по умолчанию — accuracy (классификация) и $R^2$ (регрессия).
Для оценки обобщающей способности используется кросс-валидация.
В sklearn гиперпараметры модели по умолчанию не оптимальны для всех задач.
Гиперпараметры следует настраивать для достижения наилучшего качества модели.
Поиск по сетке
Случайный поиск
Байесовская оптимизация
Генетические алгоритмы
....
Задайте сетку дискретных значений гиперпараметров вручную.
Выберите метрику для оценки качества модели.
Выполните полный перебор по сетке.
Для каждого набора гиперпараметров оцените CV-оценку модели.
Оптимальные гиперпараметры — те, при которых CV-оценка наивысшая.
max_depth = {2,3,4},min_samples_leaf = {0.05, 0.1}# Import DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier
# Set seed to 1 for reproducibility
SEED = 1
# Instantiate a DecisionTreeClassifier 'dt'
dt = DecisionTreeClassifier(random_state=SEED)
# Print out 'dt's hyperparameters
print(dt.get_params())
{'class_weight': None,
'criterion': 'gini',
'max_depth': None,
'max_features': None,
'max_leaf_nodes': None,
'min_impurity_decrease': 0.0,
'min_impurity_split': None,
'min_samples_leaf': 1,
'min_samples_split': 2,
'min_weight_fraction_leaf': 0.0,
'presort': False,
'random_state': 1,
'splitter': 'best'}
# Import GridSearchCV from sklearn.model_selection import GridSearchCV# Define the grid of hyperparameters 'params_dt' params_dt = { 'max_depth': [3, 4,5, 6], 'min_samples_leaf': [0.04, 0.06, 0.08], 'max_features': [0.2, 0.4,0.6, 0.8] }# Instantiate a 10-fold CV grid search object 'grid_dt' grid_dt = GridSearchCV(estimator=dt, param_grid=params_dt, scoring='accuracy', cv=10, n_jobs=-1)# Fit 'grid_dt' to the training data grid_dt.fit(X_train, y_train)
# Extract best hyperparameters from 'grid_dt'
best_hyperparams = grid_dt.best_params_
print('Best hyerparameters:\n', best_hyperparams)
Best hyerparameters:
{'max_depth': 3, 'max_features': 0.4, 'min_samples_leaf': 0.06}
# Extract best CV score from 'grid_dt'
best_CV_score = grid_dt.best_score_
print('Best CV accuracy'.format(best_CV_score))
Best CV accuracy: 0.938
# Extract best model from 'grid_dt' best_model = grid_dt.best_estimator_# Evaluate test set accuracy test_acc = best_model.score(X_test,y_test) # Print test set accuracy print("Test set accuracy of best model: {:.3f}".format(test_acc))
Test set accuracy of best model: 0.947
Машинное обучение на основе древовидных моделей в Python