множественный выходной прогноз от sklearn sgd classifer? - PullRequest
0 голосов
/ 03 октября 2018

Я создал модель Scikit, которая похожа на эту.Но теперь я хочу извлечь два вывода.Я не знаю, как пройти это во время тренировки.Я пробовал подобное керасу.[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 голосов
/ 03 октября 2018

Прежде всего, ваша цель [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 , ваша зависимая переменная y должнаиметь один столбец:

fit (X, y, coef_init = Нет, intercept_init = Нет, sample_weight = Нет)

y: пустой массив, форма (n_samples,)

Целевые значения

Возможно, то, что вы ищете, является scikit-learn's MultiOuputClassifier для многопользовательской классификации :

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)

Просто держите впомните, что предметный классификатор не делает ничего более сложного, чем подгонка одного классификатора на один целевой выход;из документов снова:

Многоцелевая классификация

Эта стратегия состоит в подборе одного классификатора для каждой цели.Это простая стратегия для расширения классификаторов, которые изначально не поддерживают многоцелевую классификацию

0 голосов
/ 03 октября 2018

(Отказ от ответственности: мой ML немного ржавый, но у меня такое ощущение, что я знаю, что вы ищете, и это было слишком долго, чтобы быть комментарием)

Theнеправильная форма, которую вы передаете clf.fit.

Сначала вы передаете X, и это нормально, это массив с массивами внутри, и каждый из этих внутренних массивов содержит значения для объектов (верно?).

Теперь, второй передаваемый вами аргумент - это массив, образованный из Y и Z.

Если мы посмотрим на документацию для соответствия, мы можем видеть, что функция подгонки ожидает 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] ]

Используя tего массив YZ, например, при запуске clf.predict([-1, -1]) следующий вывод:

clf.predict([-1, -1])
output: [1,1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...