confusion_matrix() | ValueError: Classification metrics can't handle a mix of multiclass and multiclass-multioutput targets
confusion_matrix() | ValueError: Classification metrics can't handle a mix of multiclass and multiclass-multioutput targets
肯定有人问过,但我没有成功分析其他帖子的解决方案以解决我自己的这个问题。
我有很多分类模型,我想使用 confusion_matrix()
进行比较
matrix = confusion_matrix(y_test, y_pred) # ERROR
>>> y_pred
[[2 2 2 ... 2 2 2]
[2 2 2 ... 2 2 2]
[2 2 2 ... 2 2 2]
...
[3 3 2 ... 3 2 3]
[2 2 2 ... 2 2 2]
[3 3 3 ... 3 3 3]]
>>> y_pred.shape
(500, 256)
>>> y_test
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3]
>>> y_test.shape
(500, )
错误:
ValueError: Classification metrics can't handle a mix of multiclass and multiclass-multioutput targets
当对 y_pred
执行 .flatten()
- 即一维数组 (500 * 256 = 128000):
ValueError: Found input variables with inconsistent numbers of samples: [500, 128000]
混淆矩阵的工作原理是比较每个预测值和实际值。无法将 1
与 [2,2,2....2,2,2]
进行比较
在你的例子中,你的 y_pred 是 2d 而你的 y_test 是 1d,这就是实际错误的来源。我相信您必须选择预测列表中最常见的数字。喜欢来自 [2,2,2....2,2]
的 2
所以这里是解决方案:
from scipy import stats
import numpy as np
#taking the most frequent element from the predicted list
y_pred_list = [int(stats.mode(arr)[0]) for arr in y_pred.tolist()] #convert to list
y_pred_array = np.array(y_pred_list) #convert to 1D with same shape of y_test
print(y_pred_array.shape)
print(y_pred_array)
matrix = confusion_matrix(y_test, y_pred_array)
肯定有人问过,但我没有成功分析其他帖子的解决方案以解决我自己的这个问题。
我有很多分类模型,我想使用 confusion_matrix()
matrix = confusion_matrix(y_test, y_pred) # ERROR
>>> y_pred
[[2 2 2 ... 2 2 2]
[2 2 2 ... 2 2 2]
[2 2 2 ... 2 2 2]
...
[3 3 2 ... 3 2 3]
[2 2 2 ... 2 2 2]
[3 3 3 ... 3 3 3]]
>>> y_pred.shape
(500, 256)
>>> y_test
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3]
>>> y_test.shape
(500, )
错误:
ValueError: Classification metrics can't handle a mix of multiclass and multiclass-multioutput targets
当对 y_pred
执行 .flatten()
- 即一维数组 (500 * 256 = 128000):
ValueError: Found input variables with inconsistent numbers of samples: [500, 128000]
混淆矩阵的工作原理是比较每个预测值和实际值。无法将 1
与 [2,2,2....2,2,2]
在你的例子中,你的 y_pred 是 2d 而你的 y_test 是 1d,这就是实际错误的来源。我相信您必须选择预测列表中最常见的数字。喜欢来自 [2,2,2....2,2]
2
所以这里是解决方案:
from scipy import stats
import numpy as np
#taking the most frequent element from the predicted list
y_pred_list = [int(stats.mode(arr)[0]) for arr in y_pred.tolist()] #convert to list
y_pred_array = np.array(y_pred_list) #convert to 1D with same shape of y_test
print(y_pred_array.shape)
print(y_pred_array)
matrix = confusion_matrix(y_test, y_pred_array)