sklearn.neural_networks.MLPRegressor-无法计算准确性得分

问题描述

这是我关于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,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:\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

解决方法

错误消息指出,这是因为

分类指标无法处理multilabel-indicator和 多类多输出目标

这意味着accuracy_score()可以在多标签的情况下(例如您的情况)使用,但是如果类标签不是二进制的则不能。

您要说明的是,您具有二进制类多输出预测,但是在预测中,preds[89]除了2和{{的二进制输出之外,还包含值0。 1}}

1

返回

preds[89]

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

  • array([ 0.,-0.,1.,2.,-0.])
  • preds[139]
  • preds[501]
  • preds[503]
  • preds[770]
  • preds[1039]

因此,您现在必须确保将这些条目(所有条目的值均为preds[1107])转换为二进制标签(20),以使{ {1}}上班。

可能的解决方案:

您可以将所有出现的目标值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()

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...