sklearn.neural_networks.MLPRegressor - 无法计算准确度分数

sklearn.neural_networks.MLPRegressor - unable to calculate accuracy score

这是我在 Whosebug 上的第一个 post!我正在使用 MLPRegressor 为我的问题生成二进制 class 多输出预测。得到预测后,我使用 numpy.round() 对所有值进行四舍五入,这样我就可以使用 accuracy_score(因为准确度分数仅适用于 class 化问题)。在此之后,当出现以下错误时,我尝试使用 sklearn.metrics.accuracy_score

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

此错误仅在我手动设置 MLPRegressor 中的 max_iter 关键字参数时发生。当我不手动设置时,回归器不收敛但不出现错误。

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))

这是数据集的 link: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:\Users\animu\AppData\Local\Programs\Python\Python37\lib\site-packages\sklearn\utils\validation.py", line 73, in inner_f
    return f(**kwargs)
  File "C:\Users\animu\AppData\Local\Programs\Python\Python37\lib\site-packages\sklearn\metrics\_classification.py", line 187, in accuracy_score
    y_type, y_true, y_pred = _check_targets(y_true, y_pred)
  File "C:\Users\animu\AppData\Local\Programs\Python\Python37\lib\site-packages\sklearn\metrics\_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

如错误消息所述,发生这种情况是因为

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

这意味着 accuracy_score() 可以在像您这样的多标签情况下工作,但如果 class 标签不是二进制的则不行。

你说的是,你有一个二进制 class 多输出预测,但在你的预测中,preds[89] 包含值 2,除了 [=] 的二进制输出18=] 和 1

preds[89]

returns

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

您的预测数组中除 89 之外的其他条目,其值不是二进制的,可以在以下位置找到:

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

所以您现在必须确保,这些条目(所有条目的值都为 2)按顺序转换为二进制标签(01accuracy_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))

哪个returns

0.8367658276125095