Оптимизировать гиперпараметры hidden_layer_size MLPClassifier со скоптом - PullRequest
0 голосов
/ 29 апреля 2020

Как я могу оптимизировать количество слоев и размер скрытых слоев в нейронной сети, используя MLPClassifier из sklearn и skopt?

Обычно я определяю свое пространство как:

Space([Integer(name = 'alpha_2', low = 1, high = 2),
       Real(10**-5, 10**0, "log-uniform", name='alpha_2')])

(скажем, гиперпараметры alpha_1 и alpha_2).

При реализации нейронной сети в sklearn мне нужно настроить hidden_layer_sizes, что является кортежем:

hidden_layer_sizes : tuple, length = n_layers - 2, default=(100,)
    The ith element represents the number of neurons in the ith
    hidden layer.

Как я могу представить это в Space?

1 Ответ

1 голос
/ 04 мая 2020

Если вы используете gp_minimize, вы можете включить число скрытых слоев и нейронов на слой в качестве параметров в Space. Внутри определения целевой функции вы можете вручную создать гиперпараметр hidden_layer_sizes.

Это пример с домашней страницы , оптимизированной для scikit, теперь используется MLPRegressor:

import numpy as np
from sklearn.datasets import load_boston
from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import cross_val_score
from skopt.space import Real, Integer, Categorical 
from skopt.utils import use_named_args
from skopt import gp_minimize

boston = load_boston()
X, y = boston.data, boston.target
n_features = X.shape[1]

reg = MLPRegressor(random_state=0)

space=[
    Categorical(['tanh','relu'],name='activation'),
    Integer(1,4,name='n_hidden_layer'),
    Integer(200,2000,name='n_neurons_per_layer')]

@use_named_args(space)

def objective(**params):
    n_neurons=params['n_neurons_per_layer']
    n_layers=params['n_hidden_layer']

    # create the hidden layers as a tuple with length n_layers and n_neurons per layer
    params['hidden_layer_sizes']=(n_neurons,)*n_layers

    # the parameters are deleted to avoid an error from the MLPRegressor
    params.pop('n_neurons_per_layer')
    params.pop('n_hidden_layer')

    reg.set_params(**params)

    return -np.mean(cross_val_score(reg, X, y, cv=5, n_jobs=-1,
                                    scoring="neg_mean_absolute_error"))

res_gp = gp_minimize(objective, space, n_calls=50, random_state=0)

...