ブラウザだけで機械学習サービスを体験しよう[Google Prediction API編]

株式会社あゆたの長尾です。

最近は機械学習に関するニュースを耳にする機会も多いですが、自分もそろそろ仕組みを理解しないといけないかなと考えて、先週からCourseraの機械学習を始めました。

この記事では、自分のように機械学習の初学者の方や、まだ何もやっていないという方に向けて、機械学習を実際に体験できるサービスの簡単な使い方と、使ってみた所感をまとめています。

このシリーズで使用する予定のサービスは3つです。

  • Google Prediction API
  • Amazon Cloud Machine Learning
  • Microsoft Azure Machine Learning

すべてブラウザで完結するので、手軽に利用することができます。
サンプルのデータも用意しているのでぜひ実際に利用してみてください。

今回はGoogleのサービスであるPrediction APIを使用します。

Prediction APIとは
  • 2011年のGoogle I/Oで発表されたサービスで、今回紹介するサービスの中では一番歴史があります。
  • 数値予測または分類の推測が可能です。
    このAPIでは、訓練データの1つめのカラムに数値が入力されていれば数値予測、文字列が入力されている場合は分類の予測と判断されます。
    • 数値分析では回帰分析が使用されます。
    • 今回は数値予測を使用しますが、分類の推測に興味が有る場合は公式のチュートリアルからどうぞ
  • 最初6ヶ月は教育データを5MB/日、100予測/日の制限内で無料です
予測のテーマについて

今回は、弊社がある千代田区岩本町付近の1K賃貸の賃料の予測を行います。

インプットを①居住階②住居の面積③築年数④所在地とし、アウトプットは1月あたりの賃料です。

データの取得方法として賃貸物件検索サイトから、岩本町にある1Kの賃貸を部屋ごとに検索し、家賃、管理費、敷金・礼金を計算した(※)1月あたりの賃料、居住階と住居の面積、築年数と所在地を取得しました。
スクレイピングツールを使い、1599件分収集しています。
※ 更新月を24ヶ月後と仮定し、
管理費を含む月々の家賃 + {(敷金 + 礼金) / 24}を1月あたりの賃料としています。

こちらのスプレッドシートから、ファイル > 形式を選択してダウンロード > カンマ区切りの値(.csv)を選択してダウンロードください。
このまま利用できるよう、ヘッダー行は抜いてありますがファイルは以下の内容になっています。
1行目:1月あたりの賃料, 2行目:居住階, 3行目:住居面積, 4行目:築年数, 5行目:住所

事前準備

Google Cloud Platform(以下GCP)にログインし、空のプロジェクトを用意して下さい
課金は発生しませんが、クレジットカードの登録が必要になります。

訓練データのアップロード

まず、予測の教育データとしてcsvファイルが必要なため、GCP上のStorageにバケットを作成し、csvファイルを格納します。upload_bucket

※ 自前のcsvファイルを利用する際は形式にご注意ください。
https://cloud.google.com/prediction/docs/developer-guide#data-format

Prediction APIを有効にする

GCPのコンソール画面上部の検索窓でPrediction APiを検索し、「有効にする」を選択します。abled<em>prediction</em>api

訓練モデルの作成

API explorerを使用し、Prediction API > prediction.trainedmodels.insertを選択します。

以下の項目を設定し、Excuteを選択してください。

  • 右上のAuthorize requests using OAuth 2.0をONに設定
  • project:作成したプロジェクトのID(GCPのダッシューボートトップにある"ID:"以降の文字列)
  • Request body:テキストフィールドをクリックし
    • add a property > id > 任意の文字列を入力
    • add a property > storageDataLocation > アップロードしたbucket名/ファイル名api_input

Execute実行時に、画面下のResponseが200となれば成功です。

200

- Show headers -

{
 "kind": "prediction#training",
 "id": "test_apartment",
 "selfLink": "https://www.googleapis.com/prediction/v1.6/projects/*****/trainedmodels/test_apartmen",
 "storageDataLocation": "*****/apartment_no_header.csv"
}
学習モデルの進捗を確認

学習の完了には少し時間がかかります(今回のケースでは数分)が、進捗の確認を行うことができます。

引き続きAPI explorerを使用し、Prediction API > prediction.trainedmodels.getを選択し、以下の入力を行います。

  • 右上のAuthorize requests using OAuth 2.0をONに設定
  • project:作成したプロジェクトのID(GCPのダッシューボートトップにある"ID:"以降の文字列)
  • id:insertで指定したID get_insert

