scikit-learn中二元分类的权重维度和偏差

时间:2017-10-02 12:35:37

标签: python scikit-learn neural-network

我们在sklearn.neural_network中使用MLPClassifier,并对分类器生成的偏差和权重进行一些分析。

当我们有二进制数据时会出现问题,即只允许两个值。然后看起来最后一层的尺寸是1而不是2。 在其他情况下,偏差和重量的形状似乎总是与输出值的数量相匹配。

binary_classifier= MLPClassifier().fit(np.matrix([[0.], [1.]]), np.array([0,1]))
other_classifier = MLPClassifier().fit(np.matrix([[0.], [1.], [2]]), np.array([0,1,2]))

# Note that the dimension below is 1
print(binary_classifier.intercepts_[-1].shape, binary_classifier.coefs_[-1].shape)
# Note that the dimension below is 3
print(other_classifier.intercepts_[-1].shape, other_classifier.coefs_[-1].shape)

输出:

(1,) (100, 1)
(3,) (100, 3)

从数学上讲,你可以做到这一点,我认为这是一个优化,但我们失去了普遍性。 有没有一种简单的方法来阻止scikit这样做?我们如何以其他方式转换权重和偏差,使其尺寸与数值相匹配?

1 个答案:

答案 0 :(得分:1)

神经网络的类标签需要一个热编码,这发生在MLPClassifier的引擎盖下。如果您明确传入一个热编码目标,那么您将获得所需的输出:

#Now one hot encoded
binary_classifier= MLPClassifier().fit(np.matrix([[0.], [1.]]), np.array([[1, 0], [0, 1]]))
# NOT encoded
other_classifier = MLPClassifier().fit(np.matrix([[0.], [1.], [2]]), np.array([0,1,2]))

# Note that the dimension below is 2
print(binary_classifier.intercepts_[-1].shape, binary_classifier.coefs_[-1].shape)
# Note that the dimension below is 3
print(other_classifier.intercepts_[-1].shape, other_classifier.coefs_[-1].shape)

<强>输出继电器:

((2,), (100, 2))
((3,), (100, 3))

有关如何执行此预处理步骤的更多信息,请参阅scikit中的OneHotEncoder documentation