ML ボードの使い方(数値回帰タイプ)

ML Board How-To Guide

数値回帰モデルを利用した需要予測

はじめに

MLボードに用意された数値回帰モデルは、何らかの事象から数値を予測することに利用できます。例えば天候や曜日などから来場者数や販売数を予測したり、交通機関の利用者数を予測したりといった場合です。

   この機能はアルファ版です。アルファ版で作成した学習モデルは、ベータ版や正式版としてのリリース後も予測時に利用する際の互換性を保証するものではありません。ベータ版や正式版でのリリース後には、改めて学習モデルを作成しなおすことで動作します。ご注意ください。

最初に知っておくべきこと

予測因子

天候や曜日から販売数を予測する場合、予測のもとになる天候や曜日といったデータのことを予測因子と呼びます。この予測因子は、正確な予測を行うためにとても重要です。何らかの因果関係がある予測因子を正しく選択することで、予測精度は飛躍的に高まりもしますし、逆に選択を間違えてしまうと、まったく精度が出なくなります。

なので、数値回帰モデルによる予測を行う場合、まずはなぜこの商品を購入するのかといったことをよく考えなければなりません。必要に応じてデータを分析し、購買との関連が予測される因子を見つけ出す作業も必要です。そして適切なデータを因子とすることができれば、MLボードは販売数につながる特徴をつかむことができ、予測精度はとても高くなることでしょう。

ベンチマーク

予測因子の選択をするのと同時に、準備しておくべきなのは、ベンチマークです。ベンチマークとは、新しい予測の仕組みを作る前に準備しておく、精度の物差しです。この物差しを利用して、予測精度が高くなっているのかどうかを評価します。

予測数値を評価するということは、実際の数値とくらべてどのくらいバラつきがあるかということを調べることになります。一般的には、二乗平均平方根誤差(RMSE: Root Mean Square Error)がよく利用されます。

サンプルで解決する課題について

ここでは、電力会社が実際に公開している情報をもとに、電力使用量を予測する仕組みを構築してみます。

ところで電力消費との因果関係が想定される因子とは何でしょうか?

電気は、冷暖房や除湿に利用されるということを考えると、気温や湿度との関係が想定されます。

また照明に利用されるということを考えると、昼と夜の時間も影響があるのではないかと想定されます。

以上のことから、まずは気温・湿度・日の出から日の入りまでの時間を因子として予測をしてみたいと思います。

より精度をあげるためには、祝祭日の情報や、オリンピックなど大きなイベントの情報などを因子として入れたり、予測する地域を細分化し、地域的な特性を入れながら予測モデルを構築し、全体としての精度を上げていくなどの方法が考えられます。

MLボードを使った予測システム構築の流れ

実際にMLボードを使って予測を行う前に、おおまかな流れについて説明します。

  1. モデルの選択:需要予測なので、数値回帰モデルを選択します。MLボードのモデルは、今後拡張していく予定です。

  2. 予測因子に関する考察:何を予測因子にすべきかを考えることが、需要予測の肝です。しっかりと分析し考えましょう。今回は、まず入り口として気温・湿度・日中時間を因子としてみます。

  3. 学習データの作成:因子が決まったら学習データを作成します。学習データとは、MLボードに特徴がどこにあるのかを考えさせるデータです。今回の場合、気温・湿度・日中時間とその日の電力使用実績を学習データとします。このデータを与えてあげれば、 MLボードは気温・湿度・日中時間と電力使用量との関係を計算し、未来の気温や湿度、日中時間を渡すと電力使用量を予測してくれるようになります。

  4. 学習:データが準備できたら、MLボードに学習させます。学習にあたっては、最適化を自動的に行うことも実施します。これにより、幾つかのパターンを実行させ、最も精度の高い学習済モデルを利用できるのです。

  5. 評価:いったん学習が終われば、BLOCKSのビッグデータボードを利用して学習済みモデルを利用した予測を行うことができます。ここで学習に利用していないデータを使い、予測精度に関する評価をします。もし精度が十分でなければ、予測因子に関する考察から見直し、どんな因子をMLボードに見せるべきか、見せる場合にどのように見せたら良いのかからもう一度考えてください。

  6. 利用:実用的な学習済モデルが完成したら、BLOCKSのビッグデータボードを使って予測を行ったり、BLOCKSのIoTボードを使って継続的に因子データを収集して、より高い精度の予測を行えるようにしたりと、様々な応用を考えてみてください。そしてこうした一連の作業をBLOCKSで行っている限り、プログラムを作成したりインフラを構築したりといったことが大幅に削減でき、とても効率のよいシステム構築が行えるはずです。

