Eu estava examinando a documentação oficial do scikit-learn learn depois de ler um livro sobre ML e me deparei com o seguinte:
Na documentação, isso é dado, sklearn.preprocessing.OrdinalEncoder()
enquanto no livro sklearn.preprocessing.LabelEncoder()
, quando verifiquei a funcionalidade deles, parecia o mesmo para mim. Alguém pode me dizer a diferença entre os dois, por favor?
fonte
OrdinalEncoder
?LabelEncoder
não] se destina a ser usado em recursos, apenas em metas de aprendizado supervisionado".Quanto às diferenças
OrdinalEncoder
eLabelEncoder
implementação , a resposta aceita menciona a forma dos dados: (OrdinalEncoder
para dados 2D; forma(n_samples, n_features)
,LabelEncoder
é para dados 1D: para forma(n_samples,)
)É por isso
OrdinalEncoder
que a obteria um erro:... se tentar ajustar os dados 1D:
OrdinalEncoder().fit(['a','b'])
No entanto, outra diferença entre os codificadores é o nome do parâmetro aprendido ;
LabelEncoder
aprendeclasses_
OrdinalEncoder
aprendecategories_
Observe as diferenças no ajuste
LabelEncoder
vsOrdinalEncoder
e as diferenças nos valores desses parâmetros aprendidos.LabelEncoder.classes_
é 1D, enquantoOrdinalEncoder.categories_
é 2D.Outros codificadores que funcionam em 2D, inclusive
OneHotEncoder
, também usam a propriedadecategories_
Mais informações aqui sobre o dtype
<U1
(little-endian, Unicode, 1 byte; ou seja, uma string com o comprimento 1)EDITAR
Nos comentários da minha resposta, Piotr discorda ; Piotr aponta a diferença entre a codificação ordinal e a codificação de etiquetas de maneira mais geral.
cold
,warm
,hot
);blonde
,brunette
)Esse é um ótimo conceito, mas essa pergunta é sobre as
sklearn
classes / implementação. É interessante ver como a implementação não corresponde aos conceitos; especialmenteOrdinalEncoder
; especificamente como você deve fazer a codificação ordinal .Quanto à implementação, parece
LabelEncoder
eOrdinalEncoder
tem um comportamento consistente em relação aos números inteiros escolhidos . Eles ambos inteiros atribuir com base em ordem alfabética . Por exemplo:Observe como os dois codificadores atribuíram números inteiros na ordem alfabética 'c' <'h' <'w'.
Mas esta parte é importante: Observe como nenhum codificador conseguiu a ordem "real" correta (ou seja, a ordem real deve refletir a temperatura, onde a ordem é 'fria' <'quente' <'quente'); com base na ordem "real", o valor
'warm'
teria sido atribuído ao número inteiro 1.Na postagem de blog referenciada por Piotr , o autor nem usa
OrdinalEncoder()
. Para obter a codificação ordinal, o autor faz isso manualmente: mapeia cada temperatura para um número inteiro "real" da ordem, usando um dicionário como{'cold':0, 'warm':1, 'hot':2}
:Em outras palavras, se você está se perguntando se deve usar
OrdinalEncoder
, observeOrdinalEncoder
que na verdade pode não fornecer "codificação ordinal" da maneira que você espera !fonte
Você usa a codificação ordinal para preservar a ordem dos dados categóricos, por exemplo, frio, quente, quente; baixo Médio Alto. Você usa a codificação de etiquetas ou uma hot para dados categóricos, onde não há ordem nos dados, como cachorro, gato, baleia. Verifique esta postagem em médio. Isso explica bem esses conceitos.
fonte