Menu
CoddyTech

One-Hot Encoding

CoddyのMachine Learningジャーニー「機械学習のための統計」セクションの一部。レッスン 53/64。

楽器には順序がありません。1、2、3のように番号を付けると、ピアノがドラムより大きい値として扱われてしまいます。ワンホットエンコーディングでは、代わりに各カテゴリに専用の0/1列を割り当てます。

4人の生徒の楽器(ピアノ、ドラム、ピアノ、チェロ)が、チェロ、ドラム、ピアノという名前の3列になる。各行では、その楽器に対応する列だけが1で、ほかの列は0になり、週の列はそのまま通過する

pd.get_dummiesが処理し、dtype=intはTrueとFalseではなく1と0を指定します:

pupils = pd.DataFrame({"instrument": ["piano", "drums", "piano", "cello"],
                       "weeks": [4, 3, 6, 10]})
encoded = pd.get_dummies(pupils, columns=["instrument"], dtype=int)
print(encoded)

次のように出力されます:

   weeks  instrument_cello  instrument_drums  instrument_piano
0      4                 0                 0                 1
1      3                 0                 1                 0
2      6                 0                 0                 1
3     10                 1                 0                 0

新しい列は末尾に、値ごとにアルファベット順で追加されます。代償となるのは幅です。値が500種類あると、500列が追加されます。

challenge icon

チャレンジ

中級

あるホリデーサイトには、cabins.csvに掲載されているキャビンがあります。プログラムは、areaまたはheatという列名を読み取ります。スターターコードでは価格との相関を見るために数値を割り当てますが、どちらの列にも順序はありません。そのr値は作り物です。

  1. 該当する行を置き換えて、その列をワンホットエンコードします(0と1)。
  2. 列がいくつになったかを出力し、続けて新しい各列と、その列にある1の個数を出力します。

キャビンが5軒あり、入力がheatの場合:

heat became 2 columns:
heat_gas: 3 cabins
heat_wood: 2 cabins

自分で試してみよう

import pandas as pd

cabins = pd.read_csv("cabins.csv")
column = input()

# 以下にコードを書いてください
# これらの行は、順序のない地域と暖房の種類に番号を割り当てています。これらの行を置き換えてください
numbers = {"coast": 1, "hills": 2, "lake": 3, "woods": 4, "gas": 1, "solar": 2, "wood": 3}
cabins[column] = cabins[column].map(numbers)
print(f"{column} against price: r = {round(cabins[column].corr(cabins['price']), 2)}")
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

機械学習のための統計のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