#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.