Настройка гиперпараметров
Модель машинного обучения определяется как математическая модель с рядом параметров, которые необходимо изучить на основе данных. Обучая модель с существующими данными, мы можем подобрать параметры модели.
Однако есть еще один вид параметров, известный как гиперпараметры , которые нельзя узнать напрямую в процессе обычного обучения. Обычно их исправляют до начала самого тренировочного процесса. Эти параметры выражают важные свойства модели, такие как ее сложность или скорость обучения.
Некоторые примеры гиперпараметров модели включают:
- Штраф в классификаторе логистической регрессии, т.е. регуляризация L1 или L2
- Скорость обучения для обучения нейронной сети.
- Гиперпараметры C и сигма для машин опорных векторов.
- K в k-ближайших соседях.
Цель этой статьи - изучить различные стратегии настройки гиперпараметров для модели машинного обучения.
У моделей может быть много гиперпараметров, и поиск наилучшего сочетания параметров можно рассматривать как проблему поиска. Две лучшие стратегии настройки гиперпараметров:
- GridSearchCV
- RandomizedSearchCV
GridSearchCV
В подходе GridSearchCV модель машинного обучения оценивается для диапазона значений гиперпараметров. Этот подход называется GridSearchCV
, потому что он ищет лучший набор гиперпараметров из сетки значений гиперпараметров.
Например, если мы хотим установить два гиперпараметра C и Alpha модели классификатора логистической регрессии с различным набором значений. Метод gridsearch построит множество версий модели со всеми возможными комбинациями гиперпараметров и вернет лучшую.
Как на изображении, для C = [0,1, 0,2, 0,3, 0,4, 0,5] и Alpha = [0,1, 0,2, 0,3, 0,4].
Для комбинации C = 0,3 и Alpha = 0,2 оценка производительности составляет 0,726 (Наивысший) , поэтому она выбрана.
В следующем коде показано, как использовать GridSearchCV.
# Necessary imports from sklearn.linear_model import LogisticRegression from sklearn.model_selection import GridSearchCV # Creating the hyperparameter grid c_space = np.logspace( - 5 , 8 , 15 ) param_grid = { 'C' : c_space} # Instantiating logistic regression classifier logreg = LogisticRegression() # Instantiating the GridSearchCV object logreg_cv = GridSearchCV(logreg, param_grid, cv = 5 ) logreg_cv.fit(X, y) # Print the tuned parameters and score print ( "Tuned Logistic Regression Parameters: {}" . format (logreg_cv.best_params_)) print ( "Best score is {}" . format (logreg_cv.best_score_)) |
Выход:
Tuned Logistic Regression Parameters: {‘C’: 3.7275937203149381}
Best score is 0.7708333333333334
Недостаток : GridSearchCV будет проходить через все промежуточные комбинации гиперпараметров, что делает поиск по сетке очень дорогим в вычислительном отношении.
RandomizedSearchCV
RandomizedSearchCV устраняет недостатки GridSearchCV, поскольку он проходит только фиксированное количество настроек гиперпараметров. Он перемещается в сетке случайным образом, чтобы найти наилучшие установленные гиперпараметры. Такой подход сокращает ненужные вычисления.
В следующем коде показано, как использовать RandomizedSearchCV.
# Necessary imports from scipy.stats import randint from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import RandomizedSearchCV # Creating the hyperparameter grid param_dist = { "max_depth" : [ 3 , None ], "max_features" : randint( 1 , 9 ), "min_samples_leaf" : randint( 1 , 9 ), "criterion" : [ "gini" , "entropy" ]} # Instantiating Decision Tree classifier tree = DecisionTreeClassifier() # Instantiating RandomizedSearchCV object tree_cv = RandomizedSearchCV(tree, param_dist, cv = 5 ) tree_cv.fit(X, y) # Print the tuned parameters and score print ( "Tuned Decision Tree Parameters: {}" . format (tree_cv.best_params_)) print ( "Best score is {}" . format (tree_cv.best_score_)) |
Выход:
Tuned Decision Tree Parameters: {‘min_samples_leaf’: 5, ‘max_depth’: 3, ‘max_features’: 5, ‘criterion’: ‘gini’}
Best score is 0.7265625