one-hotエンコーディング

概要

one-hotエンコーディングについて学習したので、共有します。

one-hotエンコーディングとは

機械学習を使う際の前処理の1つです。

たとえば"性別"という特徴量は、男/女の2種類の値をもちます。 これをカテゴリ変数と呼びます。

しかし値が文字になっているため、そのままだと機械学習の学習器に入れることができません。 そのため、以下のように、"オリジナルの特徴量"_"値"で新しくヘッダを作り、値を1 or 0で表現することで、 機械学習の学習器に入れることが可能となります。 この新しく1 or 0で表現する方法を、one-hotエンコーディングといいます。

性別_男 性別_女
1 0
0 1

実装方法

私の知っている限り、実装方法は以下の2種類があります。 1.pandasのget_dummysを使う方法 2.scikit-learnのOneHotEncoderを使う方法

今回はpandasのget_dummysを使う方法を説明します。

pandasのget_dummysを使う方法

公式ドキュメント pandas.get_dummies — pandas 0.23.4 documentation

pandasのget_dummysは、one-hotエンコーディングするデータ(Series or DataFrame)が必須の引数です。

import pandas as pd

data = pd.read_csv("train.csv");

pd.get_dummys(data)

とすれば、データがエンコーディングできます。 特徴量がすべてカテゴリ変数とは限らないので、エンコーディングする特徴量を選択したい場合が多いと思います。

その場合、以下のように特徴量のヘッダ名をリストで定義し、 get_dummys関数にオプション引数で与えることで、エンコーディングする特徴量を選択できます。

ohe_columns = ['Country', 'Sex']

pd.get_dummys(data, columns=one_columns)

使用例(Titanicデータを使って説明)

Titanicデータを使った場合の使用例です。 Train.csvを読み込んだままでは、PclassやSexなどの特徴量がカテゴリ変数となっています。 f:id:riodeja5:20181202231053p:plain

以下のように、PClass、Sexを指定してone-hotエンコーディングすると、 f:id:riodeja5:20181202231808p:plain

  • Pclass→Pclass_1, Pclass_2, Pclass_3
  • Sex→Sex_female, Sex_male

のように列が更新され、1 or 0で表現できました。