学習のためのデータ作成

データについて

電力需要予測をするために、気象、日の出・日の入りを予測因子にしますが、幸いなことに公開されているデータがあるので、これを利用します。

  1. 気象:気象庁
  2. 日の出・日の入り: 国立天文台
  3. 電力使用量:東京電力パワーグリッド

それぞれ2016年のデータを学習に利用し、2017年のデータで予測精度を検証してみたいと思います。2017年の予測検証については、気象は実測値を入れて検証します。予測因子自体の正確な予測データがない場合、その因子を予測するモデルを作成する必要があるかもしれませんが、ここでは省略します。

予測因子としては、以下の5項目になります。

  • 最高気温
  • 最低気温
  • 日照時間
  • 平均湿度
  • 日中時間(日の出から日没までの時間)

予測対象は、日毎の電力使用量とします。

  • 電力使用量(日毎)

つまり気温・日照時間・湿度・日中時間とその日の電力使用量を見せることによって、MLボードに特徴を見つけさせます。うまく見つけることができると、気温・日照時間・湿度・日中時間を見せるだけで、電力使用量が予測できるようになります。

予測因子データ取得

気象データ

まず気象データを取得してみましょう。

気象データは、気象庁のホームページ からダウンロードできます。まずここから、東京の2016年1月 1日から2017年1月4日までの日最高気温、日最低気温、日照時間、日平均相対湿度をダウンロードしてみましょう。

東京電力管轄全体の電力消費量を予測するのに、東京都の気象データだけを因子にするのは正確性に問題があるのではないかと思われるかもしれません。もちろん、もう少しエリアを区切り、因子との関係を強くして学習させるということは効果があるかもしれませんが、まずは機械学習のスタート地点として、東京都の気象データで学習してみます。

ダウンロードする際の、表示オプションは以下を選択しています。

  • 利用上注意が必要なデータを表示させない
  • 観測環境などの変化以前のデータを表示させない
  • ダウンロードデータはすべて数値で格納
  • 曜日を表示(日別値)
気象庁ダウンロードページ
日の出、日の入りデータ

日の出・日の入りは、国立天文台のホームページ からダウンロードできます。 ここから同じく2016年1月 1日から2017年1月4日までの日の出・日の入りデータを取得しましょう。

国立天文台のデータは、CSV形式でダウンロードできないので、画面に表示されている内容をCSVにして下さい。このデータを元に日中時間を計算します。

電力使用量データ取得

電力消費量は、東京電力パワーグリッドのホームページ からダウンロードできます。ここからも2016年と2017年のデータをダウンロードしましょう。

このデータも国立天文台のデータと同様に、CSV形式でダウンロードできないので、画面に表示されている内容をCSVにして下さい。

学習データについて

必要なデータを全て取得したら、次に学習データを作成します。MLボードは、このデータを元に学習をはじめます。正しく学習させるために、データは次の2つに分けておく必要があります。

  1. 訓練データ:学習のために使われるデータ
  2. 検証データ:学習には利用せず、学習の検証に使います。こうすることで未知のデータに対する性能(汎化性能)をMLボードが評価できるようになります。

どちらのデータも、CSVファイル(カンマ区切りファイル)にしてください。ファイルフォーマットの基本的ルールは一つだけ。各行毎に、予測因子を並べて、最後に予測対象を置くことです。

なので、今回の例では、次のように並べていきます。

日最高気温, 日最低気温, 日照時間, 日平均相対湿度, 日中時間, 電力使用量

2つのファイルは、Google Cloud Storage (GCS )にファイル格納のための バケットを作成 して、そこに保存しておいてください。このドキュメントでは、 gs://magellan-blocks-doc-train/ に格納しますが、みなさんが作成する場合は、オリジナルの名前をつけてください。

学習データの作成方法

学習データを作成する一番簡単な方法は、Google SpreadsheetやExcelなどの表計算ソフトにデータを持ってきて、各カラムに因子を並べ、最後に予測対象がくるようにして表を作成。その表から CSVファイルを作成するだけでOKです。

