Существуют различные гиперпараметры, используемые для обучения модели, и выбор лучшего гиперпараметра играет важную роль в достижении наилучшей производительности вывода. Итак, для преодоления таких проблем мы используем Grid Search.
GridSearchCV от Scikit-learn (где CV означает перекрестная проверка) обучает модель различным гиперпараметрам, введенным пользователем, и выводит наиболее подходящий гиперпараметр для соответствующих обучающих данных и модели.
В подходе GridSearchCV модель машинного обучения оценивается для диапазона значений гиперпараметров. Этот подход называется GridSearchCV
, потому что он ищет лучший набор гиперпараметров из сетки значений гиперпараметров.
>>> X = [[62812.09301], [66646.89292], [53798.55112], [79370.03798], [59729.1513], [68499.85162], [39814.522], [51752.23445], [58139.2591], [53457.10132], [73348.70745], [55421.65733], [37336.3383], [68304.47298], [72776.00382], [64662.30061], [63259.87837], [52682.06401], [54503.14423], [55368.23716]]
>>> y = [[35321.45877], [45115.52566], [42925.70921], [67422.36313], [55915.46248], [56611.99784], [28925.70549], [47434.98265], [48013.6141], [38189.50601], [59045.51309], [42288.81046], [28700.0334], [49258.87571], [49510.03356], [53017.26723], [41814.72067], [43901.71244], [44633.99241], [54827.52403]]
>>>parameters = [{'alpha': [0.5, 0.1, 0.01, 0.001], 'l1_ratio': [0.25, 0.5, 0.75, 1]}]
Я буду использовать ElasticNet для этого примера. Я хотел протестировать значения альфа и l1_ratio. Эти значения были добавлены в переменную параметров. Наша первая цель - найти лучшие параметры для этой модели.
Время кодирования…
>>> from sklearn.linear_model import ElasticNet
>>> from sklearn.model_selection import GridSearchCV
def cross_validation(X,y,parameters):
# Use grid search to tune the parameters:
eNet = ElasticNet()
grid = GridSearchCV(eNet, parameters).fit(X, y)
best_estimator = grid.best_estimator_
return {‘alpha’: best_estimator.alpha,
‘l1_ratio’: best_estimator.l1_ratio}
>>> cross_validation(X,y,parameters)
{'alpha': 0.5, 'l1_ratio': 1}
Когда мы рассматриваем наши входные данные и алгоритм, лучшее значение альфа равно 0,5, а лучшее значение l1_ratio равно 1.
Попробуем на реальном примере. В этом примере я буду использовать набор данных «диабет».
>>> from sklearn import datasets >>> from sklearn.linear_model import ElasticNet >>> from sklearn.linear_model import LogisticRegression >>> from sklearn.model_selection import GridSearchCV >>> from sklearn.model_selection import train_test_split >>> import numpy as np # Load the dataset >>> diabetes = datasets.load_diabetes() >>> X, y = diabetes.data, diabetes.target >>> parameters = [{‘alpha’: [0.5, 0.1, 0.01, 0.001], ‘l1_ratio’: [0.25, 0.5, 0.75, 1]}] # Splitting dataset into train and test set >>> X_train, X_test, Y_train, Y_test = train_test_split( X, y, test_size = 1/3, random_state = 0 ) def cross_validation(X,y,parameters): # Use grid search to tune the parameters: eNet = ElasticNet() grid = GridSearchCV(eNet, parameters).fit(X, y) best_estimator = grid.best_estimator_ return {‘alpha’: best_estimator.alpha, ‘l1_ratio’: best_estimator.l1_ratio} >>> cross_validation(X_train, Y_train, parameters)) {'alpha': 0.001, 'l1_ratio': 1}
Да. это лучшая альфа и l1_ratio для ElasticNet.
Теперь давайте изменим алгоритм на логистическую регрессию.
# Model training >>> max_accuracy = 0 # grid searching for learning rate >>> parameters = { ‘C’ : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] } >>> model = LogisticRegression() >>> grid = GridSearchCV( model, parameters ) >>> grid.fit( X_train, Y_train ) >>> print(“best_estimator_”, grid.best_estimator_) best_estimator_ LogisticRegression(C=2)
Мы нашли лучшее значение C. Это 2.
# Prediction on test set Y_pred = grid.predict( X_test ) # measure performance correctly_classified = 0 # counter count = 0 for count in range(np.size(Y_pred)): if Y_test[count] == Y_pred[count] : correctly_classified = correctly_classified + 1 accuracy = ( correctly_classified / count ) * 100 print( “Maximum accuracy achieved by sklearn model through grid searching : “, np.round( accuracy, 2 ) ) Maximum accuracy achieved by sklearn model through grid searching : 0.68
Спасибо за чтение :)