sklearn.neural_networks.MLPRegressor — не удается вычислить показатель точности

#python #scikit-learn #mlp

#python #scikit-учиться #mlp

Вопрос:

Это мой первый пост о StackOverflow! Я использую MLPRegressor для генерации прогноза многовыхода двоичного класса для моей проблемы. Как только я получаю свой прогноз, я округляю все значения, используя numpy.round() , чтобы я мог использовать accuracy_score (поскольку оценка точности работает только для задач классификации). После этого я пытаюсь использовать sklearn.metrics.accuracy_score , когда получаю следующую ошибку:

 ValueError: Classification metrics can't handle a mix of multilabel-indicator and multiclass-multioutput targets
  

Эта ошибка возникает только тогда, когда я вручную задаю аргумент max_iter ключевого слова в MLPRegressor . Когда я не устанавливаю его вручную, регрессор не сходится, но ошибка не возникает.

 from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np
from joblib import dump, load
data = np.loadtxt('tictac_multi.txt')
X = data[:,:9]
y = data[:,9:]
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.20,random_state=7)
regr = MLPRegressor(random_state=7,hidden_layer_sizes=(9,81,729,81,81,9),activation='tanh',learning_rate='invscaling',solver='adam',max_iter = 400).fit(X_train, y_train)
preds = regr.predict(X_test)
preds = np.round(preds)
print(accuracy_score(y_test,preds))
  

Вот ссылка на набор данных: http://www.connellybarnes.com/work/class/2016/deep_learning_graphics/proj1/tictac_multi.txt

Трассировка стека:

 Traceback (most recent call last):
  File "mlp.py", line 21, in <module>
    scores.append(accuracy_score(y_test,preds))
  File "C:UsersanimuAppDataLocalProgramsPythonPython37libsite-packagessklearnutilsvalidation.py", line 73, in inner_f
    return f(**kwargs)
  File "C:UsersanimuAppDataLocalProgramsPythonPython37libsite-packagessklearnmetrics_classification.py", line 187, in accuracy_score
    y_type, y_true, y_pred = _check_targets(y_true, y_pred)
  File "C:UsersanimuAppDataLocalProgramsPythonPython37libsite-packagessklearnmetrics_classification.py", line 91, in _check_targets
    "and {1} targets".format(type_true, type_pred))
ValueError: Classification metrics can't handle a mix of multilabel-indicator and multiclass-multioutput targets
  

Ответ №1:

Как указано в сообщении об ошибке, это происходит потому, что

Метрики классификации не могут обрабатывать сочетание целей с несколькими метками-индикаторами и многоклассовыми целями с несколькими выводами

Это означает, что accuracy_score() это может работать в случае с несколькими метками, таком как ваш, но не в том случае, если метки классов не являются двоичными.

Вы заявляете, что у вас есть предсказание многовыхода двоичного класса, но в ваших прогнозах preds[89] содержится значение 2 , помимо двоичного вывода 0 и 1

 preds[89]
  

ВОЗВРАТ

 array([ 0., -0., -0., -0.,  1.,  2., -0., -0., -0.])
  

Другие записи, кроме 89 в вашем массиве прогнозов, со значениями, которые не являются двоичными, можно найти в:

  • preds[139]
  • preds[501]
  • preds[503]
  • preds[770]
  • preds[1039]
  • preds[1107]

Итак, теперь вы должны убедиться, что эти записи (все они имеют значение 2 ) превращены в двоичную метку ( 0 или 1 ) для accuracy_score() работы.

Возможное решение:

Вы можете заменить все вхождения целевого значения 2 значением 1 :

 for outer_index in range(preds.shape[0]):
  for index in range(preds[outer_index].shape[0]):
    if(np.abs(preds[outer_index][index]) != 0 and np.abs(preds[outer_index][index]) != 1):
      preds[outer_index][index]=1
  

Затем вы можете вызвать свой accuracy_score() метод:

 print(accuracy_score(y_test,preds))
  

который возвращает

 0.8367658276125095
  

Комментарии:

1. Я рад. Было бы неплохо, если бы вы поставили галочку напротив моего ответа — так вы можете принять ответ, который помог вам решить вашу проблему в Stackoverflow.