とは言え、データ量が大きかったら表計算ソフトに入り切らないかもしれませんし、頻繁に使う場合などは自動化したいと思うかもしれません。そういう場合は、BLOCKSのビッグデータボードを使ってください。大量データを高速に処理することができますし、なによりも処理が自動化されます。

今回の例では、データ量的にはそれほど多くないのですが、自動化などを志向される方のためにも、ビッグデータボードで作成する方法を紹介します。

簡単にすませたいなぁ。と思う方は、表計算ソフトでちゃちゃっとやっても構いません。

データアップロード

ビッグデータボードにデータを入れるには、Google Cloud Storage (GCS)のバケットにファイルを入れておく必要があります。さきほども学習データは GCSに入れてくださいと言いましたが、その学習データを作るための準備も、GCSに基礎データを入れるところから始まるのです。

このドキュメントでは、バケット名とファイル名を以下のようにしました。このバケット名やファイル名は、自由に変えてもらっても構いません。

  • GCS バケット:gs://magellan-blocks-doc-data/
  • 各種データファイル名
    • 気 象 デ ー タ:weather_tokyo_utf8.csv
    • 日中時間データ(2016):sunrise_sunset_2016.csv
    • 日中時間データ(2017 ):sunrise_sunset_2017.csv
    • 電力使用量(2016):juyo-2016.csv
    • 電力使用量(2017):juyo-2017.csv

ちなみに全てのファイルは、コードをUTF-8にしておいてください。特に気象庁からダウンロードできるファイルはUTF-8ではないので注意してください。

UTF-8にするには、nkfなどのツールを使えば簡単に変換できます。

データをアップロードするには、以下のようにgsutil コマンドを利用します。

gsutil mb -c regional -l us-central1  gs://バケット名
gsutil cp アップロードするファイル gs://バケット名

例:

gsutil mb -c regional -l us-central1 gs://magellan-blocks-doc-data
gsutil cp weathertokyoutf8.csv gs://magellan-blocks-doc-data

gsutilのインストール方法については、こちら を参照してください。

ここまでできたら、必要なデータは全てBLOCKSに取り込める状態になりました。ではいよいよビッグデータ処理をはじめていきます。

ビッグデータボードへのデータ投入

BLOCKSのビッグデータボードは、BigQuery を利用して処理を行っています。BigQueryは、Googleが提供しているビッグデータ処理の基盤サービスで、データ量に制限を受けることなく利用できるだけでなく、処理速度は世界最速でありながら、価格が極めて安価であるという特徴があります。BLOCKS を使えば、こうしたBigQueryを手軽に利用できますので、MLボードの学習データ作成だけでなく、その前にデータを分析してみたいという人も、ぜひビッグデータボードを使ってBigQueryを活用してみてください。

さて、GCSにアップロードしたデータですが、これをBLOCKSのビッグデータボードで処理できるように読み込み処理を行っていきます。この読み込み処理を行うと、ビッグデータボードの処理基盤である BigQueryにデータが入ります。

BLOCKSの処理は、画面上に機能ブロックを置いて線でつないだフローというものが処理の単位になります。

フローは、フローの開始ブロックからつないで、フローの終了ブロックで終わります。この2つのブロックは、ブロックリスト基本に入っています。

フローの開始ブロックには、開始する時間などを指定できるほか、すぐに実行するためのボタンなどが入っています。URLの設定もできますので、外部プログラムから実行 したり、業務に組み込むときなどに応用してください。

気象データの読み込み

まずは気象データを読み込みましょう。データの読み込みは、ブロックリストBigQueryに入っているGCSから単一テーブルへロードというブロックを利用します。

では、フローの開始ブロックからGCSから単一テーブルへロードブロックをつなぎ、フローの終了ブロックまでつないでください。

気象データの読み込み

そのままではわかりづらい場合は、ブロックの名称を変えられますので、わかりやすい名前に変えてください。

GCSから単一テーブルへロードブロックには、いくつか設定ができますので、以下のように設定してください。

プロパティ
投入データのファイルGCS URL gs://magellan-blocks-doc-data/weather_tokyo_utf8.csv
投入先のデータセット blocks_ml_juyo
投入先のテーブル tokyo_city_20160101_20170104_raw
スキーマ設定
date STRING NULLABLE
weekday STRING NULLABLE
max_temp STRING NULLABLE
min_temp STRING NULLABLE
hours_of_sunshine STRING NULLABLE
other STRING NULLABLE
humidity_avg STRING NULLABLE
空でないテーブルが存在したとき 上書き
ファイル形式 CSV
CSVの区切り文字 カンマ(,)
読み飛ばし行数 6行

