Как реализовать случайную поисковую оптимизацию для MLPClassifier? - PullRequest
0 голосов
/ 27 апреля 2020

Я новичок в оптимизации и пытаюсь научиться случайному поиску. Изучив некоторую теорию, я попытался реализовать ее в MLPClassifier, над которым ранее работал.

def hyperparameter_tune(clf, parameters, iterations, X, y):
  randomSearch = RandomizedSearchCV(clf, param_distributions=parameters, n_jobs=-1, n_iter=iterations, cv=6) 
  randomSearch.fit(X,y)
  params = randomSearch.best_params_
  score = randomSearch.best_score_
  return params, score

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

parameters = {
    'nohn': [150,200,250,300],
    'solver': ['sgd', 'adam', 'lbfgs'],
    'activation': ['relu', 'tanh']
}
clf = MLPClassifier(batch_size=256, verbose=True, early_stopping=True)
parameters_after_tuning, score_after_tuning = hyperparameter_tune(MLPClassifier, parameters, 20, X_train_pca, y);
print(score)

Сначала я просто хотел оптимизировать количество скрытых нейронов, решатель и функцию активации для MLPClassifier. Поэтому я назначил другие параметры, такие как batch_size фиксированное значение при создании классификатора. Но когда я передаю классификатор методу hyperparamter_tune, я получаю следующую ошибку

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-18-a0c800c38881> in <module>()
      1 clf = MLPClassifier()
----> 2 parameters_after_tuning, score_after_tuning = tuning(MLPClassifier, parameters, 20, X_train_pca, y);
      3 print(score)

/usr/local/lib/python3.6/dist-packages/sklearn/base.py in clone(estimator, safe)
     65                             "it does not seem to be a scikit-learn estimator "
     66                             "as it does not implement a 'get_params' methods."
---> 67                             % (repr(estimator), type(estimator)))
     68     klass = estimator.__class__
     69     new_object_params = estimator.get_params(deep=False)

TypeError: Cannot clone object '<class 'sklearn.neural_network._multilayer_perceptron.MLPClassifier'>' (type <class 'abc.ABCMeta'>): it does not seem to be a scikit-learn estimator as it does not implement a 'get_params' methods.

Может кто-нибудь мне помочь. Скорее всего, есть много вещей, которые я мог бы сделать лучше в моем коде. Я хотел бы услышать любые предложения.

1 Ответ

1 голос
/ 27 апреля 2020

В вашем коде более одной ошибки.

  1. Вы передаете MLPClassifier класс hyperparameter_tune вместо clf.

  2. Для MLP нет параметра nohn!

  3. Вы печатаете score, которого не существует.

Вот минимальный пример, который работает:

from sklearn.model_selection import RandomizedSearchCV
from sklearn.neural_network import MLPClassifier
import numpy as np

def hyperparameter_tune(clf, parameters, iterations, X, y):
  randomSearch = RandomizedSearchCV(clf, param_distributions=parameters, n_jobs=-1, n_iter=iterations, cv=2) 
  randomSearch.fit(X,y)
  params = randomSearch.best_params_
  score = randomSearch.best_score_
  return params, score


parameters = {
    'solver': ['sgd', 'adam', 'lbfgs'],
    'activation': ['relu', 'tanh']
}
clf = MLPClassifier(batch_size=256, verbose=True, early_stopping=True)

X_train_pca = np.random.randn(6,2)
y = [0, 1, 0, 1, 0, 1]
parameters_after_tuning, score_after_tuning = hyperparameter_tune(clf, parameters, 20, X_train_pca, y);
print(score_after_tuning)
...