UndefinedMetricWarning: F-score sakit-didefinisikan dan ditetapkan untuk 0.0 di label dengan tidak diprediksi sampel

I'm semakin aneh ini kesalahan:

classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.
'precision', 'predicted', average, warn_for)`

tapi kemudian itu juga mencetak f-skor yang pertama kali saya jalankan:

metrics.f1_score(y_test, y_pred, average='weighted')

Kedua kalinya saya jalankan, memberikan skor tanpa kesalahan. Mengapa demikian?

>>> y_pred = test.predict(X_test)
>>> y_test
array([ 1, 10, 35,  9,  7, 29, 26,  3,  8, 23, 39, 11, 20,  2,  5, 23, 28,
       30, 32, 18,  5, 34,  4, 25, 12, 24, 13, 21, 38, 19, 33, 33, 16, 20,
       18, 27, 39, 20, 37, 17, 31, 29, 36,  7,  6, 24, 37, 22, 30,  0, 22,
       11, 35, 30, 31, 14, 32, 21, 34, 38,  5, 11, 10,  6,  1, 14, 12, 36,
       25,  8, 30,  3, 12,  7,  4, 10, 15, 12, 34, 25, 26, 29, 14, 37, 23,
       12, 19, 19,  3,  2, 31, 30, 11,  2, 24, 19, 27, 22, 13,  6, 18, 20,
        6, 34, 33,  2, 37, 17, 30, 24,  2, 36,  9, 36, 19, 33, 35,  0,  4,
        1])
>>> y_pred
array([ 1, 10, 35,  7,  7, 29, 26,  3,  8, 23, 39, 11, 20,  4,  5, 23, 28,
       30, 32, 18,  5, 39,  4, 25,  0, 24, 13, 21, 38, 19, 33, 33, 16, 20,
       18, 27, 39, 20, 37, 17, 31, 29, 36,  7,  6, 24, 37, 22, 30,  0, 22,
       11, 35, 30, 31, 14, 32, 21, 34, 38,  5, 11, 10,  6,  1, 14, 30, 36,
       25,  8, 30,  3, 12,  7,  4, 10, 15, 12,  4, 22, 26, 29, 14, 37, 23,
       12, 19, 19,  3, 25, 31, 30, 11, 25, 24, 19, 27, 22, 13,  6, 18, 20,
        6, 39, 33,  9, 37, 17, 30, 24,  9, 36, 39, 36, 19, 33, 35,  0,  4,
        1])
>>> metrics.f1_score(y_test, y_pred, average='weighted')
C:\Users\Michael\Miniconda3\envs\snowflakes\lib\site-packages\sklearn\metrics\classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.
  'precision', 'predicted', average, warn_for)
0.87282051282051276
>>> metrics.f1_score(y_test, y_pred, average='weighted')
0.87282051282051276
>>> metrics.f1_score(y_test, y_pred, average='weighted')
0.87282051282051276

Juga, mengapa ada akhiran 'presisi', 'prediksi', rata-rata, warn_for) pesan error? Tidak ada kurung buka jadi mengapa itu berakhir dengan penutupan kurung? Saya menjalankan sklearn 0.18.1 menggunakan Python 3.6.0 di conda lingkungan pada Windows 10.

Saya juga melihat di sini dan saya don't tahu apakah itu's bug yang sama. Ini JADI post]2 doesn't memiliki solusi yang baik.

Mengomentari pertanyaan (2)
Larutan

Seperti yang disebutkan di komentar, beberapa label di y_true don't muncul di y_pred. Khusus dalam hal ini, label '2' ini tidak pernah diprediksi:

>>> set(y_test) - set(y_pred)
{2}

Ini berarti bahwa ada tidak ada F-score untuk menghitung untuk label ini, dan dengan demikian F-skor untuk kasus ini dianggap 0.0. Karena anda diminta rata-rata skor, anda harus memperhitungkan bahwa skor 0 disertakan dalam perhitungan, dan ini adalah mengapa scikit-belajar menunjukkan pada anda bahwa peringatan.

Hal ini membawa saya untuk anda tidak melihat kesalahan yang kedua kalinya. Seperti yang saya sebutkan, ini adalah peringatan, yang diperlakukan berbeda dari kesalahan dalam python. Perilaku default di sebagian besar lingkungan adalah untuk menunjukkan peringatan tertentu hanya sekali. Perilaku ini dapat diubah:

import warnings
warnings.filterwarnings('always')  # "error", "ignore", "always", "default", "module" or "once"

Jika anda mengatur ini sebelum mengimpor modul lainnya, anda akan melihat peringatan setiap kali anda menjalankan kode.

Tidak ada cara untuk menghindari melihat peringatan ini pertama kalinya, selain untuk pengaturan peringatan.filterwarnings('mengabaikan'). Apa anda bisa lakukan adalah memutuskan bahwa anda tidak tertarik pada nilai dari label yang tidak diprediksi, dan kemudian secara eksplisit menentukan label anda adalah tertarik (yang adalah label yang diprediksi setidaknya sekali):

>>> metrics.f1_score(y_test, y_pred, average='weighted', labels=np.unique(y_pred))
0.91076923076923078

Peringatan ini tidak ditunjukkan dalam kasus ini.

Komentar (5)

Sebagai alternatif, anda bisa menggunakan baris kode berikut:

from sklearn.metrics import f1_score
metrics.f1_score(y_test, y_pred, labels=np.unique(y_pred))

Ini harus menghapus peringatan anda dan memberikan anda hasil yang anda inginkan

Komentar (0)

Jawaban yang diterima sudah menjelaskan dengan baik mengapa peringatan terjadi. Jika anda hanya ingin mengontrol peringatan, yang bisa digunakan precision_recall_fscore_support. Ia menawarkan (setengah resmi) argumen warn_for yang dapat digunakan untuk mematikan peringatan.

(_, _, f1, _) = metrics.precision_recall_fscore_support(y_test, y_pred,
                                                        average='weighted', 
                                                        warn_for=tuple())

Seperti yang sudah disebutkan dalam beberapa komentar, gunakan dengan hati-hati.

Komentar (0)

Seperti pesan kesalahan yang menyatakan, metode yang digunakan untuk mendapatkan F skor lebih dari "Klasifikasi" bagian dari sklearn - dengan demikian berbicara tentang "label".

Apakah anda memiliki masalah regresi? Sklearn menyediakan "F skor" metode regresi di bawah "pilihan fitur" kelompok: http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html

Dalam kasus anda memiliki masalah klasifikasi, @Shovalt's jawaban tampaknya benar untuk saya.

Komentar (1)