Evalml: Menghitung varians tinggi ketika rata-rata cv_scores adalah nol

Dibuat pada 23 Mar 2021  ·  7Komentar  ·  Sumber: alteryx/evalml

Saat ini, perhitungan kami untuk varians tinggi adalah:

        cv_scores_std = cv_scores.std()
        cv_scores_mean = cv_scores.mean()
        if cv_scores_std != 0 and cv_scores_mean != 0:
            high_variance_cv = bool(abs(cv_scores_std / cv_scores_mean) > threshold)```

Ini diberlakukan untuk mencegah peringatan / kesalahan bagi-oleh-nol. Namun, implikasi ini tidak ideal: jika mean mendekati nol (tetapi bukan nol), varians yang tinggi kemungkinan akan benar (dibagi dengan angka kecil).

Selain itu, dimungkinkan adanya varians yang tinggi jika meannya nol tetapi standar deviasinya sangat tinggi. Saat ini, kami default ke False tetapi kami mungkin ingin mencari impl yang lebih pintar dalam situasi ini.

bug spike

Komentar yang paling membantu

@ angela97lin Terima kasih telah menjelaskan! Masalah pembagian dengan nol hanya terjadi pada tujuan yang dapat mengambil nilai negatif. Untuk tujuan tersebut, saya ingin tahu apakah penggunaan koefisien variasi kita bahkan valid?

Saya melihat wiki, dan bagian definisi menyebutkan bahwa itu seharusnya hanya dihitung untuk data pada ratio scale , yaitu data yang diukur pada skala dengan "nol yang berarti". Saya menganggap itu berarti bahwa data tidak boleh negatif. Posting pertukaran tumpukan statistik ini tampaknya mendukung interpretasi itu.

Dengan mengingat hal itu, saya kira saya melihat empat opsi:

  1. Jika mean <=0, jangan hitung koefisien variasi. Kami tidak akan pernah menaikkan peringatan dalam situasi ini.
  2. Tambahkan epsilon ke penyebut. Saya kira itu tergantung pada nilai epsilon tetapi pada dasarnya kami akan selalu menaikkan peringatan jika rata-ratanya nol.
  3. Jangan mengubah apa pun. Kami tidak akan pernah menaikkan peringatan ketika mean == 0.
  4. Temukan ukuran lain dari overfitting yang memperhitungkan tujuan yang dapat mengambil nilai negatif.

Bagaimana menurutmu?

Semua 7 komentar

@ angela97lin dapatkah Anda mengklarifikasi apa yang menyebabkan masalah ini muncul? Ini sepertinya bukan kejadian biasa.

Pendekatan pertama adalah mungkin menambahkan epsilon untuk mencegah pembagian dengan nol.

@chukarsten Ini muncul di # 2024, di mana saya menutupi kasus untuk tidak mengeluarkan peringatan runtime, tetapi dalam impl yang mungkin tidak ideal. Saya ingin tahu apakah ada pendekatan yang lebih baik daripada membagi dengan rata-rata; pendekatan penambahan epsilon akan menghindari RuntimeWarning tetapi juga berarti bahwa varians tinggi kemungkinan akan selalu dipicu, karena membagi dengan nilai kecil-mendekati-nol akan ~inf.

@ angela97lin Apakah ini masih menjadi masalah? Saya secara manual memeriksa contoh [0.0, -1.0, 1.0] Anda dan saya tidak mendapatkan kesalahan pembagian dengan nol:

import evalml
from evalml import AutoMLSearch
from evalml.utils import infer_feature_types
import numpy as np


X, y = evalml.demos.load_fraud(n_rows=1000)


automl = AutoMLSearch(X_train=X, y_train=y, problem_type='binary', objective='f1', max_batches=1)

automl.search()

assert not automl._check_for_high_variance(automl.get_pipeline(0), np.array([0, -1, 1]))

Saya pikir kami hanya menghitung koefisien variasi ketika std dan mean bukan nol sehingga kami terlindungi dari pengecualian.

Kita dapat memperdebatkan apakah mengembalikan False untuk pemeriksaan varians tinggi berguna ketika rata-rata adalah nol, tetapi saya pikir masalah aslinya adalah pembagian dengan 0 yang menurut saya tidak dapat terjadi.

@freddyaboulton Ah maaf, urutan PR-nya agak membingungkan. Anda benar, #2024 menangani kasus di mana mean adalah nol sehingga kami tidak memicu masalah pembagian dengan nol. Apa yang saya ingin agar masalah PR ini dilacak adalah cara yang lebih baik untuk menghitung/menangani ketika rata-ratanya nol, karena saat ini kita default ke False. Akan memperbarui deskripsi :d

@ angela97lin Terima kasih telah menjelaskan! Masalah pembagian dengan nol hanya terjadi pada tujuan yang dapat mengambil nilai negatif. Untuk tujuan tersebut, saya ingin tahu apakah penggunaan koefisien variasi kita bahkan valid?

Saya melihat wiki, dan bagian definisi menyebutkan bahwa itu seharusnya hanya dihitung untuk data pada ratio scale , yaitu data yang diukur pada skala dengan "nol yang berarti". Saya menganggap itu berarti bahwa data tidak boleh negatif. Posting pertukaran tumpukan statistik ini tampaknya mendukung interpretasi itu.

Dengan mengingat hal itu, saya kira saya melihat empat opsi:

  1. Jika mean <=0, jangan hitung koefisien variasi. Kami tidak akan pernah menaikkan peringatan dalam situasi ini.
  2. Tambahkan epsilon ke penyebut. Saya kira itu tergantung pada nilai epsilon tetapi pada dasarnya kami akan selalu menaikkan peringatan jika rata-ratanya nol.
  3. Jangan mengubah apa pun. Kami tidak akan pernah menaikkan peringatan ketika mean == 0.
  4. Temukan ukuran lain dari overfitting yang memperhitungkan tujuan yang dapat mengambil nilai negatif.

Bagaimana menurutmu?

@freddyaboulton @angela97lin Setuju dengan Freddy. Saya pikir masuk akal untuk tidak menjalankan pemeriksaan varians tinggi saat ini pada tujuan yang dapat memiliki nilai negatif, karena sepertinya itu secara matematis salah.

Saya bukan penggemar berat opsi 1-3, karena opsi itu tidak benar-benar menangani secara akurat contoh di mana data tidak ada pada ratio_scale , terutama karena saya tidak berpikir kita harus mencoba menggunakan koefisien variasi untuk tujuan yang tidak ada di ratio_scale . Saya akan memilih variasi opsi 4.

Saya pikir masuk akal untuk memiliki 2 pemeriksaan terpisah. Kita dapat melanjutkan dengan pemeriksaan varians tinggi saat ini untuk tujuan yang tidak boleh negatif (akurasi, AUC, recall, dll), dan untuk tujuan yang dapat mengambil nilai negatif (R2, dll), kita harus menemukan ukuran terpisah untuk overfitting ( ini tampaknya lebih kuat, tetapi saya tidak yakin apakah ini akan menjadi ukuran yang baik untuk overfitting).

Mengubah ini menjadi lonjakan. Sasaran: temukan opsi kami, dan bekerja sama dengan tim untuk memilih satu.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat