次の入力機能があるとします。
_hotel_id = [1, 2, 3, 2, 3]
_
これは、数値を持つカテゴリ機能です。モデルにそのまま渡すと、モデルはそれを連続変数、つまり2> 1として扱います。
sklearn.labelEncoder()
を適用すると、次のようになります:
_hotel_id = [0, 1, 2, 1, 2]
_
それで、このエンコードされた機能は連続的またはカテゴリー的と見なされますか?連続として扱われる場合、labelEncoder()の使用はどうでしょう。
追伸1つのホットエンコーディングについて知っています。ただし、約100個のhotel_idがあるため、使用しないでください。ありがとう
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
が必要です。
分類モデルを実行している場合、ラベルはクラスとして扱われ、順序は無視されます。ワンホットする必要はありません。
この問題を処理する方法は、番号を変更してパッケージでラベルを付けることです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')