sklearn sgd分类器的多个输出预测?

时间:2018-10-03 13:35:10

标签: machine-learning scikit-learn classification gradient-descent

我确实创建了一个与此相似的scikit模型。但是现在我想提取两个输出。我不知道在训练时该如何通过。我确实尝试过类似Keras。 [y,z]作为列表。但是它在scikit中不起作用。有人尝试过吗?

import numpy as np
from sklearn import linear_model
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
Y = np.array([1, 1, 2, 2])
Z = np.array([1, 1, 2, 2])
clf = linear_model.SGDClassifier(max_iter=1000)
clf.fit(X, [Y, Z])

输出:

ValueError: bad input shape (2, 4)

2 个答案:

答案 0 :(得分:1)

首先,您的目标[Y, Z]不是您认为的:

[Y, Z]
# [array([1, 1, 2, 2]), array([1, 1, 2, 2])]

可以说,您想要的内容应该有四行,例如X,即

W = np.array([[1, 1], [1, 1], [2, 2], [2, 2]])
W
# result:
array([[1, 1],
       [1, 1],
       [2, 2],
       [2, 2]])

但是即使进行了此更改,您仍然会再次遇到类似的错误:

clf.fit(X, W)
[...]
ValueError: bad input shape (4, 2)

因为,正如SGDClassifier documentation中明确提到的那样,您的因变量y应该只有一列:

  

fit (X,y,coef_init =无,intercept_init =无,sample_weight =无)

     

y:numpy数组,形状(n_samples)

     

目标值

可以说,您正在寻找的是scikit-learn的MultiOuputClassifier for multioutput classification

from sklearn.multioutput import MultiOutputClassifier

sgd = linear_model.SGDClassifier(max_iter=1000)
multi_target_sgd = MultiOutputClassifier(sgd, n_jobs=-1)
multi_target_sgd.fit(X, W) 

fit现在可以正常工作,给出以下输出:

MultiOutputClassifier(estimator=SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1,
       eta0=0.0, fit_intercept=True, l1_ratio=0.15,
       learning_rate='optimal', loss='hinge', max_iter=1000, n_iter=None,
       n_jobs=1, penalty='l2', power_t=0.5, random_state=None,
       shuffle=True, tol=None, verbose=0, warm_start=False),
           n_jobs=-1)

请记住,主题分类器所做的工作并不比为每个目标输出安装一个分类器更复杂。再次从docs开始:

  

多目标分类

     

此策略包括为每个目标配备一个分类器。这是一个   扩展原生不支持的分类器的简单策略   多目标分类

答案 1 :(得分:0)

(免责声明:我的机器语言有点生疏,但我有一种感觉,我知道您要查找的内容,而且这个时间太长了,无法发表评论)

您传递给clf.fit的形状不正确。

首先,您要传递X,这很好,它是一个内部包含数组的数组,并且每个内部数组都包含要素的值(对吗?)。

现在,您要传递的第二个参数是由Y和Z组成的数组。

如果我们查看documentation for fit,我们可以看到fit函数期望Y的格式如下:

y : numpy array, shape (n_samples,)
Target values

这意味着它必须是包含这n个样本的单个数组。

我不确定您要与[Y, Z]匹配的内容是什么,因为您打电话给clf.predict时期望得到什么结果,但是我认为您没有形成目标数组正确。

也许您应该以Y = Y + Z的形式形成数组:

YZ = [ [1,1], [1,1], [2,2], [2,2] ]

使用此YZ数组,例如在运行clf.predict([-1, -1])时,将显示以下输出:

clf.predict([-1, -1])
output: [1,1]