Disons que j'ai la fonction de saisie suivante:
hotel_id = [1, 2, 3, 2, 3]
Ceci est une fonctionnalité catégorique avec des valeurs numériques. Si je le donne au modèle tel quel, il le traitera comme une variable continue, c'est-à-dire 2> 1.
Si je postule sklearn.labelEncoder()
, j'obtiendrai:
hotel_id = [0, 1, 2, 1, 2]
Donc, cette fonctionnalité encodée est considérée comme continue ou catégorique? Si elle est traitée comme continue, alors quelle est l’utilisation de labelEncoder ().
P.S. Je connais un encodage à chaud. Mais il y a environ 100 hotel_ids alors ne voulez pas l'utiliser. Merci
La LabelEncoder
est un moyen de coder les niveaux de classe. En plus de l'exemple entier que vous avez inclus, considérons l'exemple suivant:
>>> from sklearn.preprocessing import LabelEncoder
>>> le = LabelEncoder()
>>>
>>> train = ["paris", "paris", "tokyo", "amsterdam"]
>>> test = ["tokyo", "tokyo", "paris"]
>>> le.fit(train).transform(test)
array([2, 2, 1]...)
Ce que la LabelEncoder
nous permet de faire est donc d’affecter des niveaux ordinaux à des données catégorielles. Cependant , ce que vous avez noté est correct: le [2, 2, 1]
est traité comme une donnée numérique. C'est un bon candidat pour utiliser les variables OneHotEncoder
pour les variables nominales (je sais que vous avez dit que vous espériez ne pas les utiliser).
Notez que la LabelEncoder
doit être utilisée avant le codage one-hot, car la OneHotEncoder
ne peut pas gérer les données catégorielles. Par conséquent, il est fréquemment utilisé comme précurseur du codage one-hot.
Alternativement, il peut encoder votre cible dans un tableau utilisable. Si, par exemple, train
était votre cible pour la classification, vous auriez besoin d'une LabelEncoder
pour l'utiliser comme variable y.
Si vous exécutez un modèle de classification, les étiquettes sont traitées comme des classes et l'ordre est ignoré. Vous n'avez pas besoin de onehot.
Une façon de gérer ce problème est de changer vos numéros en libellé avec package inflect
Donc, j'ai visité tous les numéros d'identifiants d'hôtels et je les ai modifiés en mots, par exemple 1 -> "un" et 2 -> "deux" ... 99 -> "quatre vingt dix neuf"
import inflect
p = inflect.engine()
def toNominal(df,column):
for index, row in df.iterrows():
df.loc[index, column] = p.number_to_words(df.loc[index, column])
toNominal(df, 'hotel_id')