เมทริกซ์ความสับสนเป็นวิธีการจัดตารางจำนวนการแบ่งประเภทเช่นจำนวนคลาสที่คาดการณ์ซึ่งสิ้นสุดลงในถังจัดประเภทที่ไม่ถูกต้องตามคลาสที่แท้จริง
ในขณะที่ 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
สิ่งนี้ทำให้เราเห็นว่า:
- องค์ประกอบเส้นทแยงมุมแสดงจำนวนการจำแนกประเภทที่ถูกต้องสำหรับแต่ละคลาส: 3, 1 และ 3 สำหรับคลาส 0, 1 และ 2
- องค์ประกอบนอกแนวทแยงให้การจำแนกประเภทผิดพลาด: ตัวอย่าง 2 จากคลาส 2 ถูกจำแนกเป็น 0 ไม่มีคลาส 0 ใด ๆ ถูกจำแนกเป็น 2 และอื่น ๆ
- จำนวนการจำแนกประเภททั้งหมดสำหรับแต่ละคลาสในทั้งสอง
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()