EnsekiTT Blog

EnsekiTTが書くブログです。

pd.Seriesを入れるとOne Hot Encodingしてpd.DataFrameにしてくれる関数を用意した話

つまりなにしたの?

カテゴリデータで構成されるpandasのpd.Seriesを入力すると、One Hot Encodingをして、
pd.DataFrameとして返してくれる関数(one_hot_encoding)を用意した。
f:id:ensekitt:20180928012543j:plain

問題設定

CSV形式のデータセットの中にはカテゴリで表現されるデータが含まれていた。
そこで、あるカテゴリに含まれるか否か?という系列に変換することにした。
カテゴリで表現されるデータのpd.Series(データフレームの1列)を引数にして
カテゴリごとに含まれるか否か?のBooleanが格納されたpd.DataFrameを返す関数を作成する。

例題

ラスベガスのホテルに関するレビューのデータセットがあったのでこちらを利用させていただく
UCI Machine Learning Repository: Las Vegas Strip Data Set
LasVegasTripAdvisorReviews-Dataset.csv
というセミコロン(;)区切りのデータをダウンロードして、作業ディレクトリに配置する。
この中に5段階のスコアを表すScoreというSeriesが含まれているのでコレをOne Hot Encodingして
Score-1 Score-2 Score-3 Score-4 Score-5という系列のDataFrameにする。
DataFrameにした後は結合して使えば良い。
イメージ的にはこんな感じ↓
f:id:ensekitt:20180928012403j:plain:w640

コード

関数のコード

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

def one_hot_encoding(series):
    le = LabelEncoder()
    lvl = le.fit_transform(series)

    ohe = OneHotEncoder()
    enced = ohe.fit_transform(lvl.reshape(-1,1)).astype(int)
    names = [(series.name+"-")+str(s) for s in le.classes_]
    r_df = pd.DataFrame(index=series.index, columns=names, data=enced.toarray(), dtype=bool)
    return r_df

使い方(関数のコードは実行済とする)

import pandas as pd

df = pd.read_csv('LasVegasTripAdvisorReviews-Dataset.csv', ';')
one_hot_encoding(df.Score)

f:id:ensekitt:20180928011029p:plain

うれしさ

一度用意しておくと便利で嬉しい。

参考文献

UCI Machine Learning Repository: Las Vegas Strip Data Set
Moro, S., Rita, P., & Coelho, J. (2017). Stripping customers' feedback on hotels through data mining: The case of Las Vegas Strip. Tourism Management Perspectives, 23, 41-52.

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。