【问题标题】:partial_fit Sklearn's MLPClassifierpartial_fit Sklearn 的 MLPClassifier
【发布时间】:2016-06-15 20:33:28
【问题描述】:

我一直在尝试使用 Sklearn 的神经网络 MLPClassifier。我有一个大小为 1000 个实例(带有二进制输出)的数据集,我想应用一个带有 1 个隐藏层的基本神经网络。

问题是我的数据实例并非同时可用。在任何时间点,我只能访问 1 个数据实例。我认为 MLPClassifier 的 partial_fit 方法可以用于此,所以我用 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

【问题讨论】:

    标签: python scikit-learn neural-network classification


    【解决方案1】:

    问题说明

    问题在于multilayer_perceptron.py 中的第 895 行中的 self.label_binarizer_.fit(y)

    每当您调用clf.partial_fit(input_inst,target_inst,classes) 时,您都会调用self.label_binarizer_.fit(y),在这种情况下,y 只有一个样本对应一个类。因此,如果最后一个样本属于 0 类,那么您的 clf 会将所有内容归类为 0 类。

    解决方案

    作为临时修复,您可以在第 895 行编辑 multilayer_perceptron.py。 在类似这个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 个主要变化。这应该可以让您对训练集和测试集都有一个很好的预测!

    干杯。

    【讨论】:

    • 上述行为在 sklearn >0.18 中发生了变化。不会像上面提到的那样工作。
    猜你喜欢
    • 2017-04-02
    • 2019-11-28
    • 2016-03-05
    • 2016-10-03
    • 2017-11-04
    • 2017-11-22
    • 2017-11-11
    • 2017-06-13
    • 1970-01-01
    相关资源
    最近更新 更多