Diferença entre OrdinalEncoder e LabelEncoder


21

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?

Respostas:


15

Afaik, ambos têm a mesma funcionalidade. Uma pequena diferença é a ideia por trás. OrdinalEncoderé para converter recursos, enquanto LabelEncoderé para converter variáveis ​​de destino.

É por isso que OrdinalEncoderpode ajustar dados com a forma de (n_samples, n_features)while LabelEncodersomente podem ajustar dados com a forma de (n_samples,)(embora, no passado, LabelEncodertenha sido usado no loop para lidar com o que está se tornando o trabalho de OrdinalEncoderagora)


Quando usar OrdinalEncoder?
stackunderflow


De acordo com a documentação citada nesse link, "[ LabelEncodernão] se destina a ser usado em recursos, apenas em metas de aprendizado supervisionado".
Yehuda

5

Quanto às diferenças OrdinalEncodere LabelEncoder implementação , a resposta aceita menciona a forma dos dados: ( OrdinalEncoderpara dados 2D; forma (n_samples, n_features), LabelEncoderé para dados 1D: para forma (n_samples,))

É por isso OrdinalEncoderque a obteria um erro:

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

... 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 aprende classes_
  • OrdinalEncoder aprende categories_

Observe as diferenças no ajuste LabelEncodervs OrdinalEncodere as diferenças nos valores desses parâmetros aprendidos. LabelEncoder.classes_é 1D, enquanto OrdinalEncoder.categories_é 2D.

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

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

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.

  • Codificação ordinal são bons para variáveis ordinais (onde as questões de ordem, como cold, warm, hot);
  • vs uma variável não ordinal (aka nominal ) (onde a ordem não importa, como blonde, brunette)

Esse é um ótimo conceito, mas essa pergunta é sobre as sklearnclasses / implementação. É interessante ver como a implementação não corresponde aos conceitos; especialmente OrdinalEncoder; especificamente como você deve fazer a codificação ordinal .

Quanto à implementação, parece LabelEncodere OrdinalEncodertem um comportamento consistente em relação aos números inteiros escolhidos . Eles ambos inteiros atribuir com base em ordem alfabética . Por exemplo:

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)

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 usaOrdinalEncoder() . 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}:

Consulte este código usando o Pandas, onde primeiro precisamos atribuir a ordem real da variável por meio de um dicionário ... Embora seja muito direto, mas exija codificação para informar valores ordinais e qual é o mapeamento real do texto para o inteiro, conforme a ordem.

Em outras palavras, se você está se perguntando se deve usar OrdinalEncoder, observe OrdinalEncoder que na verdade pode não fornecer "codificação ordinal" da maneira que você espera !


2
Eu discordo fortemente. Os conceitos por trás dessas técnicas de codificação diferem fundamentalmente. Não se trata apenas de implementação em uma biblioteca.
Piotr Rarus - Restabelece Monica

1

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.


1
Talvez exista uma inconsistência na terminologia, mas isso parece incorreto com relação à pergunta do OP no LabelEncoder do sklearn; ele codifica como números inteiros de 0 a n_classes-1, o mesmo que OrdinalEncoder.
Ben Reiniger
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.