このようにすることで、GCS上のファイルがBigQueryに投入されます。投入されるデータは、BigQueryのデータセットにあるテーブルという場所に入ります。テーブルにはスキーマが必要なので、ここで設定します。

日の出・日の入りデータの読み込み

次に気象データと同じように日の出・日の入りデータを読み込んでみましょう。同じくフローの開始ブロックからGCSから単一テーブルへロードブロックをつなぎ、フローの終了ブロックまでを一つのフローとします。

日の出・日の入りデータの読み込み

GCSから単一テーブルへロードブロックの設定は、以下のとおりです。まずは2016年のデータ。

プロパティ
投入データのファイルGCS URL gs://magellan-blocks-doc-data/sunrise_sunset_2016.csv
投入先のデータセット blocks_ml_juyo
投入先のテーブル tokyo_city_sunrise_sunset_2016_raw
スキーマ設定
date STRING NULLABLE
sunrise_time STRING NULLABLE
sunrise_orientation STRING NULLABLE
meridian_passage STRING NULLABLE
altitude STRING NULLABLE
sunset_time STRING NULLABLE
sunset_orientation STRING NULLABLE
空でないテーブルが存在したとき 上書き
ファイル形式 CSV
CSVの区切り文字 カンマ(,)
読み飛ばし行数 1行

次に2017年のデータブロックも同様に設定します(「投入データのファイルGCS URL」と「投入先のテーブル」の2016を2017に変更します)。

電力使用量データの読み込み

最後に電力使用量を読み込んでみましょう。同じようにフローを作成します。

電力使用量データの読み込み

ブロックの設定は以下のとおりです。

プロパティ
投入データのファイルGCS URL gs://magellan-blocks-doc-data/juyo-2016.csv
投入先のデータセット blocks_ml_juyo
投入先のテーブル juyou_2016_raw
スキーマ設定
date STRING NULLABLE
time STRING NULLABLE
used STRING NULLABLE
空でないテーブルが存在したとき 上書き
ファイル形式 CSV
CSVの区切り文字 カンマ(,)
読み飛ばし行数 3行

次に2017年のデータブロックも同様に設定します(「投入データのファイルGCS URL」と「投入先のテーブル」の2016を2017に変更します)。

データの作成

全ての基礎データが読み込めたところで、いよいよ学習データを作成していきます。

とはいえ、それぞれのデータは、フォーマットがバラバラなので、このあたりからはじめ、最後に全てのデータを一つにまとめます。手順としては以下のとおりです。

  1. 年月日のフォーマットを合わせる:気象データと電力データは、月と日が一桁の場合があるため、一桁の場合は0を挿入します。

  2. レコードの粒度を揃える:気象データ、日の出・日の入りデータは日毎のデータであるが、 電力使用量のデータは1時間毎のデータになっているため、日毎の総電力使用量データに変換します。

  3. 年月日で結合する:すべてのデータを、年月日で結合します。

データを作成するフローは、少し長いフローですが、ブロックをつないでいくだけなので、一つ一つやっていけば難しいところはないと思います。

さきほどと同じようにフローの開始ブロックを置くところからはじめます。同時に実行できる部分は、並列分岐ブロックを置けば、並列実行もできます。

データの結合
データのフォーマットを合わせる
気象データのフォーマットをあわせる

では、気象データの年月日フォーマットをあわせるブロックの説明からはじめます。図では気象データ 結合キー整形 2016-2017という名前がついているブロックです。このブロックは、ブロックリストBigQueryからクエリーの実行ブロックを使って設定します。設定は次のとおりです。

プロパティ
SQL 文法 Standard SQL
クエリー
SELECT  REGEXP_REPLACE(REGEXP_REPLACE(date,"(/)([0-9]{1})($)","\\10\\2\\3"),"(/)([0-9]{1})(/)","\\10\\2\\3") AS date,
  max_temp,
  min_temp,
  hours_of_sunshine,
  humidity_avg
FROM
  blocks_ml_juyo.tokyo_city_20160101_20170104_raw
ORDER BY
  date
結果格納先のデータセット blocks_ml_juyo
結果格納先のテーブル weather_2016_2017
空でないテーブルが存在したとき 上書き
電力データのフォーマットを合わせる

