Melalui model pelatihan, saya mendapat peringatan seperti ini
Saya dapat memicunya lebih spesifik dengan panggilan seperti ini
from evalml.objectives import F1
f1 = F1()
f1.score(y_predicted=[0, 0],
y_true=[0, 1])
Dari segi cara penanganan. Inilah yang terlintas dalam pikiran
nan
atau kemungkinan skor terburuk untuk metrik. mungkin kami kemudian menyimpan pesan kesalahan di suatu tempat di kamus hasilYa, kita harus memperbaiki ini. Secara umum, kita tidak boleh mengizinkan apa pun untuk dicetak ke stdout kecuali kode kita melakukannya.
Saya ingin tahu apakah ini terkait dengan #311.
Saya pikir kita harus melakukan kedua saran Anda: tekan output stdout sklearn ini, dan juga tulis pesan peringatan kita sendiri jika memungkinkan.
@christopherbunn RE Anda menyebutkan ini dalam rapat, haruskah ini ditandai sebagai Sedang Berlangsung?
@christopherbunn @jeremyliweishih Saya membaca lebih banyak tentang ini , dan saya ingin perbaikan di sini adalah dengan menetapkan zero_division=0.0
untuk semua presisi dan tujuan f1 kami (biner dan multikelas).
Penjelasan
Presisi adalah n_true_pos / (n_true_pos + n_false_pos)
. Jadi jika model tidak pernah memprediksi label tertentu sama sekali pada pemisahan data yang bersangkutan, tidak akan ada positif benar atau salah untuk label itu, dan oleh karena itu akan ada pembagian dengan 0. Hal yang sama berlaku untuk f1.
Argumen
Mari kita asumsikan kita melakukan pekerjaan yang baik untuk menyeimbangkan kelas kita (yang saat ini tidak kita lakukan, tetapi merupakan topik terpisah, #194 #457 ). Jika demikian, sangat kecil kemungkinan bahwa pemisahan pelatihan atau validasi akan berisi beberapa instance dari kelas tertentu. Dan jika kita dapat berasumsi bahwa, dan model masih tidak membuat prediksi untuk label tertentu, saya berpendapat itu adalah model yang buruk, dan oleh karena itu kita harus memberikan skor serendah mungkin, yang untuk presisi dan f1 adalah 0.
Kedengarannya bagus?
Contoh
In [38]: import numpy as np
In [39]: import sklearn.metrics
In [40]: y_true = np.array([0, 0, 0, 0, 1])
In [41]: y_pred = np.array([0, 0, 0, 0, 0])
In [42]: sklearn.metrics.precision_score(y_true, y_pred)
/Users/dylan.sherry/.pyenv/versions/3.8.2/envs/evalml/lib/python3.8/site-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
Out[42]: 0.0
In [43]: sklearn.metrics.precision_score(y_true, y_pred, zero_division=0.0)
Out[43]: 0.0
@dsherry masuk akal bagi saya. Saya pikir itulah yang kami lakukan sekarang tetapi juga dengan peringatan (karena defaultnya adalah "peringatan" yang disetel ke 0 dan juga memposting peringatan)
@jeremyliweishih ya!
Meraih ini dari @christopherbunn sehingga kita bisa menggabungkannya minggu ini saat dia bertarung dengan finalnya :)