ฉันจะตีความเมทริกซ์ความสับสนของ Sklearn ได้อย่างไร


24

ฉันใช้เมทริกซ์ความสับสนเพื่อตรวจสอบประสิทธิภาพของตัวจําแนกของฉัน

ฉันกำลังใช้ Scikit-Learn ฉันสับสนเล็กน้อย ฉันจะตีความผลลัพธ์ได้อย่างไร

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]])

ฉันจะตัดสินใจได้อย่างไรว่าค่าที่คาดการณ์นี้ดีหรือไม่


1
ตอนแรกลืมเกี่ยวกับ sklearn นั่นคือปลาเฮอริ่งแดง แหล่งที่มาของความเข้าใจผิดของคุณดูเหมือนพื้นฐานมากขึ้น มีรูปลักษณ์ที่นี่: en.wikipedia.org/wiki/Confusion_matrix มุ่งเน้นไปที่การเล่าเรื่องของตัวอย่าง 3 * 3 ในหน้าวิกิพีเดีย ซึ่งจะกล่าวได้ว่าสิ่งที่คุณสับสนคืออะไร
Zhubarb

หัวข้อที่เกี่ยวข้อง: stats.stackexchange.com/a/340079/121522
mkt - Reinstate Monica

คำตอบ:


47

เมทริกซ์ความสับสนเป็นวิธีการจัดตารางจำนวนการแบ่งประเภทเช่นจำนวนคลาสที่คาดการณ์ซึ่งสิ้นสุดลงในถังจัดประเภทที่ไม่ถูกต้องตามคลาสที่แท้จริง

ในขณะที่ sklearn.metrics.confusion_matrix ให้เมทริกซ์ที่เป็นตัวเลขฉันพบว่ามีประโยชน์มากกว่าในการสร้าง 'รายงาน' โดยใช้สิ่งต่อไปนี้

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)

ซึ่งผลลัพธ์ใน:

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

สิ่งนี้ทำให้เราเห็นว่า:

  1. องค์ประกอบเส้นทแยงมุมแสดงจำนวนการจำแนกประเภทที่ถูกต้องสำหรับแต่ละคลาส: 3, 1 และ 3 สำหรับคลาส 0, 1 และ 2
  2. องค์ประกอบนอกแนวทแยงให้การจำแนกประเภทผิดพลาด: ตัวอย่าง 2 จากคลาส 2 ถูกจำแนกเป็น 0 ไม่มีคลาส 0 ใด ๆ ถูกจำแนกเป็น 2 และอื่น ๆ
  3. จำนวนการจำแนกประเภททั้งหมดสำหรับแต่ละคลาสในทั้งสองy_trueและy_predจากผลรวมย่อย "All"

วิธีนี้ใช้ได้กับป้ายข้อความด้วยและสามารถขยายตัวอย่างจำนวนมากในชุดข้อมูลเพื่อจัดทำรายงานเปอร์เซ็นต์

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())

ผลลัพธ์ก็คือ:

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

โดยที่ตัวเลขแสดงถึงเปอร์เซ็นต์ (แทนที่จะเป็นจำนวนผู้ป่วย) ของผลลัพธ์ที่ถูกจัดประเภท

แม้ว่าจะสังเกตว่าsklearn.metrics.confusion_matrixผลลัพธ์ที่สามารถมองเห็นได้โดยตรงโดยใช้:

import matplotlib.pyplot as plt
conf = sklearn.metrics.confusion_matrix(y_true, y_pred)
plt.imshow(conf, cmap='binary', interpolation='None')
plt.show()

4
ยินดีต้อนรับสู่เว็บไซต์ของเรา! ฉันขอขอบคุณการดูแลและคุณภาพที่คุณได้รับคำตอบแรกจากที่นี่
whuber

1
ตัวอย่างแรกไม่สามารถใช้งานได้อีกอย่างน้อยเป็น pandas-0.13.1 ฉันเพิ่งอัพเกรดเป็น pandas-0.16.0 และยังคงได้รับข้อผิดพลาดเดียวกัน:AssertionError: arrays and names must have the same length
chbrown

1
@chbrown: ดูเหมือนว่ามีบางสิ่งเปลี่ยนแปลงในนุ่นที่ต้องมี sit เป็น array หรือ series y_pred = pd.Series(...)ผมได้ปรับปรุงโค้ดตัวอย่างที่จะใช้ ควรใช้งานได้แล้ว
achennu

5

ในเมทริกซ์ความสับสนแกน y มีค่าจริงและบนแกน x ค่าที่กำหนดโดยตัวทำนาย ดังนั้นการนับในแนวทแยงจึงมีจำนวนการทำนายที่ถูกต้อง และองค์ประกอบของเส้นทแยงมุมเป็นการทำนายที่ไม่ถูกต้อง

ในกรณีของคุณ:

>>> 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

มันค่อนข้างสับสนนิดหน่อย (คุณบอกว่า "# one 1 ถูกทำนายเป็น 2" - ในขณะที่ในแนวทแยงเป็น 0), ฉันมีเมทริกซ์ขององค์ประกอบ 50K มันยากที่จะคาดการณ์ค่าทั้งหมด มีตัวชี้วัดใดบ้างที่ให้ผลลัพธ์เหล่านี้กับฉันโดยตรง (ฉันหมายความว่าถ้าฉันได้รับความสับสนที่ดีหรือไม่)
user3378649

1
คุณสามารถดูองค์ประกอบต่าง ๆ ในแนวทแยงนั่นคือการทำนายที่ถูกต้องของคุณองค์ประกอบนอกแนวทแยงนั้นเป็นการคาดการณ์ที่ผิด นั่นเป็นการเริ่มต้น
Akavall

ฉันได้ผลลัพธ์ที่แตกต่างกันสองแบบ ในเป้าหมายเรามีสองป้ายกำกับ '0' หรือ '1' คุณสามารถช่วยบอกใบ้ถึงวิธีการแทรกแซงผลลัพธ์เหล่านั้นได้หรือไม่ - confusion_matrix: [[0 85723] [0 77]] - confusion_matrix: [[85648 75] [75 2]]
user3378649

1

ฉันต้องการระบุแบบกราฟิกที่จำเป็นต้องเข้าใจสิ่งนี้ มันเป็นเมทริกซ์ธรรมดาที่ต้องเข้าใจให้ดีก่อนถึงข้อสรุป ดังนั้นนี่คือคำตอบข้างต้นที่อธิบายได้ง่ายกว่า

        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
คุณสามารถแก้ไขสิ่งนี้เพื่อบอกว่าคุณคิดว่ามันเกินกว่าคำตอบที่ได้รับไปแล้วหรือไม่?
mdewey

1
เฮ้! ฉันเพิ่งจะพูดถึงคำตอบของ Akavall เขาได้พูดถึงความคิดที่เกี่ยวข้อง ฉันเพิ่งอธิบายคำตอบของเขาซึ่งมีแนวโน้มที่จะถูกต้องในทางที่ดีขึ้นอย่างน่าจะเป็น
Pranzell

@Pranzell คุณช่วยแบ่งปันรหัสของคุณเพื่อวาดตารางตามข้อความที่สวยงามได้ไหม?
fu DL
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.