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?

Saurabh Singh
fonte

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)

bakka
fonte
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 !

A ervilha vermelha
fonte
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.

Piotr Rarus - Restabelecer Monica
fonte
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