python - partial_fit Sklearn 的 MLPClassifier

标签 python scikit-learn neural-network classification

我一直在尝试使用 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

最佳答案

问题的解释

问题出在 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 个主要更改。这应该可以让您对训练集和测试集都有很好的预测!

干杯。

关于python - partial_fit Sklearn 的 MLPClassifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35756549/

相关文章:

python - 基于有限特征预测百分比准确度

neural-network - GAN 的损失函数的理想值是多少

python - 使用求幂 **0.5 比 math.sqrt 效率低?

python - 序列的递归求和返回错误结果

python - 如何在python中有选择地导入模块?

python - Sklearn 中基于示例的 f 分数小于精度和召回率

python - 将 datetime.datetime 对象写入文件

python - 在 fit_transform 之后得到 sklearn.LabelEncoder() 映射

python - scikit-learn fit() 在规范化数据后导致错误

python - 类型错误 : Unrecognized keyword arguments: {'show_accuracy' : True} #yelp challenge dataset