Apa yang salah dengan TargetEncoder dari pustaka category_encoders?
Artikel ini merupakan kelanjutan dari artikel sebelumnya , yang menjelaskan bagaimana sebenarnya pengkodean probabilistik objektif bekerja. Pada artikel ini, kita akan melihat dalam kasus apa solusi standar pustaka category_encoders memberikan hasil yang salah, dan sebagai tambahan, kita akan mempelajari teori dan contoh kode untuk pengkodean probabilistik objektif multi-kelas yang benar. Pergilah!
1. Kapan TargetEncoder salah?
Lihatlah data ini. Warna adalah fitur, dan tujuan adalah ... tujuan. Tujuan kami adalah untuk menyandikan warna berdasarkan Target.
Mari kita lakukan pengkodean probabilistik-objektif yang biasa untuk ini.
import category_encoders as ce
ce.TargetEncoder(smoothing=0).fit_transform(df.Color,df.Target)
Hmm ... tidak terlihat bagus, bukan? Semua warna telah diubah menjadi 1. Mengapa? Ini karena TargetEncoder mengambil rata-rata dari semua nilai target untuk setiap warna, bukan probabilitas.
Sementara TargetEncoder bekerja dengan benar ketika Anda memiliki target biner dengan 0 dan 1, itu akan gagal dalam dua kasus:
Ketika targetnya biner, tetapi bukan 0/1 (setidaknya, misalnya, 1 dan 2).
Saat targetnya adalah multiclass seperti pada contoh di atas.
Jadi apa yang harus dilakukan ?!
Teori
, n . , . n , . n-1 , , . - , , .
.
.
1: - .
enc=ce.OneHotEncoder().fit(df.Target.astype(str)) y_onehot=enc.transform(df.Target.astype(str)) y_onehot
, Target_1 0 Target. 1 Target 0, 0 . Target_2 1 Target.
2: , .
class_names = y_onehot.columns
for class_ in class_names:
enc = ce.TargetEncoder(smoothing = 0)
print(enc.fit_transform(X,y_onehot[class_]))
0
1
2
3: , , 1 2 .
!
, :
, Color_Target. , , . , , , Color_Target_3 ( - ) .
, ?!
Di bawah ini adalah fungsi yang mengambil sebagai input tabel data dan objek label target tipe Seri. Fungsi df dapat memiliki variabel numerik dan kategorikal.
def target_encode_multiclass(X,y): #X,y are pandas df and series
y=y.astype(str) #convert to string to onehot encode
enc=ce.OneHotEncoder().fit(y)
y_onehot=enc.transform(y)
class_names=y_onehot.columns #names of onehot encoded columns
X_obj=X.select_dtypes('object') #separate categorical columns
X=X.select_dtypes(exclude='object')
for class_ in class_names:
enc=ce.TargetEncoder()
enc.fit(X_obj,y_onehot[class_]) #convert all categorical
temp=enc.transform(X_obj) #columns for class_
temp.columns=[str(x)+'_'+str(class_) for x in temp.columns]
X=pd.concat([X,temp],axis=1) #add to original dataset
return X
Ringkasan
Dalam artikel ini, saya telah menunjukkan apa yang salah dengan TargetEncoder dari pustaka category_encoder, menjelaskan apa yang dikatakan artikel asli tentang penargetan variabel kelas jamak, mendemonstrasikan semuanya dengan sebuah contoh, dan memberikan kode modular yang berfungsi yang dapat Anda colokkan ke aplikasi.