Невозможно переключиться между RandomizedSearchCV и GridSearchCV - PullRequest
0 голосов
/ 11 октября 2019

Я могу запустить обе модели поиска, но только когда я перезагружаю Ядро, соответственно, повторяю все шаги с начала (загрузка данных и т. Д.). Я хочу сравнить GridSearchCV с RandomizedSearchCV только из любопытства:

def create_model(activation='relu', optimizer='adam', init='he_normal', metrics=['accuracy'], dropout_rate=0):   
model = Sequential()
model.add(Dense(...)

model.compile(loss = 'mean_squared_error', optimizer = 'adam', metrics = ['accuracy'])
return model

# define the grid search parameters
batch_size = [2, 4]
epochs = [1, 3]
activation = ['relu', 'tanh']
optimizer = ['RMSprop', 'Adam', 'Adamax', 'sgd'],
metrics = ['mean_squared_error'],
loss = ['mean_squared_error']     
dropout_rate = [0.2, 0.3, 0.4, 0.5]

# search_model = GridSearchCV or RandomSearchCV

gridsearch = False

if(gridsearch):
    param_grid = dict(batch_size=batch_size
                      , epochs=epochs
                      , activation = activation
                   #  , optimizer = optimizer
                   #  , metrics = metrics
                   #  , loss = loss        
                   #  , dropout_rate = dropout_rate 
                     )
    search_model = GridSearchCV
    hypparas = param_grid

else:
    param_dist = dict(batch_size=batch_size
                      , epochs=epochs
                      , activation = activation
                   #  , optimizer = optimizer
                   #  , metrics = metrics
                   #  , loss = loss        
                   #  , dropout_rate = dropout_rate 
                     )    
    search_model = RandomizedSearchCV
    hypparas = param_dist    

# create model
model = KerasRegressor(build_fn=create_model, verbose=0)

if(gridsearch):
    model_cv = search_model(estimator=model, 
                    param_grid=hypparas, 
                    n_jobs=1,   
                    cv=2)

else:
    model_cv = search_model(estimator=model, 
                    param_distributions=hypparas, 
                    n_jobs=1,  
                    cv=5)

time_callback = TimeHistory()

# Fit
X = X_train1
y = y_train1
model_cv_result = model_cv.fit(X, y
                              , callbacks = [time_callback]
                              )

Когда я изменяю gridsearch = False на gridsearch = True, таким образом, переключаясь с GridSearchCV на RandomizedSearchCV и повторяяоттуда я получаю сообщение об ошибке: AttributeError: 'float' object has no attribute 'time'

C:\ProgramData\Anaconda3\lib\site-packages\sklearn\model_selection\_validation.py:528: FutureWarning: From version 0.22, errors during fit will result in a cross validation score of NaN by default. Use error_score='raise' if you want an exception raised or error_score=np.nan to adopt the behavior from version 0.22.
  FutureWarning)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-162-9c9a4d6ea766> in <module>
     14 y = y_train1
     15 model_cv_result = model_cv.fit(X, y
---> 16                               , callbacks = [time_callback]
     17                               )
     18 

C:\ProgramData\Anaconda3\lib\site-packages\sklearn\model_selection\_search.py in fit(self, X, y, groups, **fit_params)
    685                 return results
    686 
--> 687             self._run_search(evaluate_candidates)
    688 
    689         # For multi-metric evaluation, store the best_index_, best_params_ and

C:\ProgramData\Anaconda3\lib\site-packages\sklearn\model_selection\_search.py in _run_search(self, evaluate_candidates)
   1146     def _run_search(self, evaluate_candidates):
   1147         """Search all candidates in param_grid"""
-> 1148         evaluate_candidates(ParameterGrid(self.param_grid))
   1149 
   1150 

C:\ProgramData\Anaconda3\lib\site-packages\sklearn\model_selection\_search.py in evaluate_candidates(candidate_params)
    664                                for parameters, (train, test)
    665                                in product(candidate_params,
--> 666                                           cv.split(X, y, groups)))
    667 
    668                 if len(out) < 1:

C:\ProgramData\Anaconda3\lib\site-packages\joblib\parallel.py in __call__(self, iterable)
    919             # remaining jobs.
    920             self._iterating = False
