Juliaでダミー変数を取得するgetdummies関数を作ってみた。

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

これで、任意のデータフレームの任意の列のダミー変数を取得することができるようになりました。

もう少し違うやり方があれば誰か教えてください~

コメント

タイトルとURLをコピーしました