Amazon Machine Learning Recipeまとめ
平田です。最近は Amazon Machine Learning (AML)で遊んでいます。 今回はAMLに用意されている、Recipeと呼ばれるデータ加工機能について紹介します。
AMLでのデータ加工とRecipe
機械学習において、訓練データの事前加工は骨の折れる作業の一つとしてよく挙げられます。 AMLでは、データの加工処理について二つの方法を用意しています。
- 事前にユーザが訓練データを望ましい形に加工する
- 訓練データからDataSourceを作成した後、Recipeを用いて加工する
2番目のRecipeを用いた加工を行えば、AMLが用意してくれた変換方法を利用して、複数の変数に対するグルーピングや変換処理を一括で行うことができます。
また、AMLではデフォルトでDataSourceの統計情報から自動的にRecipeが作成・適用されます。 このRecipeを読めるようになれば、AMLが構築したモデルに対する理解の足がかりになります。
Recipeの作成・確認方法
Recipeを作成・確認するためには、モデル構築のウィザードでDataSourceを選択した後、「Traning and evaluation setting」の項目で「Custom」を選択します。
すると、次の画面の右側に自動的に作成されたRecipeが表示されます。
この部分を独自のRecipeに変更することで、モデルに入力される訓練データの形式をカスタマイズすることができます。
Recipeのフォーマット
RecipeはJSONフォーマットで書かれており、以下のように大きく分けて3つの区分から構成されています。
{ "groups": { ... }, "assignments": { ... }, "outputs": [ ... ] }
ここでは、それぞれの区分で何を行っているのかを解説していきます。
group
入力項目のグループ化を行います。 グループ化された入力項目はまとめて変換されたり、あるいはそのまま出力として指定されます。
グループ化を行う場合には、複数の入力に対してgroup
やgroup_remove
を適用します。
以下のグループはデフォルトで定義されており、これに入力変数を追加・削除することで新しいグループを作ることもできます。
ALL_INPUTS
: 全ての入力のグループALL_TEXT
: 全てのテキスト型入力項目のグループALL_NUMERIC
: 全ての数値型入力項目のグループALL_CATEGORICAL
: 全てのカテゴリ型入力項目のグループALL_BINARY
: 全てのバイナリ型入力項目のグループ
groupは、以下のような形式で記述されます。
“groups”: { “Custom_Group”: “group(var1, var2)”, “All_variables_except_one”: “group_remove(ALL_INPUTS, var1)”, “All_Categorical_plus_one_other”: “group(ALL_CATEGORICAL, var2)” }
注意点として、グループ化する際には対象の入力項目が同じデータ形式(NUMERICやCATEGORICALなど)である必要があります。
assignment
変換処理を行った結果を一時的に名前をつけて保持します。 変換した結果を複数回再利用したい場合などに利用します。
assignmentは、以下のような形式で記述されます。
“assignments”: { “email_subject_lowercase”: “lowercase(email_subject)”, “email_subject_lowercase_ngram”:“ngram(lowercase(email_subject), 2)” }
outputs
最終的に出力したい結果を指定します。
group
やassignment
で定義したグループ名や変数名を指定できます。
また、ここで入力項目やグループなどに変換処理を指定すれば、変換された結果が出力となります。
outputは、以下のような形式で記述されます。
“outputs” [ “All_Categorical_plus_one_other //groupで定義したグループ名”, “email_subject_lowercase //assignmentで定義した変数名”, "age //入力項目そのまま", "quantile_bin(age, 10) //入力項目に変換処理を加えた結果" ]
※Recipeでは、上記の例のようにoutput
内にコメントを記述することもできます。
データ変換
ここでは、AMLが用意しているデータ変換について紹介していきます。 データ変換を行うためには、以下のように入力項目に対して関数を適用するように指定します。
“lowercase(email_subject)”
データ変換は、assignment
やoutput
で行うことができます。
n-gram
テキストをn-gramモデルに変換します。 n-gramモデルとは、ここでは単語ごとに分割された文字列に対して、指定された距離で隣接する組み合わせのことを指します。
例えば、“I really enjoyed reading this book” というテキストに対して2-gram変換を行った場合、以下のような結果となります。
{"I really", "really enjoyed", "enjoyed reading", "reading this", "this book", "I", "really", "enjoyed", "reading", "this", "book"}
変換結果には、n-gramだけでなく、nが指定された値以下の場合のn-gram変換結果も含まれているようです。 3-gramを指定した場合は、3-gram, 2-gram, 1-gramの変換結果が全て含まれます。 また、TEXT型に指定された入力項目は、Recipen-gram変換を指定しなくても、暗黙的に1-gramの変換処理が加えられます。
変換したい場合は、以下のように、第一引数に入力項目、第二引数にnの値(2-10)を指定します。
“ngram(var1, 3)”
Orthogonal Sparse Bigram (OSB)
指定された範囲で文章を区切り、その範囲内でそれぞれの単語の組み合わせから結果を出力します。
例えば"The quick brown fox jumps over the lazy dog"という文章に対して、範囲4でOSB変換を指定した場合、以下のように8つの区分が現れ、その中での単語2つの組み合わせが結果となります。
“The quick brown fox”, {The_quick, The__brown, The___fox} “quick brown fox jumps”, {quick_brown, quick__fox, quick___jumps} “brown fox jumps over”, {brown_fox, brown__jumps, brown___over} “fox jumps over the”, {fox_jumps, fox__over, fox___the} “jumps over the lazy”, {jumps_over, jumps__the, jumps___lazy} “over the lazy dog”, {over_the, over__lazy, over___dog} “the lazy dog”, {the_lazy, the__dog} “lazy dog”, {lazy_dog}
この際、2単語間の距離は"_"(アンダースコア)で表現されます。
変換したい場合は、以下のように、第一引数に入力項目、第二引数にnの値(2-10)を指定します。
“osb(var1, 3)”
小文字化
指定したTEXT型の文字列を小文字に変換した結果を出力します。
変換したい場合は、以下のように指定します。
“lowercase(var1)”
句読点除去
各単語の先頭や末尾に付与されている","(カンマ)や"."(ピリオド), "-"(ハイフン)などの文字列を除去します。
変換したい場合は、以下のように指定します。
“no_punct(var1)”
注意点として、"seat-belt"などの様に単語内に"-"(ハイフン)が含まれている場合などは、対象外となります。
Quantile Binning 変換
NUMERIC型の入力項目を、指定した数のCATEGORICAL型に変換します。 各カテゴリに変換される数値の範囲は、Targetと入力項目の関係から自動的に算出されます。
変換したい場合は、以下のように、第一引数に入力項目、第二引数にnの値(5-1000)を指定します。
“quantile_bin(var1, 50)”
正規化
NUMERIC型の入力項目に対して正規化を行います。
変換したい場合は、以下のように指定します。
“normalize(var1)”
AMLではデフォルトで数値の正規化は行わないため、数値のオーダーが異なる入力項目が複数ある場合は、正規化処理が必要となります。
直積
2つのTEXT型またはCATEGORICAL型の入力項目を組み合わせ、直積集合を新しくCATEGORICAL型として出力します。
変換したい場合は、以下のように指定します。
"cartesian(var1, var2)"
グループ化・データ変換機能一覧
今まで紹介してきたグルーピング・データ変換を以下の表にまとめてみました。
transformation | 入力型 | 出力型 | 説明 |
---|---|---|---|
group(var1, var2) | - | - | 複数の入力をグループにまとめる |
group_remove(group, var1) | - | - | グループから指定した項目を除く |
ngram(var, n) | TEXT | TEXT | n-gram形式に変換 |
osb(var, n) | TEXT | TEXT | OSB形式に変換 |
lowercase(var) | TEXT | TEXT | 小文字に変換 |
no_punct(var) | TEXT | TEXT | ピリオド(.)やカンマ(,)、ハイフン(-)などの文字を除去 |
quantile_bin(var, n) | NUMERIC | CATEGORICAL | 数値をn個のカテゴリに分割 |
normalize(var) | NUMERIC | NUMERIC | 数値を正規化 |
cartesian(var1, var2) | TEXT,CATEGORICAL | CATEGORICAL | 2つの値のデカルト積に変換 |
テキストに関する変換が多い印象ですが、残念ながら日本語には対応していないため、適用するためには分かち書きなどの前処理が必要となります。
quantile_bin
などは多項分類で自動生成されたRecipeなどに頻出します。
まとめ
AMLのRecipe機能についてざっくりと紹介しました。
AMLでデフォルトのままモデルを作成するときも、一旦Recipeを確認するようにすればAMLが何を考えているかが垣間見えて面白いかも知れません。
参考資料
Data Transformations for Machine Learning — Amazon Machine Learning Developer Guide