web-dev-qa-db-fra.com

Travail de labelEncoder dans sklearn

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

4
Neo

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.

8
Tgsmith61591

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.

0
simon

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')
0
J. Doe