如何在 Scikit 中计算多类分类的混淆矩阵?
How compute confusion matrix for multiclass classification in Scikit?
我有一个多类分类任务。当我运行我的脚本基于scikit example如下:
classifier = OneVsRestClassifier(GradientBoostingClassifier(n_estimators=70, max_depth=3, learning_rate=.02))
y_pred = classifier.fit(X_train, y_train).predict(X_test)
cnf_matrix = confusion_matrix(y_test, y_pred)
我收到这个错误:
File "C:\ProgramData\Anaconda2\lib\site-packages\sklearn\metrics\classification.py", line 242, in confusion_matrix
raise ValueError("%s is not supported" % y_type)
ValueError: multilabel-indicator is not supported
我试图将 labels=classifier.classes_
传递给 confusion_matrix()
,但没有用。
y_test和y_pred如下:
y_test =
array([[0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 0, 0],
...,
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 1, 0]])
y_pred =
array([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
...,
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0]])
首先您需要创建标签输出数组。
假设您有 3 类: 'cat', 'dog', 'house' 索引:0,1,2 。
2 个样本的预测为:'dog'、'house'。
您的输出将是:
y_pred = [[0, 1, 0],[0, 0, 1]]
运行 y_pred.argmax(1) 得到:[1,2]
这个数组代表原始标签索引,意思是:
['dog', 'house']
num_classes = 3
# from lable to categorial
y_prediction = np.array([1,2])
y_categorial = np_utils.to_categorical(y_prediction, num_classes)
# from categorial to lable indexing
y_pred = y_categorial.argmax(1)
这对我有用:
y_test_non_category = [ np.argmax(t) for t in y_test ]
y_predict_non_category = [ np.argmax(t) for t in y_predict ]
from sklearn.metrics import confusion_matrix
conf_mat = confusion_matrix(y_test_non_category, y_predict_non_category)
其中 y_test
和 y_predict
是分类变量,如单热向量。
我只是从预测 y_pred
矩阵中减去输出 y_test
矩阵,同时保持分类格式。在 -1
的情况下,我假设为假阴性,而在 1
的情况下,我假设为假阳性。
下一个:
if output_matrix[i,j] == 1 and predictions_matrix[i,j] == 1:
produced_matrix[i,j] = 2
以下列符号结束:
- -1:假阴性
- 1:误报
- 0:真阴性
- 2:真阳性
最后,执行一些简单的计数,您可以生成任何混淆指标。
我有一个多类分类任务。当我运行我的脚本基于scikit example如下:
classifier = OneVsRestClassifier(GradientBoostingClassifier(n_estimators=70, max_depth=3, learning_rate=.02))
y_pred = classifier.fit(X_train, y_train).predict(X_test)
cnf_matrix = confusion_matrix(y_test, y_pred)
我收到这个错误:
File "C:\ProgramData\Anaconda2\lib\site-packages\sklearn\metrics\classification.py", line 242, in confusion_matrix
raise ValueError("%s is not supported" % y_type)
ValueError: multilabel-indicator is not supported
我试图将 labels=classifier.classes_
传递给 confusion_matrix()
,但没有用。
y_test和y_pred如下:
y_test =
array([[0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 0, 0],
...,
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 1, 0]])
y_pred =
array([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
...,
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0]])
首先您需要创建标签输出数组。 假设您有 3 类: 'cat', 'dog', 'house' 索引:0,1,2 。 2 个样本的预测为:'dog'、'house'。 您的输出将是:
y_pred = [[0, 1, 0],[0, 0, 1]]
运行 y_pred.argmax(1) 得到:[1,2] 这个数组代表原始标签索引,意思是: ['dog', 'house']
num_classes = 3
# from lable to categorial
y_prediction = np.array([1,2])
y_categorial = np_utils.to_categorical(y_prediction, num_classes)
# from categorial to lable indexing
y_pred = y_categorial.argmax(1)
这对我有用:
y_test_non_category = [ np.argmax(t) for t in y_test ]
y_predict_non_category = [ np.argmax(t) for t in y_predict ]
from sklearn.metrics import confusion_matrix
conf_mat = confusion_matrix(y_test_non_category, y_predict_non_category)
其中 y_test
和 y_predict
是分类变量,如单热向量。
我只是从预测 y_pred
矩阵中减去输出 y_test
矩阵,同时保持分类格式。在 -1
的情况下,我假设为假阴性,而在 1
的情况下,我假设为假阳性。
下一个:
if output_matrix[i,j] == 1 and predictions_matrix[i,j] == 1:
produced_matrix[i,j] = 2
以下列符号结束:
- -1:假阴性
- 1:误报
- 0:真阴性
- 2:真阳性
最后,执行一些简单的计数,您可以生成任何混淆指标。