Différence entre OrdinalEncoder et LabelEncoder

21

Je parcourais la documentation officielle de scikit-learn learn après avoir parcouru un livre sur ML et suis tombé sur la chose suivante:

Dans la documentation, il est donné à propos sklearn.preprocessing.OrdinalEncoder()alors que dans le livre, il a été donné sklearn.preprocessing.LabelEncoder(), lorsque j'ai vérifié leur fonctionnalité, il me semblait la même chose. Quelqu'un peut-il me dire la différence entre les deux s'il vous plaît?

Saurabh Singh
la source

Réponses:

15

Afaik, les deux ont la même fonctionnalité. Une petite différence est l'idée derrière. OrdinalEncoderest pour convertir les fonctionnalités, tandis que LabelEncoderpour convertir la variable cible.

C'est pourquoi OrdinalEncoderpeut ajuster des données qui ont la forme de (n_samples, n_features)tandis que LabelEncoderne peut s'adapter que des données qui ont la forme de (n_samples,)(bien que dans le passé utilisé LabelEncoderdans la boucle pour gérer ce qui est devenu le travail de OrdinalEncodermaintenant)

Bakka
la source
Quand l'utiliser OrdinalEncoder?
stackunderflow
Selon la documentation citée sur ce lien, "[ LabelEncodern'est] pas destiné à être utilisé sur des fonctionnalités, uniquement sur des objectifs d'apprentissage supervisé."
Yehuda
5

En ce qui concerne les différences OrdinalEncoderet la LabelEncoder mise en œuvre , la réponse acceptée mentionne la forme des données: ( OrdinalEncoderpour les données 2D; la forme (n_samples, n_features), LabelEncoderest pour les données 1D: pour la forme (n_samples,))

C'est pourquoi un OrdinalEncoderobtiendrait une erreur:

ValueError: Expected 2D array, got 1D array instead:

... si vous essayez de vous adapter aux données 1D: OrdinalEncoder().fit(['a','b'])

Cependant, une autre différence entre les encodeurs est le nom de leur paramètre appris ;

  • LabelEncoder apprend classes_
  • OrdinalEncoder apprend categories_

Notez les différences dans l'ajustement LabelEncodervs OrdinalEncoder, et les différences dans les valeurs de ces paramètres appris. LabelEncoder.classes_est 1D, tandis que OrdinalEncoder.categories_2D.

LabelEncoder().fit(['a','b']).classes_
# >>> array(['a', 'b'], dtype='<U1')

OrdinalEncoder().fit([['a'], ['b']]).categories_
# >>> [array(['a', 'b'], dtype=object)]

D'autres encodeurs qui fonctionnent en 2D, notamment OneHotEncoder, utilisent également la propriétécategories_

Plus d'informations ici sur le dtype <U1(little-endian, Unicode, 1 octet; c'est-à-dire une chaîne de longueur 1)

ÉDITER

Dans les commentaires de ma réponse, Piotr n'est pas d'accord ; Piotr souligne la différence entre l' encodage ordinal et l' encodage d' étiquette plus généralement.

  • Le codage ordinal sont bonnes pour les variables ordinales (où les questions d'ordre, comme cold, warm, hot);
  • vs une variable non ordinale (alias nominale ) (où l'ordre n'a pas d'importance, comme blonde, brunette)

C'est un excellent concept, mais cette question porte sur les sklearnclasses / implémentations. Il est intéressant de voir comment l'implémentation ne correspond pas aux concepts; surtout OrdinalEncoder; spécifiquement comment vous devez faire l'encodage ordinal vous-même .

En ce qui concerne la mise en œuvre il semble que LabelEncoderet OrdinalEncoderavoir un comportement cohérent dans la mesure où les nombres entiers choisis . Ils attribuent tous deux des nombres entiers par ordre alphabétique . Par exemple:

OrdinalEncoder().fit_transform([['cold'],['warm'],['hot']]).reshape((1,3))
# >>> array([[0., 2., 1.]])

LabelEncoder().fit_transform(['cold','warm','hot'])
# >>> array([0, 2, 1], dtype=int64)

Remarquez comment les deux encodeurs ont attribué des entiers dans l'ordre alphabétique «c» <«h» <«w».

Mais cette partie est importante: notez comment aucun codeur n'a obtenu l'ordre "réel" correct (c'est-à-dire que l'ordre réel doit refléter la température, où l'ordre est 'froid' <'chaud' <'chaud'); sur la base d'un ordre "réel", la valeur 'warm'aurait été affectée à l'entier 1.

Dans le blog référencé par Piotr , l'auteur n'utilise même pasOrdinalEncoder() . Pour réaliser le codage ordinal, l'auteur le fait manuellement: mappe chaque température à un entier d'ordre "réel", en utilisant un dictionnaire comme{'cold':0, 'warm':1, 'hot':2}:

Reportez-vous à ce code à l'aide de Pandas, où nous devons d'abord attribuer l'ordre réel de la variable via un dictionnaire ... Bien que ce soit très simple, mais il nécessite un codage pour indiquer les valeurs ordinales et quel est le mappage réel du texte à l'entier selon l'ordre.

En d'autres termes, si vous vous demandez si vous souhaitez l'utiliser OrdinalEncoder, veuillez noter OrdinalEncoder qu'il se peut que le «codage ordinal» ne soit pas fourni comme vous l'attendez !

Le pois rouge
la source
2
Je suis fortement en désaccord. Les concepts derrière ces techniques de codage diffèrent fondamentalement. Il ne s'agit pas seulement d'implémentation dans une bibliothèque.
Piotr Rarus - Réintègre Monica
1

Vous utilisez l'encodage ordinal pour conserver l'ordre des données catégorielles, c'est-à-dire froid, chaud, chaud; faible, moyen, élevé. Vous utilisez l'encodage d'étiquettes ou un chaud pour les données catégoriques, où il n'y a pas d'ordre dans les données, c'est-à-dire chien, chat, baleine. Vérifiez cet article sur un support moyen. Il explique bien ces concepts.

Piotr Rarus - Réintégrer Monica
la source
1
Il y a peut-être une incohérence dans la terminologie, mais cela semble incorrect en ce qui concerne la question du PO sur LabelEncoder de sklearn; il code comme des entiers de 0 à n_classes-1, le même que OrdinalEncoder.
Ben Reiniger