Fluxを使って、ニューラルネットワークを組み生存者予測をしてみるっていう試みの時に使ったダミー変数の取得関数をもう少し改良して、汎用性を高めてみました。
実行環境
- windows 11
- julia 1.8
- CSV v0.10.4
- DataFrames v1.3.4
参考サイト
Julia DataFrames – How to do one-hot encoding?
[julia]関数の引数としてデータフレーム列名を使用する方法
How to pass Column Name as an argument to Julia DataFrame?
前回のコード
以前のFluxとニューラルネットワークを使ってみたかった時に組んだ関数は、参考サイトのものを使って、ダミー変数を取得したいcolumnを直接指定していました。
function getdummys(df)
tempdf = deepcopy(df)
ux = unique(tempdf.Sex);
transform!(tempdf, @. :Sex => ByRow(isequal(ux)) .=> Symbol(:sex_, ux));
ux = unique(tempdf.Pclass);
transform!(tempdf, @. :Pclass => ByRow(isequal(ux)) .=> Symbol(:pclass_, ux));
select!(tempdf,Not(:Sex))
select!(tempdf,Not(:Pclass))
end
タイタニック号のデータで、性別とPclassのダミー変数を取得するためだけに作りました
けど、これでは、ほかのデータやcolumnには対応できないという致命的な欠点があります。
そこで今回はこれを改良
汎用性を持たせた改良
改良するにあたり、やりたいことはただ一つ!「変換したいcolumnを指定したい」ということです。
ここで問題になるのは、関数の引数として、データフレームのカラム名をどうやって渡すか?
function foo(df,col)
df.col
end
こんな風にやったらできるかなーなんて試してみましたが、エラーが出ます。
これを解消するために”Symbol”を使います。
Symbolの詳しいことについて知りたい方は、ドキュメントを読んでください。
Metaprogramming · The Julia Language
初期に作った関数のcolumn名を指定する場所をSymbolを使って表現作り直します。
function getdummies(df,col)
tempdf = deepcopy(df)
cname = Symbol(col)
ux = unique(tempdf[!,cname]);
transform!(tempdf, @. cname => ByRow(isequal(ux)) .=> Symbol(cname,"_", ux));
select!(tempdf,Not(cname))
end
これで、任意のデータフレームの任意の列のダミー変数を取得することができるようになりました。
もう少し違うやり方があれば誰か教えてください~
コメント