Membentuk sampel data latih dengan shift distribusi

Penafian: Artikel ini adalah produk terjemahan dari Max Halforda . Terjemahan tidak bersih, tetapi adaptif. Sehingga ada pemahaman di setiap jalur ilmu.







“Saya dan teman-teman baru saja lolos ke final Data Science Game 2017. Bagian pertama dari kompetisi ini adalah Kaggle dengan dataset dari Deezer (1). Masalahnya terdiri dari pemecahan masalah klasifikasi biner: perlu diprediksi apakah pengguna akan beralih mendengarkan komposisi yang ditawarkan kepadanya.



Seperti tim lain, kami telah mengekstrak fitur yang relevan dan melatih pengklasifikasi XGBoost (2). Namun, kami melakukan sesuatu yang istimewa, subsampel dari set data pelatihan, sehingga itu (set data pelatihan) menjadi lebih mewakili set pengujian. "




Salah satu persyaratan dasar untuk proses pembelajaran agar pengoperasian model mesin berhasil adalah sifat distribusi yang sama dalam set data pelatihan dan pengujian. Sebagai contoh kasar: model dilatih untuk pengguna berusia 20 tahun, dan dalam sampel pengujian, pengguna berusia 60+ tahun.



Di sini secara intuitif wajar bahwa dengan usia di mana model tidak dilatih, itu tidak akan bertahan. Tentu saja, contoh semacam itu murni sintetis, tetapi kenyataannya, untuk perbedaan yang signifikan, cukup melatih model untuk 20+ dan mencoba membuatnya berfungsi untuk 30+. Hasilnya akan serupa.



Ini karena model mempelajari distribusi (3) data. Jika distribusi fitur dalam set pelatihan dan pengujian sama, model akan berterima kasih.



Sisipan penerjemah: Ketika saya duduk untuk menerjemahkan, saya punya pertanyaan: mengapa pelatihan harus disesuaikan dengan tes, karena, pada kenyataannya , tes tersebut mencerminkan data yang tidak terlihat yang akan masuk ke model pada saat masuk ke produksi. Kemudian saya ketiduran, membaca ulang, dan semuanya lenyap. Triknya adalah, di bawah pengaruh faktor, retrospektif mungkin menjadi tidak relevan untuk saat ini. Lebih lanjut tentang ini nanti (contoh sedikit diadaptasi ulang).



Bias dalam distribusi untuk satu fitur dapat terjadi karena berbagai alasan. Contoh paling intuitif dapat dipinjam dari Facebook.



Misalkan sebuah perusahaan dilatih tentang model yang didasarkan pada fitur (fitur sama dengan fitur) sebagai hiburan dalam hitungan menit. Biarkan secara sintetis memprediksi tingkat loyalitas pengguna dalam skala sepuluh poin.



Ketika perpecahan aplikasi Facebook umum menjadi jejaring sosial utama (umpan dll) dan sistem pesan terjadi, waktu di aplikasi utama berkurang, yaitu, set data yang masuk berubah dan tidak lagi sesuai dengan retrospektif masa lalu.

Secara matematis, dengan mempertimbangkan fitur waktu, model akan memprediksi tingkat loyalitas yang lebih rendah, meskipun kenyataannya tidak demikian - transfer waktu hanya dibagi menjadi dua aplikasi. Itu keluar dengan sedih.



Dengan demikian, pergeseran distribusi terjadi ketika distribusi data historis menjadi tidak relevan untuk memprediksi data baru.



Pada dataset Deezer, ketidakkonsistenan distribusi terdapat pada fitur pengukuran jumlah lagu yang didengarkan sebelum menyelesaikan masalah prediksi. Fitur ini memiliki distribusi eksponensial (4) di kumpulan data publik dan pengujian. Namun, dalam set data pengujian itu lebih jelas, jadi rata-rata di set pelatihan lebih rendah daripada di set pengujian. Setelah mengambil sampel ulang distribusi pelatihan, kami berhasil meningkatkan metrik ROC-AUC (5) dan naik peringkat sekitar 20 poin.



Di bawah ini adalah contoh perbedaan distribusi:



import numpy as np
import plotly.figure_factory as ff

train = np.random.exponential(2, size=100000)
test = np.random.exponential(1, size=10000)

distplot = ff.create_distplot([train, test], ['Train', 'Test'], bin_size=0.5)
distplot.update_layout(title_text=' Test, Train')


" "



Gagasan untuk meratakan shift distribusi adalah untuk membentuk kembali sampel pelatihan agar mencerminkan distribusi pengujian.



Mari kita bayangkan bahwa kita ingin membuat subset dari 50.000 observasi dari set pelatihan kita agar sesuai dengan distribusi set pengujian. Apa yang ingin Anda lakukan secara intuitif?



Buat agar objek yang lebih umum dalam set data pengujian juga umum dalam pelatihan! Tapi bagaimana Anda bisa menentukan objek mana yang lebih dibutuhkan dan mana yang lebih jarang?



Libra!