電力データのフォーマットは、少しだけ複雑です。もともとのデータは、時間ごとになっているのですが、これを日毎のデータに変換しなければならないからです。

これを一度にやると面倒ですが、一つ一つ処理していけば単純になります。こうした複雑な処理をする時、一つのブロックで解決しようとしないで、複数の単純なブロックの組み合わせで処理するほうが、保守性もよくなりますし、開発も楽になります。

年月日フォーマットを合わせる

では、最初に電力データの年月日フォーマットをあわせるところから行きましょう。図では、電力データ結合キー整形 2016という名前のブロックです。これもブロックリストBigQueryの中にあるクエリーの実行ブロックです。

ブロックの設定は、以下のとおりです。

プロパティ
SQL 文法 Standard SQL
クエリー
SELECT  REGEXP_REPLACE(REGEXP_REPLACE(date,"(/)([0-9]{1})($)","\\10\\2\\3"),"(/)([0-9]{1})(/)","\\10\\2\\3") AS date,
  time,
  used
FROM
  blocks_ml_juyo.juyou_2016_raw
ORDER BY
  date,
  time
結果格納先のデータセット blocks_ml_juyo
結果格納先のテーブル juyou_2016_tmp
空でないテーブルが存在したとき 上書き
時間毎のデータを日毎のデータに変換する

次に時間ごとになっているデータを、日毎のデータに変換します。図では、日毎レコードに変換という名前のブロックです。これも同じくクエリーの実行ブロックを使って処理します。

ブロックの設定は、以下のとおりです。

プロパティ
SQL 文法 Standard SQL
クエリー
SELECT
  date,
  SUM(cast(used as int64)) as used_sum
FROM
  blocks_ml_juyo.juyou_2016_tmp
GROUP BY
  date
ORDER BY
  date
結果格納先のデータセット blocks_ml_juyo
結果格納先のテーブル juyou_2016
空でないテーブルが存在したとき 上書き

年月日で結合する

最後に、すべてのデータを年月日で結合します。図では、データ結合 2016という名前のブロックです。これも同じくクエリーの実行ブロックを使って処理します。

ブロックの設定は、以下のとおりです。

プロパティ
SQL 文法 Standard SQL
クエリー
SELECT
  juyo.date,
  weather.max_temp,
  weather.min_temp,
  weather.hours_of_sunshine,
  weather.humidity_avg,
  daytime.sunrise_time,
  daytime.sunset_time,
  juyo.used_sum
FROM
  blocks_ml_juyo.juyou_2016 AS juyo
LEFT JOIN
  blocks_ml_juyo.weather_2016_2017 AS weather
ON
  juyo.date = weather.date
LEFT JOIN
  blocks_ml_juyo.tokyo_city_sunrise_sunset_2016_raw AS daytime
ON
  weather.date = daytime.date
ORDER BY
  date
結果格納先のデータセット blocks_ml_juyo
結果格納先のテーブル juyo_all_data_2016
空でないテーブルが存在したとき 上書き
不正データの除去

次に考えなければならないのは、データに不正な値が入っている場合、それを除去しなければならないということです。気象系のオープンデータは、機器の故障などにより計測できていない値が入っていることがあります。こうしたデータをそのままにしておくと、MLボードが特徴を掴もうとするときに間違えてしまう可能性があります。

なので不正データの除去をやってみましょう。

データの整形・集計

今回の気象データには、非平均相対湿度に”null”という値が入っています。これを除去するのですが、これもクエリーの実行ブロックで行います。

プロパティ
SQL 文法 Standard SQL
クエリー
SELECT
  *
FROM
  blocks_ml_juyo.juyo_all_data_2016
WHERE
  date != "null"
  AND used_sum IS NOT NULL
  AND max_temp != "null"
  AND min_temp != "null"
  AND hours_of_sunshine != "null"
  AND humidity_avg != "null"
  AND sunrise_time != "null"
  AND sunset_time != "null"
ORDER BY
  date
結果格納先のデータセット blocks_ml_juyo
結果格納先のテーブル juyo_all_data_2016_no_error
空でないテーブルが存在したとき 上書き
データの型を合わせる

次にデータの型をあわせましょう。型を合わせておくと、後々集計が簡単に行えます。型変換するときに、エラーが出る場合は、データに不正な値が入っている可能性があります。その場合は、データを見直してみてください。

