3

Эти вопросы очень специфичны для библиотеки Python scikit-learn. Пожалуйста, дайте мне знать, если лучше разместить его в другом месте. Благодаря!Ранняя остановка при тренировке нейронной сети в scikit-learn

Теперь вопрос ...

У меня есть прямоточный нейронная сеть класс ffnn, основанный на BaseEstimator, который я тренируюсь с СГДОМ. Он работает нормально, и я также могу тренировать его параллельно с помощью GridSearchCV().

Теперь я хочу реализовать раннюю остановку в функции ffnn.fit(), но для этого мне также нужен доступ к данным валидации складки. Один из способов сделать это, чтобы изменить строку в sklearn.grid_search.fit_grid_point(), который говорит

clf.fit(X_train, y_train, **fit_params) 

в нечто вроде

clf.fit(X_train, y_train, X_test, y_test, **fit_params) 

, а также изменить ffnn.fit(), чтобы принять эти аргументы. Это также повлияет на другие классификаторы в sklearn, что является проблемой. Я могу избежать этого, проверив какой-то флаг в fit_grid_point(), который говорит мне, когда вызывать clf.fit() одним из двух способов.

Может кто-нибудь предложить другой способ сделать это, когда мне не нужно редактировать какой-либо код в библиотеке sklearn?

В качестве альтернативы, было бы целесообразно дополнительно расколоть X_train и y_train в последовательности сборки/валидации в случайном порядке и проверить хорошую точку остановки, а затем повторно подготовить модель на всех X_train?

Спасибо!

ответ

7

Вы можете просто сделать модель нейронной сети внутренне вычеркнуть набор валидаций из пройденных X_train и y_train с помощью функции train_test_split.

Edit:

С другой стороны, было бы право на дальнейшее разделить X_train и y_train в поезде/проверки устанавливает случайным образом и проверить хорошей точки остановки, а затем повторно обучить модель на все X_train?

Да, но это было бы дорого. Вы могли бы просто найти точку остановки, а затем просто сделать один дополнительный проход над данными валидации, которые вы использовали, чтобы найти точку остановки.

+0

Спасибо! @ogrisel: Достаточно ли одного прохода над данными проверки? Как я могу проверить, может ли он быть лучше с несколькими проходами? – user1953384

+0

Вы можете сравнить итоговый результат теста с оценочной оценкой вашего оригинального, но более дорогостоящего подхода. – ogrisel

+0

Спасибо! И жаль насчет тривиального вопроса. Это, конечно, то, что нужно сделать :). – user1953384

0

Есть два способа:

Первое:

Принимая x_train и x_test раскол. Вы можете взять 0.1 откололись от x_train и сохранить его для проверки x_dev:

x_train, x_test, y_train, y_test = train_test_split(data_x, data_y, test_size=0.25) 

x_train, x_dev, y_train, y_dev = train_test_split(x_train, y_train, test_size=0.1) 

clf = GridSearchCV(YourEstimator(), param_grid=param_grid,) 
clf.fit(x_train, y_train, x_dev, y_dev) 

И ваша оценка будет выглядеть следующим образом и осуществлять раннюю остановку с x_dev, y_dev

class YourEstimator(BaseEstimator, ClassifierMixin): 
    def __init__(self, param1, param2): 
     # perform initialization 
     # 

    def fit(self, x, y, x_dev=None, y_dev=None): 
     # perform training with early stopping 
     # 

Второго

Вы не выполнили бы второй раскол на x_train, но вытащили бы dev set в методе подгонки Оценщика

x_train, x_test, y_train, y_test = train_test_split(data_x, data_y, test_size=0.25) 

clf = GridSearchCV(YourEstimator(), param_grid=param_grid) 
clf.fit(x_train, y_train) 

И ваша оценка будет выглядеть следующим образом:

class YourEstimator(BaseEstimator, ClassifierMixin): 
    def __init__(self, param1, param2): 
     # perform initialization 
     # 

    def fit(self, x, y): 
     # perform training with early stopping 
     x_train, x_dev, y_train, y_dev = train_test_split(x, y, 
                 test_size=0.1) 
Смежные вопросы