データ変換とは?
一般的に機械学習を行う場合、テキスト等の非定形データは直接扱うことはできない
その為、それらのデータから特徴抽出をして、特徴ベクトルデータを得る必要がある。これがデータ変換。
特徴ベクトルデータは、キーが文字列・値が数値のkey-value型のデータ
このデータ変換により、自然言語・画像・音声データを統一的に扱う事が可能になる
Jubatusはこの変換機能を有し、設定ファイルで柔軟にカスタマイズできる。
データ変換の流れ
①クライアントが学習データからdatum(学習データの元)を生成しサーバに渡す。
②サーバはdatumにフィルター処理をする。
③サーバはフィルター処理されたdatumに特徴抽出処理(重み付け)をして特徴ベクトルデータを得る
サーバにおけるフィルター処理について
クライアントから提供されるdatumはkey:value型データ。keyは文字列。
valueのデータは以下3種類があり。
1) 文字列
2) 数値
3) バイナリデータ
フィルター処理は、datumを入力として指定ルールに基づき新たなdatumを生成し、学習対象データに追加する。
例) 参考URLの例では、クライアントが生成したdatum(message)にHTMLタグ除去処理をして、別keyでdatum(message-detagged)を追加している。
フィルター処理は、datumの種類により異なる。本記事では文字列データの処理について記載する。(数学が苦手だから。。。)
設定ファイル内の以下パラメタで実現
stiring_filter_types
変換ルールを定義
例)
"string_filter_types": { "detag": { "method": "regexp", "pattern": "<[^>]*>", "replace": "" } },
やっている事は以下の通り
①"detag"という名前でHTMLタグを除去するフィルタを定義
②"method"で正規表現をするフィルタ"regexp"を指定
③"pattern"でパターンマッチを指定
④"replace"でパターンにマッチした場合の置換ルールを指定
"detag"はユーザー定義データ
"method"、"pattern"、"replace"に指定可能なパラメタは他にもあり。詳細は参考URLを参照。
フィルタ・変換ルールのみ定義。どのdatumに適用するかは、ここでは定義しない。
string_filter_rules
stiring_filter_typesで定義されたルールをdatumに適用し学習対象となる新datumを追加する。
例)
"string_filter_rules": [ { "key": "message", "type": "detag", "suffix": "-detagged" } ]
やっている事は以下の通り
①"key"でフィルタ処理対象にするdatumを指定。
※"message"はクライアント側プログラムで学習データからdatumを生成する時に定義されている。
②"type"でstiring_filter_typesで定義した変換ルール"detag"を指定。
③"suffix"で新しく生成されるdatumのkey値生成を生成。
結果、以下のdatumが作成され学習対象として追加される。
key: message-detagged
value: タグ除去されたデータ
上記例にはないが、"except"パラメタを利用してマッチ除外条件の指定も可能。
サーバにおける特徴抽出処理(重み付け)について
この処理をdatumに行い、特徴ベクトルデータを得る。
設定ファイル内の以下パラメタで実現
string_types
重み付けルールを定義
例)
"string_types": { "bigram": { "method": "ngram", "char_num": "2" } },
やっている事は以下の通り
①"bigram"という名前の重み付けルールを定義
②"method"で重み付けアルゴリズム("ngram")を指定
ngramは隣接するN文字を特徴量として利用するアルゴリズム。(このような特徴量をN-gram特徴と呼ぶ)
③"char_num"は②で指定したアルゴリズムのオプション。ngramの隣接するN文字のNを指定。
"bigram"はユーザー定義データ。
"method"、"method"に指定可能なパラメタは他にもあり。
詳細は参考URLを参照。
重み付けルールのみ定義。どのdatumに適用するかは、ここでは定義しない。
string_rules
string_typesで定義されたルールをdatumに適用し重み付けをする。
例)
"string_rules": [ { "key": "message", "type": "bigram", "sample_weight": "tf", "global_weight": "bin" }, { "key": "message-detagged", "type": "space", "sample_weight": "bin", "global_weight": "bin" } ]
やっている事は以下の通り
①"key"で適用するdatumを指定。
②"type"でstring_typesで定義したアルゴリズム"bigram"を指定
③"sample_weight"で重み付けする値を決定。
"bin"の場合は常に1とする。
"tf"の場合は、datumの文字列中の出現回数で重みづけする。
④"global_weight"で今までの通算データから算出される大域的な重み付けを指定。
"bin"の場合は常に1とする。
今日はここまで!
特徴抽出処理あたりからよく分からない。。。。
サンプルプログラムで動きをみてみよう。