OrdinalEncoderとLabelEncoderの違い


20

MLに関する本を読んだ後、scikit-learn learnの公式ドキュメントを調べていたところ、次のことに遭遇しました。

ドキュメンテーションではそれについて説明されていsklearn.preprocessing.OrdinalEncoder()ますが、本ではそれについて説明さsklearn.preprocessing.LabelEncoder()れていました。誰かが私に2つの違いを教えてくださいませんか?

回答:


15

Afaik、どちらも同じ機能を持っています。少し違いが背後にあるアイデアです。OrdinalEncoderはフィーチャの変換用で、LabelEncoderはターゲット変数の変換用です。

それはなぜだOrdinalEncoderの形状があるデータにフィットすることができます(n_samples, n_features)しばらくLabelEncoder缶の形状をしているだけフィットデータ(n_samples,)(ただし使用過去1でLabelEncoderの仕事になってきているものを処理するために、ループ内でOrdinalEncoder今)


いつ使用するのOrdinalEncoderですか?
stackunderflow


そのリンクで引用されているドキュメントによると、「[ LabelEncoderは機能での使用は意図されておらず、教師付き学習ターゲットでのみ使用されています。」
イェフダ

4

OrdinalEncoderLabelEncoder 実装の違いについては、受け入れられた回答はデータの形状に言及しています:(OrdinalEncoder2Dデータの場合;形状(n_samples, n_features)LabelEncoder1Dデータの場合:形状の場合(n_samples,)

これOrdinalEncoderが、エラーが発生する理由です。

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

... 1Dデータに適合しようとする場合: OrdinalEncoder().fit(['a','b'])

ただし、エンコーダーのもう1つの違いは、学習したパラメーターの名前です。

  • LabelEncoder 学ぶ classes_
  • OrdinalEncoder 学ぶ categories_

フィッティングLabelEncodervs OrdinalEncoderの違い、およびこれらの学習されたパラメーターの値の違いに注意してください。LabelEncoder.classes_は1D、OrdinalEncoder.categories_2Dです。

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

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

を含むOneHotEncoder、2Dで動作する他のエンコーダーもこのプロパティを使用しますcategories_

dtypeに関する詳細情報<U1(リトルエンディアン、Unicode、1バイト、つまり長さが1の文字列)

編集

私の回答へコメントでは、Piotrは同意しませ。Piotrは、序数エンコーディングとラベルエンコーディングの違いより一般的に指摘しています。

  • 序エンコーディングのための優れている順序変数(のような場所を注文事項、coldwarmhot);
  • 非序(別名対名目(順番は関係ない、など)変数blondebrunette

これは素晴らしいコンセプトですが、この質問はsklearnクラス/実装について尋ねます。実装がどのように概念と一致しないかを見るのは興味深いです。特にOrdinalEncoder; 具体的には、順序エンコードを自分で行う方法

実装のためとして、それはのように思えるLabelEncoderし、OrdinalEncoder持って一貫性のある行動を限り選ばれた整数。彼らの両方に基づいて割り当て整数アルファベット順。例えば:

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)

両方のエンコーダーが整数をアルファベット順の 'c' <'h' <'w'に割り当てていることに注意してください。

しかし、この部分は重要です。どちらのエンコーダも「実際の」次数が正しくないことに注意してください(つまり、実際の次数は温度を反映している必要があります。ここで、次数は「コールド」<「ウォーム」<「ホット」です)。「実際の」順序に基づいて、値に'warm'は整数1が割り当てられます。

Piotrが参照するブログ投稿では、作成者は使用していませんOrdinalEncoder()序数エンコーディングを実現するには、作成者が手動で行います。次のような辞書を使用して、各温度を「実際の」次数の整数にマッピングします{'cold':0, 'warm':1, 'hot':2}

Pandasを使用してこのコードを参照してください。最初に、ディクショナリを通じて変数の実際の順序割り当てる必要があります...非常に単純ですが、順序値を伝えるためのコーディングが必要であり、テキストから整数への実際のマッピングは何ですかオーダー。

つまり、を使用するかどうか疑問に思っている場合は、実際に「通常のエンコーディング」が期待どおりに提供されない可能性があることにOrdinalEncoder注意してください。OrdinalEncoder


2
私は強く反対します。これらのエンコード手法の背後にある概念は、根本的に異なります。ライブラリへの実装だけではありません。
Piotr Rarus-モニカを

1

順序エンコーディングを使用して、カテゴリデータの順序を保持します(コールド、ウォーム、ホットなど)。低中高。犬、猫、クジラなどのデータに順序がないカテゴリデータには、ラベルエンコーディングまたは1つのホットを使用します。メディアでこの投稿を確認してください。これらの概念をよく説明しています。


1
おそらく用語に矛盾があるかもしれませんが、これはsklearnのLabelEncoderに関するOPの質問に関しては正しくないようです。OrdinalEncoderと同様に、0からn_classes-1までの整数としてエンコードします。
Ben Reiniger、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.