Amazon Machine Learning Recipeまとめ

2015.06.21

平田です。最近は 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」を選択します。

150621-0003

すると、次の画面の右側に自動的に作成されたRecipeが表示されます。

150621-0002

この部分を独自のRecipeに変更することで、モデルに入力される訓練データの形式をカスタマイズすることができます。

Recipeのフォーマット

RecipeはJSONフォーマットで書かれており、以下のように大きく分けて3つの区分から構成されています。

{
"groups": { ... },
"assignments": { ... },
"outputs": [ ... ]
}

ここでは、それぞれの区分で何を行っているのかを解説していきます。

group

入力項目のグループ化を行います。
グループ化された入力項目はまとめて変換されたり、あるいはそのまま出力として指定されます。

グループ化を行う場合には、複数の入力に対してgroupgroup_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

最終的に出力したい結果を指定します。 groupassignmentで定義したグループ名や変数名を指定できます。
また、ここで入力項目やグループなどに変換処理を指定すれば、変換された結果が出力となります。

outputは、以下のような形式で記述されます。

“outputs” [
“All_Categorical_plus_one_other //groupで定義したグループ名”,
“email_subject_lowercase        //assignmentで定義した変数名”,
"age                            //入力項目そのまま",
"quantile_bin(age, 10)          //入力項目に変換処理を加えた結果"
]

※Recipeでは、上記の例のようにoutput内にコメントを記述することもできます。

データ変換

ここでは、AMLが用意しているデータ変換について紹介していきます。 データ変換を行うためには、以下のように入力項目に対して関数を適用するように指定します。

“lowercase(email_subject)”

データ変換は、assignmentoutputで行うことができます。

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