partial_fit MLPClassifier Sklearn

Я пытаюсь использовать MLpClassifier нейронной сети Sklearn. У меня есть набор данных размером 1000 экземпляров (с двоичными выходами), и я хочу применить базовую нейронную сеть с 1 скрытым слоем к ней.

Проблема в том, что мои экземпляры данных недоступны одновременно. В любой момент времени у меня есть только доступ к 1 экземпляру данных. Я подумал, что для этого можно использовать метод partial_fit MLPClassifier, поэтому я смоделировал проблему с воображаемым набором данных из 1000 входов и зацикливал по входам по одному за раз и partial_fit для каждого экземпляра, но когда я запускаю код, нейронная сеть ничего не узнает и прогнозируемый выход – это все нули.

Я не знаю, что может вызвать проблему. Любая мысль очень ценится.

from __future__ import division import numpy as np from sklearn.datasets import make_classification from sklearn.neural_network import MLPClassifier #Creating an imaginary dataset input, output = make_classification(1000, 30, n_informative=10, n_classes=2) input= input / input.max(axis=0) N = input.shape[0] train_input = input[0:N/2,:] train_target = output[0:N/2] test_input= input[N/2:N,:] test_target = output[N/2:N] #Creating and training the Neural Net clf = MLPClassifier(activation='tanh', algorithm='sgd', learning_rate='constant', alpha=1e-4, hidden_layer_sizes=(15,), random_state=1, batch_size=1,verbose= True, max_iter=1, warm_start=True) classes=[0,1] for j in xrange(0,100): for i in xrange(0,train_input.shape[0]): input_inst = [train_input[i,:]] input_inst = np.asarray(input_inst) target_inst= [train_target[i]] target_inst = np.asarray(target_inst) clf=clf.partial_fit(input_inst,target_inst,classes) #Testing the Neural Net y_pred = clf.predict(test_input) print y_pred 

Объяснение проблемы

Проблема заключается в self.label_binarizer_.fit(y) в строке 895 в multilayer_perceptron.py .

Всякий раз, когда вы вызываете clf.partial_fit(input_inst,target_inst,classes) , вы вызываете self.label_binarizer_.fit(y) где y имеет только один образец, соответствующий одному классу, в этом случае. Поэтому, если последний образец имеет класс 0, ваш clf будет классифицировать все как класс 0.

Решение

В качестве временного исправления вы можете редактировать multilayer_perceptron.py в строке 895. Он находится в каталоге, подобном этому python2.7/site-packages/sklearn/neural_network/

На строке 895 измените,

 self.label_binarizer_.fit(y) 

в

 if not incremental: self.label_binarizer_.fit(y) else: self.label_binarizer_.fit(self.classes_) 

Таким образом, если вы используете partial_fit , то self.label_binarizer_ подходит для классов, а не для отдельного образца.

Кроме того, код, который вы опубликовали, может быть изменен следующим образом, чтобы заставить его работать,

 from __future__ import division import numpy as np from sklearn.datasets import make_classification from sklearn.neural_network import MLPClassifier #Creating an imaginary dataset input, output = make_classification(1000, 30, n_informative=10, n_classes=2) input= input / input.max(axis=0) N = input.shape[0] train_input = input[0:N/2,:] train_target = output[0:N/2] test_input= input[N/2:N,:] test_target = output[N/2:N] #Creating and training the Neural Net # 1. Disable verbose (verbose is annoying with partial_fit) clf = MLPClassifier(activation='tanh', algorithm='sgd', learning_rate='constant', alpha=1e-4, hidden_layer_sizes=(15,), random_state=1, batch_size=1,verbose= False, max_iter=1, warm_start=True) # 2. Set what the classes are clf.classes_ = [0,1] for j in xrange(0,100): for i in xrange(0,train_input.shape[0]): input_inst = train_input[[i]] target_inst= train_target[[i]] clf=clf.partial_fit(input_inst,target_inst) # 3. Monitor progress print "Score on training set: %0.8f" % clf.score(train_input, train_target) #Testing the Neural Net y_pred = clf.predict(test_input) print y_pred # 4. Compute score on testing set print clf.score(test_input, test_target) 

В коде есть 4 основных изменения. Это должно дать вам хорошее предсказание как для тренировки, так и для тестирования!

Приветствия.