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?
la source
OrdinalEncoder
?LabelEncoder
n'est] pas destiné à être utilisé sur des fonctionnalités, uniquement sur des objectifs d'apprentissage supervisé."En ce qui concerne les différences
OrdinalEncoder
et laLabelEncoder
mise en œuvre , la réponse acceptée mentionne la forme des données: (OrdinalEncoder
pour les données 2D; la forme(n_samples, n_features)
,LabelEncoder
est pour les données 1D: pour la forme(n_samples,)
)C'est pourquoi un
OrdinalEncoder
obtiendrait une erreur:... 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
apprendclasses_
OrdinalEncoder
apprendcategories_
Notez les différences dans l'ajustement
LabelEncoder
vsOrdinalEncoder
, et les différences dans les valeurs de ces paramètres appris.LabelEncoder.classes_
est 1D, tandis queOrdinalEncoder.categories_
2D.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.
cold
,warm
,hot
);blonde
,brunette
)C'est un excellent concept, mais cette question porte sur les
sklearn
classes / implémentations. Il est intéressant de voir comment l'implémentation ne correspond pas aux concepts; surtoutOrdinalEncoder
; spécifiquement comment vous devez faire l'encodage ordinal vous-même .En ce qui concerne la mise en œuvre il semble que
LabelEncoder
etOrdinalEncoder
avoir 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: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 pas
OrdinalEncoder()
. 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}
:En d'autres termes, si vous vous demandez si vous souhaitez l'utiliser
OrdinalEncoder
, veuillez noterOrdinalEncoder
qu'il se peut que le «codage ordinal» ne soit pas fourni comme vous l'attendez !la source
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.
la source