Langkah-langkahnya akan seperti ini:



  • bagi garis lurus numerik distribusi menjadi interval yang sama (atau baskets (bins)
  • hitung jumlah benda di setiap keranjang (ukuran bin)
  • untuk setiap pengamatan di keranjang, hitung bobotnya sama dengan 1 / (ukuran bin)
  • buat subsampel k dengan distribusi berbobot (objek dengan bobot lebih tinggi akan lebih sering muncul di subsampel)


Mentransfer ke kode, kami melakukan tindakan berikut:



SAMPLE_SIZE = 50000
N_BINS = 300

#   ,       .
#        
step = 100 / N_BINS

test_percentiles = [
    np.percentile(test, q, axis=0)
    for q in np.arange(start=step, stop=100, step=step)
]

#     . 
#    ,    
train_bins = np.digitize(train, test_percentiles)

#          i   ,
#  0      , 1    1    i 
train_bin_counts = np.bincount(train_bins)

#    ,        
weights = 1 / np.array([train_bin_counts[x] for x in train_bins])

#   ,     
weights_norm = weights / np.sum(weights)

np.random.seed(0)

sample = np.random.choice(train, size=SAMPLE_SIZE, p=weights_norm, replace=False)

distplot_with_sample = ff.create_distplot([train, test, sample], ['Train', 'Test', 'New train'], bin_size=0.5)
distplot_with_sample.update_layout(title_text=' Test, Train, New train')


" " The



distribusi baru (hijau) sekarang lebih cocok distribusi sampel uji (oranye). Kami menggunakan tindakan serupa dalam kompetisi - kumpulan data asli berisi 3 juta baris, ukuran sampel baru dihasilkan dari 1,3 juta objek. Datanya menjadi lebih kecil, tetapi keterwakilan distribusi meningkatkan kualitas pelatihan.



Beberapa catatan dari pengalaman pribadi penulis:



  • Jumlah keranjang tidak berperan besar, tetapi semakin sedikit keranjang, semakin cepat algoritma belajar (coba ubah jumlah keranjang (N_BINS) menjadi 3, 30 dalam contoh dan Anda akan melihat bahwa perbedaannya sangat kecil)
  • , , , “” , , .

    ( , “” , “” . . , )



Algoritma pembentukan kembali ada di github penulis (folder xam ). Ke depannya, penulis berencana untuk menganalisis topik baru dan membagikannya di blog.



Saya harap terjemahan dan catatannya membantu dan jelas. Saya menantikan tanggapan Anda dalam format yang konstruktif. Terima kasih atas waktu Anda.



Catatan kaki:



1. Deezer adalah layanan streaming musik online Prancis. Ketik Spotify, Ya.Muzyki dan yah, Anda mendapatkan



2. XGBoost- Algoritma peningkatan gradien ekstrim. Saya sangat suka menyebutnya "peningkatan gradien pada steroid". Ide boosting adalah untuk melatih beberapa siswa lemah yang homogen, yang masing-masing membentuk nilai berdasarkan pengalaman pembelajaran retrospektif dari yang sebelumnya, dengan memperhatikan kelas-kelas di mana algoritme sebelumnya paling tersandung. Ide di balik gradien adalah, dalam istilah sederhana, untuk meminimalkan kesalahan pembelajaran. XGBoost, sebagai algoritme, adalah konfigurasi yang lebih menguntungkan secara komputasi dari Gradient Boosting



3. Distribusi di sini berarti persis hal yang menjelaskan hukum yang dengannya angka-angka tersebar dalam suatu variabel.



4. Menurut pendapat pribadi saya, dorongan yang paling bisa dimengerti untuk memvisualisasikan eksponensialdistribusi di kepala adalah definisinya sebagai distribusi, dengan intensitas konstan.



5. ROC-AUC (Area Under Kurva Karakteristik Operasi Receiver) - area di bawah kurva “karakteristik pemrosesan receiver” - nama literal, karena metrik berasal dari teori pemrosesan sinyal. Kurva KOP sangat curam - ini menunjukkan rasio Positif Benar dan Positif Palsu dari respons model sebagai ambang probabilitas untuk penugasan ke kelas berubah, membentuk "busur". Karena fakta bahwa rasio TP dan FP terlihat, dimungkinkan untuk memilih ambang probabilitas yang optimal tergantung pada kesalahan jenis pertama dan kedua.



Dalam kasus mempertimbangkan keakuratan model, tidak memperhatikan ambang probabilitas tanggapan, metrik ROC-AUC digunakan, yang mengambil nilai dalam kisaran [0,1]. Untuk model konstan dengan keseimbangan kelas, ROC-AUC akan mendekati 0,5, oleh karena itu model di bawah ini tidak lolos pemeriksaan kewarasan (sanity check). Semakin dekat area di bawah kurva KOP ke kesatuan, semakin baik, tetapi untuk mengindeks utilitas hasil secara umum, sebaiknya bandingkan AUC-ROC model yang dilatih dengan AUC-ROC model konstan.



All Articles