Evalml: Menekan peringatan sklearn UndefinedMetric dari stdout (skor F1)

Dibuat pada 2 Mar 2020  ·  6Komentar  ·  Sumber: alteryx/evalml

Melalui model pelatihan, saya mendapat peringatan seperti ini

Screen Shot 2020-03-02 at 4 54 36 PM

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

  1. Benar-benar diam selama proses pencarian automl. ganti skor dengan nan atau kemungkinan skor terburuk untuk metrik. mungkin kami kemudian menyimpan pesan kesalahan di suatu tempat di kamus hasil
  2. Buat pesan peringatan yang lebih bersih yang tidak memakan banyak baris
enhancement

Semua 6 komentar

Ya, 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 :)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat