0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

自力One-Hotエンコーディング

Posted at

某所の【練習問題】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)に存在する値分のカラムを訓練データと検証データ双方に作る必要がありますね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?