Ma trận nhầm lẫn là một cách lập bảng số lượng phân loại sai, nghĩa là số lượng các lớp dự đoán kết thúc trong một thùng phân loại sai dựa trên các lớp thực.
Trong khi sklearn.metrics.confusion_matrix cung cấp một ma trận số, tôi thấy hữu ích hơn khi tạo một 'báo cáo' bằng cách sử dụng như sau:
import pandas as pd
y_true = pd.Series([2, 0, 2, 2, 0, 1, 1, 2, 2, 0, 1, 2])
y_pred = pd.Series([0, 0, 2, 1, 0, 2, 1, 0, 2, 0, 2, 2])
pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)
kết quả là:
Predicted 0 1 2 All
True
0 3 0 0 3
1 0 1 2 3
2 2 1 3 6
All 5 2 5 12
Điều này cho phép chúng ta thấy rằng:
- Các phần tử đường chéo hiển thị số lượng phân loại chính xác cho mỗi lớp: 3, 1 và 3 cho các lớp 0, 1 và 2.
- Các phần tử đường chéo cung cấp các phân loại sai: ví dụ: 2 của lớp 2 bị phân loại sai thành 0, không có lớp 0 nào bị phân loại sai thành 2, v.v.
- Tổng số phân loại cho mỗi lớp trong cả hai
y_true
và y_pred
, từ tổng phụ "Tất cả"
Phương pháp này cũng hoạt động đối với nhãn văn bản và đối với một số lượng lớn mẫu trong bộ dữ liệu có thể được mở rộng để cung cấp báo cáo tỷ lệ phần trăm.
import numpy as np
import pandas as pd
# create some data
lookup = {0: 'biscuit', 1:'candy', 2:'chocolate', 3:'praline', 4:'cake', 5:'shortbread'}
y_true = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])
y_pred = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])
pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted']).apply(lambda r: 100.0 * r/r.sum())
Đầu ra sau đó là:
Predicted biscuit cake candy chocolate praline shortbread
True
biscuit 23.529412 10 23.076923 13.333333 15.384615 9.090909
cake 17.647059 20 0.000000 26.666667 15.384615 18.181818
candy 11.764706 20 23.076923 13.333333 23.076923 31.818182
chocolate 11.764706 5 15.384615 6.666667 15.384615 13.636364
praline 17.647059 10 30.769231 20.000000 0.000000 13.636364
shortbread 17.647059 35 7.692308 20.000000 30.769231 13.636364
trong đó các con số hiện đại diện cho tỷ lệ phần trăm (chứ không phải số trường hợp) của các kết quả đã được phân loại.
Mặc dù lưu ý rằng sklearn.metrics.confusion_matrix
đầu ra có thể được hiển thị trực tiếp bằng cách sử dụng:
import matplotlib.pyplot as plt
conf = sklearn.metrics.confusion_matrix(y_true, y_pred)
plt.imshow(conf, cmap='binary', interpolation='None')
plt.show()