Amazon Machine Learningを試した・・・けれど上手くいかなかった

AWS（Amazon Web Services）から機械学習サービス「Amazon Machine Learning」がリリースされたので、早速試してみました。
結論から述べると、期待する結果を得ることはできませんでした。ですので、以下の情報は参考程度にどうぞ。

# Amazon Machine Learningとは？

AWSが提供する機械学習サービスです。2015年4月9日に発表されました。詳しくは公式情報をどうぞ。

- 公式サイト: [Amazon Machine Learning](https://aws.amazon.com/jp/machine-learning/)
- 公式ブログ（英語）: [Amazon Machine Learning – Make Data-Driven Decisions at Scale | AWS Official Blog](https://aws.amazon.com/jp/blogs/aws/amazon-machine-learning-make-data-driven-decisions-at-scale/)
- 公式ブログ日本語訳: [Amazon Web Services ブログ: 【AWS発表】Amazon Machine Learning - Data-Driven Decision at Scale]
(http://aws.typepad.com/aws_japan/2015/04/amazon-machine-learning.html)

# 学んだこと・感じたこと

ざっとAmazon Machine Learningを触ってみて、学んだこと、感じたことを列挙しておきます。
なお、今回はWebブラウザ経由でのみ評価し、APIについては触っていません。

- 現時点では、日本語で構成された短文の2値分類は機能すると言えない。
- 日本語の処理自体には対応している模様。
  - データセットに含まれる日本語のキーワードの抽出が機能していることからの類推。
  - また、全角英字が小文字に変換される。
- データセットのインポート、モデルの学習・評価は、処理が始まれば短時間で処理される。
  - だが、処理キューに入っている時間は長め。
- Webブラウザ上から評価データを入力することが出来ず不便。
  - 毎回、S3を経由して評価データを入力する必要がある。
- （当たり前ですが）入力データの前処理（クレンジング）が必要。
- 入力データは、予めシャッフルが必要。
  - 先頭70%が学習データに、30%が評価データに用いられる。

# 評価

## 目標

今回は「ニュース記事のタイトルから、それが鉄道関連であるか、そうでないかを分類する」ことを目標に、Amazon Machine Learningによる学習、予測を行ってみました。

## 入力データ

入力データには137,377件のタイトルを用いました。鉄道関連が6,319件、それ以外が131,058件です。
「鉄道関連」（1）、「それ以外」（0）という値を含むBinary型の列と、タイトルを含むText型の2列の入力データとしました。
タイトルは日本語で記述され、最小7文字、最大47文字、平均23文字です。
なお、Amazon Machine Learningのデフォルトでは、入力データのうち70%を学習データに、30%を評価データに用います。

## モデル

今回は「鉄道関係」「それ以外」の2値分類を行うため「Binary Classification」を用いました。

## 結果（スコア）

入力データをモデルに与え、待つこと数分。評価した結果のスコア（AUC: Area Under Curve）は「0.59」でした。
AUCは0から1までの実数で、1に近いほど「正しく分類できている」ことを示します。
「0.5」が乱数による分類と等しく、それからすると「0.59」はかなり悪い値です。
また、実際「the ML models's quality score is considered poor for most machine learning applications.」とのエラーメッセージが表示されます。

AUCに関する説明を公式ブログより引用します：

> You can measure the quality of each of your models using a set of performance metrics that are computed and made available to you. For example, the Area Under Curve (AUC) metric monitors the performance of a binary classification. This is a floating point value in the range 0.0 to 1.0 that expresses how often the model predicts the correct answer on data it was not trained with. Values rise from 0.5 to 1.0 as as the quality of the model rises. A score of 0.5 is no better than random guessing, while 0.9 would be a very good model for most cases. But a score of 0.9999 is probably too good to be true, and might indicate a problem with the training data.

# 実験結果

その他の実験結果を残しておきます。
モデルの学習は、異なるデータセット3つで行いました。少しずつ件数を増やす形で評価しました。

## 入力データ1

- 「鉄道」2,000件、「それ以外」2,000件のタイトルデータを使用。サイズは0.3MB。
- Categorical型のカテゴリ列、Text型のタイトル列を入力。
- 自動的に「Multiclass Classification」となった。
- 評価スコア「Average F1 score」は「0.75」。
  - ただしこれは、入力データに偏りがあったことにより生じた値と思われる。
  - 「鉄道」「それ以外」を単純に結合したデータを用いたため、評価データ（30%）がすべて「それ以外」となってしまっていた。
- 学習時間は28秒、評価時間は5秒。

この入力データだけ実際に予測を行ってみたが、すべて「それ以外」となってしまった。

## 入力データ2

- 「鉄道」3,000件、「それ以外」3,000件のタイトルデータを使用。サイズは0.4MB。
- 全角英数字・記号を半角化する前処理を実施。
- 自動的に「Binary Classification」となった。
- 評価スコア「AUC」は「0.54」。
- 学習時間は27秒、評価時間は4秒。

## 入力データ3

- 「鉄道」6,319件、「それ以外」131,058件のタイトルデータを使用。サイズは9.2MB。
  - 手持ちのデータ全部です・・・。
- 自動的に「Binary Classification」となった。
- 全角英数字・記号を半角化する前処理を実施。
- 評価スコア「AUC」は「0.59」。
- 学習時間は2分20秒、評価時間は7秒。