Quanto às diferenças OrdinalEncoder
e LabelEncoder
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:
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 LabelEncoder
vs OrdinalEncoder
e 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 sklearn
classes / 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 LabelEncoder
e OrdinalEncoder
tem 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 !
OrdinalEncoder
?