Pengkodean variabel kategori menggunakan estimasi kemungkinan

22

Saya mencoba memahami bagaimana saya dapat menyandikan variabel kategori menggunakan estimasi kemungkinan, tetapi sejauh ini hanya sedikit keberhasilan.

Setiap saran akan sangat dihargai.

kurcaci kecil
sumber
Apa yang harus dilakukan saat waktu prediksi ketika kami tidak memiliki label target?
Ranjeet Singh

Jawaban:

24

Saya juga mempelajari topik ini, dan inilah yang saya temukan:

  • Jenis pengkodean ini disebut pengkodean kemungkinan , pengkodean dampak atau pengkodean target

  • Idenya adalah mengkodekan variabel kategori Anda dengan menggunakan variabel target (kontinu atau kategori tergantung pada tugas). Misalnya, jika Anda memiliki tugas regresi, Anda dapat menyandikan variabel kategori Anda dengan rata-rata target. Untuk setiap kategori, Anda menghitung rata-rata target yang sesuai (di antara kategori ini) dan mengganti nilai kategori dengan mean ini.

  • Jika Anda memiliki tugas klasifikasi, Anda menghitung frekuensi relatif target Anda sehubungan dengan setiap nilai kategori.

  • Dari sudut pandang matematika, pengodean ini berarti probabilitas target Anda, tergantung pada setiap nilai kategori.

  • Jika Anda melakukannya dengan cara yang sederhana, seperti yang saya jelaskan di atas, Anda mungkin akan mendapatkan estimasi yang bias. Itu sebabnya di komunitas Kaggle mereka biasanya menggunakan 2 level cross-validation. Baca komentar ini oleh raddar di sini . Notebook yang sesuai ada di sini .

Kutipan:

Itu mengambil nilai rata-rata y. Tapi tidak berarti sederhana, tetapi dalam validasi silang dalam cara validasi silang;

Katakanlah kita memiliki validasi silang 20 kali lipat. kita perlu entah bagaimana menghitung nilai rata-rata fitur untuk # 1 kali lipat menggunakan informasi dari # 2- # 20 lipatan saja.

Jadi, Anda mengambil # 2- # 20 lipatan, membuat validasi silang lain yang ditetapkan di dalamnya (saya lakukan 10 kali lipat). hitung rata-rata untuk setiap kali absen satu kali (pada akhirnya Anda mendapatkan 10 berarti). Anda rata-rata 10 berarti ini dan menerapkan vektor itu untuk set validasi # 1 utama Anda. Ulangi itu untuk sisa 19 lipatan.

Sulit untuk dijelaskan, sulit untuk dimengerti dan dikuasai :) Tetapi jika dilakukan dengan benar dapat membawa banyak manfaat :)

  • Implementasi lain dari pengkodean ini ada di sini .

  • Di R library vtreat mereka memiliki implementasi pengkodean dampak. Lihat posting ini .

  • Di perpustakaan CatBoost mereka memiliki banyak opsi untuk pengkodean variabel kategorikal termasuk pengkodean target.

  • Belum ada pengkodean di sklearn.

Galina Alperovich
sumber
1
Ada Pengodean Sasaran di Sklearn-contrib Category Encoders
josh
Bagaimana Anda menerapkan interaksi fitur jika Anda menggunakan pengkodean target? Misalnya, Anda menargetkan F1 dan F2 yang dikodekan target. Apakah Anda hanya mengalikan nilai yang dikodekan F1 * F2?
Michael Larionov
Jika Anda menghitung rata-rata untuk setiap lipatan LOO, maka Anda mengambil rata-rata dari mereka, itu persis sama dengan Anda mengambil rata-rata # 2- # 20 lipatan, saya tidak mengerti mengapa ini dapat dianggap sebagai CV. Juga saya tidak mengerti apa yang dia maksud dengan "vektor" ketika dia rata-rata 10 berarti.
SiXUlm
Komentar terlambat; target encoding di Kategori Encoders adalah penyandian rata-rata sederhana; itu tidak melakukan regularisasi lipatan-dalam-lipatan yang dijelaskan oleh raddar.
Dan Scally
7

Pengkodean target sekarang tersedia di sklearn melalui paket category_encoders.

Encoder Target

class category_encoders.target_encoder.TargetEncoder (verbose = 0, cols = Tidak ada, drop_invariant = Salah, return_df = Benar, impute_missing = Benar, handle_unknown = 'impute', min_samples_leaf = 1, smoothing = 1)

Target Encode untuk fitur-fitur kategorikal. Berdasarkan pendekatan cuti satu.

Seperti yang dicatat oleh josh dalam komentar di atas.

jeffhale
sumber
1

Kemungkinan encoding masih belum tersedia di scikit belajar. Anda dapat melakukannya dengan membuat kamus, dan kemudian melakukan fungsi ganti.

dict1 = {'cate1':1,'cate2':1,'cate3':2,'cate4':2}
for i in df.shape[0]:
    df.iloc[i] = dict1[df.iloc[i]] 
chrisckwong821
sumber