この記事は、Elixir Advent Calendar 2024 シリーズ9 の6日目です
【本コラムは、10分で読め、5分で試せます】
piacere です、ご覧いただいてありがとございます
pandasのget_dummiesは、AI・LLMの前処理における「ワン・ホット・エンコーディング」、つまり「ダミー値処理」を実現します
これにより、数値しか行列処理では扱えないAI・LLMに対し、数値以外の値(カテゴリ値と言います)のバリエーションごとにデータの数値化を行うことで、行列処理を可能とし、傾向分析を可能とします
たとえば、下記マップリストのc1/c3キーをダミー値処理すると、下記の結果のように、c1/c3の値が数値化されます(なお簡略化のため、今回はget_dummiesのように値のバリエーションごとに列生成せず、元の列の値を通番で数値化しています)
maplist = [
%{"c1" => "v1", "c2" => 2, "c3" => true},
%{"c1" => "v1", "c2" => 5, "c3" => false}
]
keys = ["c1", "c3"]
結果:[
%{"c1" => 0, "c2" => 2, "c3" => 0},
%{"c1" => 0, "c2" => 5, "c3" => 1}
]
これを実装すると、こんなコードになります
maplist = [%{"c1" => "v1", "c2" => 2, "c3" => true}, %{"c1" => "v2", "c2" => 5, "c3" => false}]
keys = ["c1", "c3"]
Enum.reduce(keys, maplist, fn key, acc ->
categories =
Enum.map(maplist, & &1[key])
|> Enum.uniq
|> Enum.with_index
|> Enum.into(%{})
acc
|> Enum.map(& Map.put(&1, key, categories[&1[key]]))
end)
結果:[
%{"c1" => 0, "c2" => 2, "c3" => 0},
%{"c1" => 0, "c2" => 5, "c3" => 1}
]
コード解説ですが、全体としては、ダミー値処理を各キーごとに行い、ダミー値化した結果をaccに積み続けます
最初に、各キーごとに、カテゴリ値に値のバリエーションをEnum.uniqでユニーク化し、Enum.with_indexで通番化された数値を付与したものを、下記のように値をキーとして通番を値として返せる categories
として保持します
categories = %{"v1" => 0, "v2" => 1}
categories = %{false: 1, true: 0}
次に、Enum.mapでマップリストを回し、各マップをMap.putを使ってダミー値化した値を categories
から取り出して、マップの値を置き換えます