Quel est le problème avec TargetEncoder de la bibliothèque category_encoders?
Cet article est une continuation de l'article précédent , qui expliquait comment fonctionne réellement le codage probabiliste objectif. Dans cet article, nous verrons dans quels cas la solution standard de la bibliothèque category_encoders donne un résultat incorrect, et en plus, nous étudierons l'exemple de théorie et de code pour un codage probabiliste objectif multi-classes correct. Aller!
1. Quand TargetEncoder est-il erroné?
Jetez un œil à ces données. La couleur est une caractéristique et un objectif est ... un objectif. Notre objectif est d'encoder la couleur en fonction de la cible.
Faisons le codage objectif-probabiliste habituel pour cela.
import category_encoders as ce
ce.TargetEncoder(smoothing=0).fit_transform(df.Color,df.Target)
Hmm ... ça n'a pas l'air bien, n'est-ce pas? Toutes les couleurs ont été changées en 1. Pourquoi? En effet, TargetEncoder prend la moyenne de toutes les valeurs cibles pour chaque couleur, pas la probabilité.
Alors que TargetEncoder fonctionne correctement lorsque vous avez une cible binaire avec 0 et 1, il échouera dans deux cas:
Lorsque la cible est binaire, mais pas 0/1 (au moins, par exemple, 1 et 2).
Lorsque la cible est une multiclasse comme dans l'exemple ci-dessus.
Alors que faire ?!
Théorie
, 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 ( - ) .
, ?!
Vous trouverez ci-dessous une fonction qui prend en entrée une table de données et un objet étiquette cible de type Series. La fonction df peut avoir des variables numériques et catégoriques.
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
Résumé
Dans cet article, j'ai montré ce qui ne va pas avec TargetEncoder de la bibliothèque category_encoder, expliqué ce que l'article original dit sur le ciblage des variables multi-classes, tout démontré avec un exemple et fourni un code modulaire fonctionnel que vous pouvez brancher application.