機械学習の場合は問題を解くのが逆になります。ねじが不良かもしれないあらゆる論理的なルールをこちらで用意するのではなく、コンピュータにあらゆるデータを見せるのです。
たとえば、良品のねじのイメージを 5,000 枚、人間の作業者が何らかの理由で廃棄したねじのイメージを 5,000 枚見せます。そして、不良品を見分ける方法をコンピュータに考えさせます。コンピュータは “機械” であり、データに基づいて判断方法を “学習” します。
ニューヨーク市のタクシー需要の予測
あなたはニューヨーク市にあるタクシー会社の配車責任者で、次の木曜日に何人の運転手に出社してもらうかを決めなければならないものとします。
あなたは、ニューヨークのタクシーに関する何らかの知識を持っています。たとえば、需要は曜日によって変わる(木曜日の需要は月曜日の需要とは異なる)とか、木曜の天気予報によって変わるといったことです。これらが予測子となります。予測子とは、予測のために使う情報のことです。
何を予測したいのかということも、はっきりさせておかなければなりません。たとえば、特定の日に出勤を依頼するタクシー運転手の数を予測するものとしましょう。いつもと同じような割合でタクシー需要を手に入れられると想定し、それだけの数の運転手に出勤を依頼するものとします。これがあなたの機械学習問題です。
予測子とターゲット
Google BigQuery パブリック データセットには、ニューヨーク市全体のタクシー利用実績のデータ(nyc-tlc:green テーブル)と NOAA 気象データ(fh-bigquery:weather_gsod テーブル)が揃っています。これを入力データセットとして使うことにします。
タクシー利用実績は実際の需要の代用品に過ぎません。タクシーの数が足りなかったり、タクシーが需要のある地域から市内の他の地域に出て行ったりしていれば、実際に走っているタクシーよりも需要は多いかもしれません。
しかし、ニューヨークのタクシー市場が効率よく機能していると仮定すれば、このデータセットは出発点として役に立つはずです。タクシーの配車とは無関係だとか、天気以外の要素で配車を決めているという場合には、独自の履歴データを BigQuery にロードしてください。
Google Cloud Datalab からは、天気データベースに対して BigQuery クエリを発行し、Python で使える形式で結果を受け取ることができます(詳しいコメント付きの
Datalab の完全なノートブックは、GitHub から入手できます)。
同様に、
BigQuery クエリを使用すれば、daynumber(1 年を通して何日目かを示すもので、たとえば daynumber=1 は元日になります)からその日のタクシー利用数が得られます。
天気と利用実績のデータセットをマージすると、機械学習に使用するデータセットが完成します。
これが私たちの履歴データです。この履歴データを使って、天気からタクシー需要を予測できるようにします。
ベンチマーク
機械学習を実行するときはベンチマークを用意しておくと役に立ちます。ベンチマークは、単純なモデルでも直感で得られた値でもかまいません。機械学習モデルと単純なモデルをテスト データセットに対して実行すれば、機械学習モデルがベンチマークよりも優れているかどうかを評価できます。
テスト データセットを作るには、すべての訓練データを集めたうえで、それを 80 対 20 に分割します。そして 80 % のデータでモデルを訓練し、残りの 20 % を使って機械学習モデルの需要予測がどれぐらい正確かを評価します。
ベンチマークとしては、たとえば全時間を通じてのタクシー需要が使用できます。ただの平均よりも正確な予測ができれば、機械学習モデルは “できるやつ” だと考えることができます。
モデルの性能は二乗平均平方根誤差(RMSE)で計測します。解決しようとしているビジネス問題に適切な尺度が他にあれば、それを使ってかまいません。たとえば、その日に出勤させた運転手の数が少なすぎたり多すぎたりしたために生じた売上げの減少を計算し、それを尺度として使用するのです。
平均を使ったときの RMSE が 12,700 なので、機械学習が目指す目標はこの値になります。つまり、RMSE を 12,700 よりも小さくしようということです。
TensorFlow
TensorFlow は、2015 年に Google が
オープンソース化したソフトウェア ライブラリです。TensorFlow はニューラル ネットワーク、それも深いニューラル ネットワークを使って機械学習を行う点で優れています。ニューラル ネットワーク アーキテクチャは、
TensorFlow プレイグラウンドで試すことができます。
下のコードを見ると怖じ気づいてしまうかもしれませんが、ほとんどはボイラープレートです(完全なコードについては
Datalab ノートブックを参照してください。現在アルファ テスト中の
Google Cloud Machine Learning は、Datalab で同じことをもっと単純に実行する方法を提供します)。
ここでは、隠れ層を 1 つ入れ(サンプル数が数百万もあるわけでなく、たかだか数百日分なので、階層の数を制限しています)、活性化関数としては
正規化線形関数(ReLU)を使い、出力ノードは ID ノードに設定します(これは回帰問題であり、分類問題ではないためです)。
モデルを保存し、テスト データセットに対して実行してみると、ベンチマークよりも良い成績を出していることがわかります。
RMSE は 約 8,200 で、単純に平均を使ったときの 12,700 と比べてかなり良くなっています。
訓練したモデルの実行
ひとたびモデルを訓練してしまえば、新しい予測子データを対象にモデルを実行するのはごく簡単なことです。たとえば、今後 3 日間の天気予報データがあるとします。ニューラル ネットワークに予測子変数(曜日、最低・最高気温、降水量)を渡せば、今後 3 日間のタクシーの需要予測が返されます。
水曜日(day=4)には一部の運転手に休暇を取るよう指示し、木曜日(day=5)には全員に出勤するよう指示した方がよさそうです。通常、木曜は “鈍い” 日ですが(ニューヨークのタクシー需要は週末がピークです)、今度の木曜日は天候上の理由から需要が高くなると、機械学習モデルが言っているからです。
Google Cloud Platform(GCP)によって需要予測の問題は特に簡単に解決できるようになりました。
Cloud Datalab は、
BigQuery、Pandas、TensorFlow と密に統合されたインタラクティブな Python ノートブックを提供しています。
GCP 上のパブリック データセットには、NOAA による気象観測の履歴データが含まれています。
GCP とビッグデータ、機械学習機能についてもっと学びたい方は、
訓練コースへの登録をお勧めします。
0 件のコメント :
コメントを投稿