Matriks kebingungan adalah cara mentabulasi jumlah kesalahan klasifikasi, yaitu, jumlah kelas prediksi yang berakhir di nampan klasifikasi yang salah berdasarkan kelas yang benar.
Sementara sklearn.metrics.confusion_matrix menyediakan matriks numerik, saya merasa lebih berguna untuk menghasilkan 'laporan' menggunakan yang berikut:
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)
yang mengakibatkan:
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
Ini memungkinkan kita untuk melihat bahwa:
- Elemen diagonal menunjukkan jumlah klasifikasi yang benar untuk masing-masing kelas: 3, 1 dan 3 untuk kelas 0, 1 dan 2.
- Elemen off-diagonal memberikan kesalahan klasifikasi: misalnya, 2 dari kelas 2 salah diklasifikasikan sebagai 0, tidak ada kelas 0 yang salah diklasifikasikan sebagai 2, dll.
- Jumlah total klasifikasi untuk setiap kelas di kedua
y_true
dan y_pred
, dari subtotal "Semua"
Metode ini juga berfungsi untuk label teks, dan untuk sejumlah besar sampel dalam dataset dapat diperluas untuk memberikan laporan persentase.
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())
Outputnya adalah:
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
di mana angka sekarang mewakili persentase (bukan jumlah kasus) dari hasil yang diklasifikasikan.
Meskipun perlu dicatat, bahwa sklearn.metrics.confusion_matrix
output dapat langsung divisualisasikan menggunakan:
import matplotlib.pyplot as plt
conf = sklearn.metrics.confusion_matrix(y_true, y_pred)
plt.imshow(conf, cmap='binary', interpolation='None')
plt.show()