2017-06-16 96 views
0

我在Python中使用MLP分类器与不同种类的数据集。2类MLP分类器被强制为1输出(二进制分类器)

当有两个以上的类时,分类器中的输出数量相等。当我有2个类时,分类器被强制为1个输出(二进制)。这扰乱了权重矩阵以及权重的解释。

更具体地说,对于M输入和N输出,当N> 2时,权重矩阵(coefs_)为M×N。当N = 2时,权重矩阵是Mx1。有什么办法强制它分成两个类?如果我想仅使用两个类进行Multilabel分类,该怎么办?

在此先感谢!

+0

你能提供包括一些示例数据和您使用的sklearn确切类完整的例子吗?我怀疑你正在使用[MLPClassifier](http://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html)? –

+0

您可能想使用逻辑激活功能。在这种情况下,具有2个输出神经元相当于只有一个(因为softmax函数,第二个输出神经元的输出将被约束为1-第一个)。在这种情况下,二元分类与多分类分类是一致的。 – JARS

+0

感谢您的意见球员,我整理出来。 @JARS,感谢提示,我知道softmax vs logistic差异,MLPClassifier中有趣的是你不能改变输出层激活函数,据我所知。 –

回答

0

嗨,谢谢你的回应。我实际上找到了一个解决方案:

如果标签是单热编码,那么具有两个类的分类器有两个输出。

如果标签只是索引(带有整数的向量),则只有一个输出以防有两个类。如果有更多的类,则它与单热编码相同。

您可以检查这个片段看到了区别:

import numpy as np 
from sklearn.neural_network import MLPClassifier 
import pandas as pd 
noinputs=10 
nosamples=300 

for noclasses in range(2,4): 
    X_train=np.random.rand(nosamples,noinputs) 

    Y_train=np.random.random_integers(0,noclasses-1,(nosamples)) 
    Y_train_onehot=pd.get_dummies(Y_train) 

    clf_vector=MLPClassifier(hidden_layer_sizes=[],max_iter=2)  
    clf_onehot=MLPClassifier(hidden_layer_sizes=[],max_iter=2)  

    clf_vector.fit(X_train, Y_train) 
    clf_onehot.fit(X_train, Y_train_onehot) 
    print("Number of classes: "+str(noclasses)) 
    print("Vector labels: Shape of weight matrix: "+str(np.array(clf_vector.coefs_).shape)) 
    print("One-hot encoded labels: Shape of weight matrix: "+str(np.array(clf_onehot.coefs_).shape)) 
    print("")