某所の【練習問題】Jリーグの観客動員数予測を試してみていたのですが、対戦相手のデータをOne-Hotエンコーディングしようとした時、訓練データにあって検証用データにないチームがありました。それだと便利な関数一発でのOne-Hotエンコーディングではカラム数が違って上手くいかず…
なので自力でOne-Hotエンコーディングしようしたのですが割と苦戦してw
もっといい方法があるかも知れませんが、ひとまずこの力尽く技は割と汎用性有りそうですし折角成功したのでメモも兼ねて。
import numpy as np
import pandas as pd
df1 = pd.read_csv('train.csv') #CSVをDataFrame化
df2 = pd.read_csv('train_add.csv') #CSVをDataFrame化
orgdata = pd.concat([df1,df2]) #CSVデータのDataFrameを結合
orgdata.reset_index(inplace=True) #インデックス振り直し(これで少しハマった)
orgdata.drop(['index'],axis=1,inplace=True) #「index」というカラムで前のインデックス値が残るので落とす
temp = orgdata['away'] #対象データとして今はこれだけで
tmp = orgdata['away'].unique() #One-Hotエンコーディングを施したい列の値一覧、つまりユニークな値一覧を変数に作成
awaylist = pd.DataFrame(tmp,columns={'list'}) #カラム名を「list」とし、値一覧をDataFrame化
for r in range(len(temp)): #列数分回す
name = 'away_oh_' + str(awaylist[awaylist.list==temp['away'][r]].index[0]) #値一覧のインデックス値を使ってカラム名を作成
if not name in temp.columns: #対象DataFrameに対して当該カラムの存在確認
temp[name]=0 #無ければ作成しゼロで初期化
temp[name][r] = 1 #目的のカラムののデータ行に1を立てる。
ただこのままだと結局訓練データ、検証データそれぞれに存在する値(ここではチーム名)のカラムしか作成されないので結局合わないですね。
実際にやるときの前処理としては先にユニークな値一覧(ここではawaylist)に存在する値分のカラムを訓練データと検証データ双方に作る必要がありますね。