Execute実行時に、画面下のResponseが200となっていて、 "trainingStatus"が"DONE"ならばこのモデルは使用できる状態になっています。

200

- Show headers -

{
 "kind": "prediction#training",
 "id": "test_apartment",
 "selfLink": "https://www.googleapis.com/prediction/v1.6/projects/*****/trainedmodels/test_apartment",
 "created": "2016-04-08T09:06:25.996Z",
 "trainingComplete": "2016-04-08T09:07:15.392Z",
 "modelInfo": {
  "numberInstances": "1599",
  "modelType": "regression",
  "meanSquaredError": "53452992.75"
 },
 "trainingStatus": "DONE"
}
作成したモデルを使用して予測を行う

今回のインプットは①居住階②住居面積③築年数④住所でした。
その情報を基に、家賃の価格を予測してくれることを目標にしています。

引き続きAPI explorerを使用し、Prediction API > prediction.trainedmodels.predictを選択し、以下の入力を行います。

  • 右上のAuthorize requests using OAuth 2.0をONに設定
    • project:
      作成したプロジェクトのID(GCPのダッシューボートトップにある"ID:"以降の文字列)
  • Request body:
    テキストフィールドをクリックし
    • add a property > input > csvInstanceを選択します。
      csvInstanceの中にある+のボタンをクリックし、インプットとなるデータの要素数分フィールドを追加します。 predict_input

今回は岩本町にある3階の22㎡で築10年の物件の家賃を予測してもらいました。
outputValueとして算出された100847.721315(円)が予測値となります。

200

- Show headers -

{
 "kind": "prediction#output",
 "id": "test_apartment",
 "selfLink": "https://www.googleapis.com/prediction/v1.6/projects/*****/trainedmodels/test_apartment/predict",
 "outputValue": "100847.721315"
} 

入力値を変えて予測をしてみると、築年数は若いほど、面積は広いほど、居住階は高いほど一月あたりの賃料は高くなると予測され、そこまでおかしな予測はしていなさそうです。

分析の内容を確認する

具体的な分析の結果は、API explorerの、Prediction API > prediction.trainedmodels.analyzeで確認できます。

  • 右上のAuthorize requests using OAuth 2.0をONに設定
    • project:
      作成したプロジェクトのID(GCPのダッシューボートトップにある"ID:"以降の文字列)
  • id:insertで指定したID analyze_input

Responseが200となっていれば成功です。

以下の結果が返ってきました。
この数値予測では回帰分析を使用していますが、meanは平均値、varianceは分散の意味です。

200

- Show headers -

{
 "kind": "prediction#analyze",
 "id": "test_apartment",
 "selfLink": "https://www.googleapis.com/prediction/v1.6/projects/*****/trainedmodels/test_apartment/analyze",
 "dataDescription": {
  "outputFeature": {
   "numeric": {
    "count": "1599",
    "mean": "107920.97",
    "variance": "139023634.99"
   }
  },
  "features": [
   {
    "index": "0",
    "numeric": {
     "count": "1599",
     "mean": "7.78",
     "variance": "34.13"
    }
   },
   {
    "index": "1",
    "numeric": {
     "count": "1599",
     "mean": "24.59",
     "variance": "13.64"
    }
   },
   {
    "index": "2",
    "numeric": {
     "count": "1599",
     "mean": "12.40",
     "variance": "17.46"
    }
   },
   {
    "index": "3",
    "categorical": {
     "count": "1599",
     "values": [
      {
       "value": "東京都中央区日本橋小伝馬町",
       "count": "2"
      },
      {
       "value": "東京都中央区日本橋本町4",
       "count": "1"
      },
(略)
まとめ

Prediction APIについてのまとめです。

1列目にかならず予測のターゲットを入れなくてはいけないという訓練データの成約があるので、ターゲットを変更したくなっても、データを編集して再び訓練をし直す必要があるため、取り回しはききにくいかなと感じました。

ただ、簡単に利用できるので、カジュアルに予測サービスを試してみる分にはよさそうです。
またドキュメント群ももちろんですが、フォーラムにも情報が蓄積しているので、不明な点が調べやすく、利用していて困ることはありませんでした。

次回はAmazon Machine Learningを扱います。