--> 921             if self.dispatch_one_batch(iterator):
    922                 self._iterating = self._original_iterator is not None
    923 

C:\ProgramData\Anaconda3\lib\site-packages\joblib\parallel.py in dispatch_one_batch(self, iterator)
    757                 return False
    758             else:
--> 759                 self._dispatch(tasks)
    760                 return True
    761 

C:\ProgramData\Anaconda3\lib\site-packages\joblib\parallel.py in _dispatch(self, batch)
    714         with self._lock:
    715             job_idx = len(self._jobs)
--> 716             job = self._backend.apply_async(batch, callback=cb)
    717             # A job can complete so quickly than its callback is
    718             # called before we get here, causing self._jobs to

C:\ProgramData\Anaconda3\lib\site-packages\joblib\_parallel_backends.py in apply_async(self, func, callback)
    180     def apply_async(self, func, callback=None):
    181         """Schedule a func to be run"""
--> 182         result = ImmediateResult(func)
    183         if callback:
    184             callback(result)

C:\ProgramData\Anaconda3\lib\site-packages\joblib\_parallel_backends.py in __init__(self, batch)
    547         # Don't delay the application, to avoid keeping the input
    548         # arguments in memory
--> 549         self.results = batch()
    550 
    551     def get(self):

C:\ProgramData\Anaconda3\lib\site-packages\joblib\parallel.py in __call__(self)
    223         with parallel_backend(self._backend, n_jobs=self._n_jobs):
    224             return [func(*args, **kwargs)
--> 225                     for func, args, kwargs in self.items]
    226 
    227     def __len__(self):

C:\ProgramData\Anaconda3\lib\site-packages\joblib\parallel.py in <listcomp>(.0)
    223         with parallel_backend(self._backend, n_jobs=self._n_jobs):
    224             return [func(*args, **kwargs)
--> 225                     for func, args, kwargs in self.items]
    226 
    227     def __len__(self):

C:\ProgramData\Anaconda3\lib\site-packages\sklearn\model_selection\_validation.py in _fit_and_score(estimator, X, y, scorer, train, test, verbose, parameters, fit_params, return_train_score, return_parameters, return_n_test_samples, return_times, return_estimator, error_score)
    512             estimator.fit(X_train, **fit_params)
    513         else:
--> 514             estimator.fit(X_train, y_train, **fit_params)
    515 
    516     except Exception as e:

C:\ProgramData\Anaconda3\lib\site-packages\keras\wrappers\scikit_learn.py in fit(self, x, y, **kwargs)
    149         fit_args.update(kwargs)
    150 
--> 151         history = self.model.fit(x, y, **fit_args)
    152 
    153         return history

C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
   1237                                         steps_per_epoch=steps_per_epoch,
   1238                                         validation_steps=validation_steps,
-> 1239                                         validation_freq=validation_freq)
   1240 
   1241     def evaluate(self,

C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training_arrays.py in fit_loop(model, fit_function, fit_inputs, out_labels, batch_size, epochs, verbose, callbacks, val_function, val_inputs, shuffle, initial_epoch, steps_per_epoch, validation_steps, validation_freq)
    144     for epoch in range(initial_epoch, epochs):
    145         model.reset_metrics()
--> 146         callbacks.on_epoch_begin(epoch)
    147         epoch_logs = {}
    148         if steps_per_epoch is not None:

C:\ProgramData\Anaconda3\lib\site-packages\keras\callbacks\callbacks.py in on_epoch_begin(self, epoch, logs)
    134         logs = logs or {}
    135         for callback in self.callbacks:
--> 136             callback.on_epoch_begin(epoch, logs)
    137         self._reset_batch_timing()
    138 

<ipython-input-121-c4f8115d9239> in on_epoch_begin(self, epoch, logs)
     19         self.times = []
     20     def on_epoch_begin(self, epoch, logs={}):
---> 21         self.epoch_time_start = time.time()
     22     def on_epoch_end(self, epoch, logs={}):
     23         self.times.append(time.time() - self.epoch_time_start)

AttributeError: 'float' object has no attribute 'time'
...