プロパティ
SQL 文法 Standard SQL
クエリー
SELECT
  date,
  used_sum,
  CAST(max_temp AS float64) AS max_temp,
  CAST(min_temp AS float64) AS min_temp,
  CAST(hours_of_sunshine AS float64) AS hours_of_sunshine,
  CAST(humidity_avg AS float64 ) AS humidity_avg,
  PARSE_TIMESTAMP("%%R", sunrise_time ) AS sunrise_time,
  PARSE_TIMESTAMP("%%R", sunset_time ) AS sunset_time
FROM
  blocks_ml_juyo.juyo_all_data_2016_no_error
結果格納先のデータセット blocks_ml_juyo
結果格納先のテーブル juyo_all_data_2016_cast
空でないテーブルが存在したとき 上書き
日中時間の計算

国立天文台から取得した日の出と日の入り時間から、日中時間を計算します。これもクエリーの実行ブロックを使います。

プロパティ
SQL 文法 Standard SQL
クエリー
SELECT
  date,
  max_temp,
  min_temp,
  hours_of_sunshine,
  humidity_avg,
  TIMESTAMP_DIFF(sunset_time,sunrise_time,minute) AS daytime_time,
  used_sum
FROM
  blocks_ml_juyo.juyo_all_data_2016_cast
ORDER BY
  date
結果格納先のデータセット blocks_ml_juyo
結果格納先のテーブル juyo_all_data_2016_daytime
空でないテーブルが存在したとき 上書き

訓練データ、検証データの作成

以上で学習データのもととなるデータは完成しました。ここからMLボードに学習させるためのデータを作成します。

学習データは、訓練データと検証データの2つに分けます。訓練データは、MLボードが特徴を見つけ出していくためのデータで、検証データは、見つけた特徴の精度を見極めるためのデータです。この2つのデータを使いながら、MLボードは正しい学習をしていきます。

学習データを作るときに注意すべきなのは、今のままではデータ時系列に並んでいるということです。データというのは、ある特定の時期だけに似たような傾向を示すことがあります。例えば与えたデータが夏のデータだけだったとき、冬の特徴をつかめないかもしれません。

こうしたことを避けるために、データはランダムに抽出する必要があります。また訓練データと検証データの数ですが、十分な訓練を行うために訓練データのボリュームを確保する意味からも、訓練データと検証データのデータ量は、8:2になるように分割します。

こうした一連の処理を行うために、レコード毎に乱数の項目を追加し、乱数の大きさで順位をつけ、それを上位8割とそれ以外にわけるということを行います。

トレーニングデータの作成

こうした作業も、クエリーの実行ブロックを使います。まずは、ランダムな番号を付与するブロックです。

プロパティ
SQL 文法 Standard SQL
クエリー
WITH
  tmp AS (
  SELECT
    date,
    used_sum,
    max_temp,
    min_temp,
    hours_of_sunshine,
    humidity_avg,
    daytime_time,
    RAND() AS rand
  FROM
    blocks_ml_juyo.juyo_all_data_2016_daytime)
SELECT
  date,
  used_sum,
  max_temp,
  min_temp,
  hours_of_sunshine,
  humidity_avg,
  daytime_time,
  ROW_NUMBER() OVER (ORDER BY rand) AS row_num
FROM
  tmp
order by row_num
結果格納先のデータセット blocks_ml_juyo
結果格納先のテーブル juyo_all_data_2016_no
空でないテーブルが存在したとき 上書き

次に、訓練データを作成します。訓練データは、いったんBigQueryのテーブルとして作成します。

プロパティ
SQL 文法 Standard SQL
クエリー
SELECT
  max_temp,
  min_temp,
  hours_of_sunshine,
  humidity_avg,
  daytime_time,
  used_sum
FROM
  blocks_ml_juyo.juyo_all_data_2016_no
WHERE
  row_num <= 225
結果格納先のデータセット blocks_ml_juyo
結果格納先のテーブル train_data
空でないテーブルが存在したとき 上書き

テーブルとして作成したデータを、GCSへCSVファイルとしてエクスポートします。この処理は、単一テーブルからGCSへエクスポートブロックを使います。

プロパティ
出力先ファイルのGCS URL gs://magellan-blocks-doc-train/train_data.csv
出力元のデータセット blocks_ml_juyo
出力元のテーブル train_data

次に検証データを作成します。これもいったんBigQueryのテーブルに書き出します。

