web-dev-qa-db-ja.com

sklearnでのlabelEncoderの動作

次の入力機能があるとします。

_hotel_id = [1, 2, 3, 2, 3]
_

これは、数値を持つカテゴリ機能です。モデルにそのまま渡すと、モデルはそれを連続変数、つまり2> 1として扱います。

sklearn.labelEncoder()を適用すると、次のようになります:

_hotel_id = [0, 1, 2, 1, 2] 
_

それで、このエンコードされた機能は連続的またはカテゴリー的と見なされますか?連続として扱われる場合、labelEncoder()の使用はどうでしょう。

追伸1つのホットエンコーディングについて知っています。ただし、約100個のhotel_idがあるため、使用しないでください。ありがとう

8
Neo

LabelEncoderは、クラスレベルをエンコードする方法です。含めた整数の例に加えて、次の例を検討してください。

>>> from sklearn.preprocessing import LabelEncoder
>>> le = LabelEncoder()
>>>
>>> train = ["paris", "paris", "tokyo", "amsterdam"]
>>> test = ["tokyo", "tokyo", "paris"]
>>> le.fit(train).transform(test)
array([2, 2, 1]...)

LabelEncoderを使用すると、順序レベルをカテゴリデータに割り当てることができます。 ただし、あなたが指摘したことは正しい:すなわち、[2, 2, 1]は数値データとして扱われます。これは、ダミー変数にOneHotEncoderを使用するのに適した候補です(使用しないことを望んでいると言いました)。

LabelEncoderはカテゴリデータを処理できないため、ワンホットエンコードの前にOneHotEncoderを使用する必要があることに注意してください。したがって、ワンホットエンコーディングの前兆として頻繁に使用されます。

または、ターゲットを使用可能な配列にエンコードできます。たとえば、trainが分類のターゲットである場合、y変数として使用するにはLabelEncoderが必要です。

13
Tgsmith61591

分類モデルを実行している場合、ラベルはクラスとして扱われ、順序は無視されます。ワンホットする必要はありません。

0
simon

この問題を処理する方法は、番号を変更してパッケージでラベルを付けることですinflect

だから私はすべてのホテルIDを訪問していて、それらを単語に変更しました。たとえば、1-> 'one'と2-> 'two' ... 99-> 'ninety-nine'

import inflect
p = inflect.engine()

def toNominal(df,column):
for index, row in df.iterrows():
    df.loc[index, column] =  p.number_to_words(df.loc[index, column])

toNominal(df, 'hotel_id')
0
J. Doe