Làm thế nào tôi có thể giải thích ma trận nhầm lẫn Sklearn


24

Tôi đang sử dụng ma trận nhầm lẫn để kiểm tra hiệu suất của phân loại của tôi.

Tôi đang sử dụng Scikit-Learn, tôi hơi bối rối. Làm thế nào tôi có thể giải thích kết quả từ

from sklearn.metrics import confusion_matrix
>>> y_true = [2, 0, 2, 2, 0, 1]
>>> y_pred = [0, 0, 2, 2, 0, 2]
>>> confusion_matrix(y_true, y_pred)
array([[2, 0, 0],
       [0, 0, 1],
       [1, 0, 2]])

Làm thế nào tôi có thể đưa ra quyết định cho dù giá trị dự đoán này là tốt hay không.


1
Ban đầu hãy quên sklearn, đó là cá trích đỏ. Nguồn gốc của sự hiểu lầm của bạn có vẻ cơ bản hơn. Có một cái nhìn ở đây: en.wikipedia.org/wiki/Confusion_matrix . Tập trung vào tường thuật của ví dụ 3 * 3 trên trang wikipedia. Điều đó rất có thể sẽ giải quyết bất cứ điều gì nhầm lẫn của bạn.
Zhubarb

Câu trả lời:


47

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:

  1. 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.
  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.
  3. Tổng số phân loại cho mỗi lớp trong cả hai y_truey_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()

4
Chào mừng đến với trang web của chúng tôi! Tôi đánh giá cao sự chăm sóc và chất lượng mà bạn đã đưa vào câu trả lời đầu tiên của bạn ở đây.
whuber

1
Ví dụ đầu tiên không còn hoạt động, ít nhất là của pandas-0.13.1. Tôi vừa nâng cấp lên pandas-0.16.0 và vẫn gặp lỗi tương tự:AssertionError: arrays and names must have the same length
chbrown

1
@chbrown: có vẻ như có gì đó đã thay đổi trong gấu trúc cần ngồi thành một mảng hoặc một chuỗi. Tôi đã cập nhật mã ví dụ để sử dụng y_pred = pd.Series(...). Điều này nên làm việc bây giờ.
achennu

5

Trên ma trận nhầm lẫn trục y có các giá trị thực và trên trục x các giá trị được đưa ra bởi bộ dự đoán. Do đó, số đếm trên đường chéo là số lượng dự đoán chính xác. Và các yếu tố của đường chéo là dự đoán không chính xác.

Trong trường hợp của bạn:

>>> confusion_matrix(y_true, y_pred)
    array([[2, 0, 0],  # two zeros were predicted as zeros
           [0, 0, 1],  # one 1 was predicted as 2
           [1, 0, 2]]) # two 2s were predicted as 2, and one 2 was 0

Hơi khó hiểu một chút (Bạn nói "# 1 1 được dự đoán là 2" - trong khi theo đường chéo là 0), tôi có một ma trận gồm 50 phần tử, hơi khó để chiếu tất cả các giá trị. Có bất kỳ số liệu để cung cấp cho tôi những kết quả trực tiếp? (Ý tôi là nếu tôi nhận được ma trận nhầm lẫn tốt hay không).
dùng3378649

1
Bạn có thể nhìn vào các yếu tố trên đường chéo, đó là những dự đoán chính xác của bạn, các yếu tố ngoài đường chéo là những dự đoán sai. Đó là một sự khởi đầu.
Akavall

Tôi nhận được hai kết quả khác nhau. Trong mục tiêu, chúng tôi có hai nhãn '0' hoặc '1', Bạn có thể giúp đưa ra gợi ý về cách xen kẽ các kết quả đó. - nhầm lẫn_matrix: [[0 85723] [0 77]] - nhầm lẫn_matrix: [[85648 75] [75 2]]
dùng3378649

1

Tôi muốn chỉ định đồ họa sự cần thiết phải hiểu điều này. Đó là một ma trận đơn giản cần được hiểu rõ trước khi đưa ra kết luận. Vì vậy, đây là một phiên bản đơn giản có thể giải thích của các câu trả lời ở trên.

        0  1  2   <- Predicted
     0 [2, 0, 0]  
TRUE 1 [0, 0, 1]  
     2 [1, 0, 2] 

# At 0,0: True value was 0, Predicted value was 0, - 2 times predicted
# At 1,1: True value was 1, Predicted value was 1, - 0 times predicted
# At 2,2: True value was 2, Predicted value was 2, - 2 times predicted
# At 1,2: True value was 1, Predicted value was 2, - 1 time predicted
# At 2,0: True value was 2, Predicted value was 0, - 1 time predicted...
...Like that

4
Bạn có thể chỉnh sửa điều này để nói bạn nghĩ nó vượt xa câu trả lời đã đưa ra như thế nào không?
mdewey

1
Chào! Tôi vừa nhắc đến câu trả lời của Akavall. Ông đã đề cập đến những suy nghĩ liên quan. Tôi vừa giải thích câu trả lời của anh ấy, có xu hướng là chính xác, theo cách tốt hơn có lẽ.
Pranzell

@Pranzell Bạn có thể vui lòng chia sẻ mã của mình để vẽ một bảng dựa trên văn bản đẹp như vậy không?
fu DL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.