プロパティ
SQL 文法 Standard SQL
クエリー
SELECT
  max_temp,
  min_temp,
  hours_of_sunshine,
  humidity_avg,
  daytime_time,
   used_sum
FROM
  blocks_ml_juyo.juyo_all_data_2016_no
WHERE
  row_num > 225 
結果格納先のデータセット blocks_ml_juyo
結果格納先のテーブル eval_data
空でないテーブルが存在したとき 上書き

テーブルに書き出した検証データを、GCSへCSVファイルとしてエクスポートします。

プロパティ
出力先ファイルのGCS URL gs://magellan-blocks-doc-train/eval_data.csv
出力元のデータセット blocks_ml_juyo
出力元のテーブル eval_data

学習

ようやく学習までやってきました。BLOCKSのMLボードは、学習や予測はとても簡単に利用できます。なので、予測因子を考え、データを作るところまでに手間がかかりますが、精度の高い機械学習のためには、与えるデータが全てです。どのような因子が適しているのかをよく考えるところには、手間を惜しまないでください。

MLボード作成

学習のために、MLボードを作ります。BLOCKSのMLボードから+をクリックしてください。

ボード名を入力して、数値回帰タイプを選択します。

BLOCKSは、内部でGoogleのクラウドプラットフォーム(Google Cloud MLという機械学習のためのプラットフォームなど)を利用しています。そのためにGCPサービスアカウントが必要ですので、ここでアップロードしてください。

学習が終了したら結果はGCSに保存されます。ですので保存先のバケット、ディレクトリを選択してください。

APIが有効化されていない場合は、API有効化します

次にGoogleのCloud MLプラットフォームが、GCSにアクセスできるように許可を与えます。このためにGoogle Cloud Consoleの画面右上にあるCloud Shellを有効にするというボタンを押し、Cloud Shell画面を表示してください。

そうするとコマンドプロンプトが出てくるので、以下のコマンドを入力してCloud MLから利用できるように初期化します。

gcloud beta ml init-project

ここで許可を与えるかどうか聞いてくるので、Yと入力したら終了です。

次に、MLボードで、学習データの項目名、型、次元を設定します。

   ここで注意しなければならないのは、学習データ自体には、因子データの最後に予測する数値データ(今回は電力消費量)が入っていますが、MLボードで項目・型・次元などを指定するのは、因子データだけです。予測することになるデータは指定しません。この点、注意してください。

入力した値は、以下を表しています。

項目名 次元数 説明
max_temp 数値型 1 予測日の最高気温
min_temp 数値型 1 予測日の最低気温
hours_of_sunshine 数値型 1 予測日の日射量
humidity_avg 数値型 1 予測日の平均湿度
daytime_time 数値型 1 予測日の日中時間

最後に、入力内容を確認します。

学習の開始

さて、全ての準備が整ったので、トレーニングを開始します。

トレーニング開始をクリックします。

  • 画面から、トレーニング名を入力します。
  • 訓練データURL、検証データURLは、GCSに保存した訓練データと検証データの場所になります。
  • トレーニングの経過制限時間(分)を設定したい場合は、制限時間を入れてください。必要ない場合は、0を入れます。
  • トレーニングの最大試行回数を設定します。ここに試行回数を指定すれば、MLボードは自動的にパラメータを変更して、最適な結果ができるようにチューニングをはじめます。

開始をクリックすると、トレーニングが始まり、トレーニング状況を確認できます。

設定情報をクリックします。

モデル名を確認します。このモデル名を予測で利用します。

学習結果の適用

トレーニングが終わるとステータスが成功に変わり、適用ボタンが表示されます。適用ボタンをクリックすると、学習は終わりです。これで予測が行えます。

予測

さて、学習が完了したので、予測を行ってみましょう。

予測フロー作成

予測は、ビッグデータボードで行います。

以下のフローを作成します。

簡単に確認するために、ビッグデータボードのブロックリストのAlphaからDataブロックを使用します。ここに電力使用量を予測したい日の因子となるデータを入れます。

プロパティ
データ
- key: “20170101”
  max_temp: 13.8
  min_temp: 2
  hours_of_sunshine: 8.9
  humidity_avg: 59
  daytime_time: 588
- key: "20170102"
  max_temp: 13.3
  min_temp: 3.8
  hours_of_sunshine: 6.5
  humidity_avg: 65
  daytime_time: 588	 
- key: "20170103"
  max_temp: 13.7
  min_temp: 3.5
  hours_of_sunshine: 8.2
  humidity_avg: 54
  daytime_time: 589	 
- key: "20170104"
  max_temp: 14
  min_temp: 3.6
  hours_of_sunshine: 8.7
  humidity_avg: 48
  daytime_time: 590

次にブロックリストのAlphaからCloud ML Predictブロックをフローに配置して、設定を行います。設定は、Model Nameに学習で作成したモデルのモデル名を設定するだけです。

予測結果をどのように使うのかは、いろいろな方法があると思いますが、ここでは結果をBigQueryに入れてみたいと思います。このためには、ブロックリストのBigQueryから変数からテーブルへロードブロックを利用します。

プロパティ
投入データの変数 _
投入先のデータセット blocks_ml_juyo
投入先のテーブル predict_result
スキーマ設定
predictions RECORD REPEATED
predictions.output FLOAT NULLABLE
predictions.key INTEGER NULLABLE

予測結果をファイルとして受け取りたい場合は、同じくブロックリストのBigQueryから単一テーブルからGCSへエクスポートブロックを利用します。

プロパティ
出力先ファイルのGCS URL gs://magellan-blocks-doc-data/predict_result.json
出力元のデータセット blocks_ml_juyo
出力元のテーブル predict_result
ファイル形式 NEWLINE_DELIMITED_JSON
予測の実施

さあこれで全て準備ができたので、予測を行ってみましょう。

フロー開始ブロックプロパティの を押して予測を実行します。

予測結果はJSONファイルとしてGCSに保存されているので、確認してみましょう。

ファイル名: gs://magellan-blocks-doc-data/predict_result.json

{
  "predictions":[
    {
      "output":84442.0390625,
      "key":"20170101"
    },
    {
      "output":81434.53125,
      "key":"20170102"
    },
    {
      "output":78059.7421875,
      "key":"20170103"
    },
    {
      "output":75184.3125,
      "key":"20170104"
    }
  ]
}

output が 電力使用量の予測値となります。

評価

予測ができるようになったら、学習したモデルに対して評価をしてみましょう。事前に決めていたベンチマークとの比較などを行って、評価をするとよいです。

ここではベンチマークを設定していないので、予測精度を改善するための方法について考えてみることとします。

データ量を増やす

今回の例では、学習に使ったデータ2016年の1年分しかありませんでした。なのでデータ量としてはちょっと少ないので、まず精度をあげるためにデータ量を増やす努力をしてみましょう。

残念ながら東京電力のオープンデータは、一年分しかなかったので、この例でデータ量を増やすのは難しいのですが、みなさんの会社には、過去数年分のデータがありませんか?少なくとも3年分くらいのデータを入れて学習させると、精度はさらに高くなると思います。

試行回数・経過時間を増やす

精度をあげるには、試行回数を増やしたり、経過時間を伸ばすのも効果があります。

MLボードは、試行回数を指定すると、パラメータを変えて試行してくれます。この数を増やすことで、より精度の高いパラメータを見つけやすくなります。

また経過時間を増やすのも効果があるかもしれません。経過時間は、学習をどこまで頑張るのかを、時間で制約するものです。なので、長く設定すると、精度が高くなりそうであれば、設定された時間まで頑張ります。

こうしたことから、試行回数を増やすことと、経過時間を伸ばすことは、精度向上に役立つかもしれません。しかし、それだけ学習時間が伸びるので、ご注意ください。

因子を見直す

電力消費に影響のある因子は、ほかにもありませんか?例えば、曜日などは因子として影響があると思います。平日は企業が活動していますから、休日よりも消費量が多いと思います。同じように考えるなら、祝祭日や年末年始、お盆なども影響が考えられます。

こうした要因を、うまくデータ化して因子に加えてみてください。きっと精度が劇的に変わるポイントがつかめてくると思います。

需要予測の精度をあげる因子探しは、結局のところどうして電気を使うのかとか、どうして商品を買うのかという消費ニーズの根源的なことを考えることにつながります。なので、最適因子を見つけるには、ビジネスの現場に精通している必要があります。

わたしたちグルーヴノーツが、誰もが使えるサービスを作り機械学習の民主化をすすめているのは、ここに理由があります。コンピュータの専門家ではなく、ビジネスの専門家こそが、機械学習の主役なのです。

BLOCKSのMLボードを使って、みなさん独自のサービスをどんどん作ってください。