ML ボードの使い方(数値分類タイプ)

ML Board How-To Guide

数値分類モデルを利用した分類

はじめに

MLボードに用意された数値分類モデルは、与えた特徴データから分類を行うことができます。例えばクレジットカードやATMの利用特性から、不正利用かどうかを判断したり、文章の特徴からスパムメールかどうかを判断するような利用方法が考えられます。

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

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

予測因子

分類を行うにあたって一番重要となるのは、分類を予測するための因子です。例えばクレジットカードの不正利用を見抜くための因子として、利用した日時と場所に関するデータが重要なのかもしれません。何を購入したのかは、不正利用の因子にはならないかもしれませんし、場合によっては重要な因子になるかもしれません。

適切な因子を選択できれば、精度が格段にあがります。因子の選択が、機械学習にはとても重要です。

ベンチマーク

実際に予測分類をおこなう前に、成否の目安となる指標を準備しておくことをおすすめします。例えば、経験豊富な人が、目視で行っている分類をベンチマークにするのも良いかもしれません。何かしらの目安を設定して、分類モデルを作成すれば、仮にベンチマークに到達しなかったとしても、コストや手軽さなどから実用に適用することが妥当であると判断できるかもしれません。

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

では、早速分類を行ってみたいと思います。

分類には、フィッシャーのあやめを利用します。フィッシャーは、イギリスの学者で、専門分野は統計学、進化生物学、遺伝学などに渡っていました。

そのフィッシャーが発表した論文にあやめの分類データがあり、3種類のあやめ(Iris setosa, Iris virginica, Iris versicolour)の花びらの長さと幅、がくの長さと幅といった4つのデータが、それぞれ50種類掲載されています。統計や機械学習などで分類の課題として、このデータを利用することが多く、今回もこのデータをMLボードに学習させて、正しく分類できる学習モデルを作成してみましょう。

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

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

  1. モデルの選択:今回は数値から分類を行うので、数値分類モデルを選択します。MLボードのモデルは、今後拡張していく予定です。

  2. 予測因子に関する考察:何を因子として分類を行うのかは、予測モデルを作るために最も重要なことです。今回は、フィッシャーのあやめを使います。

  3. 学習データの作成:MLボードに学習させるには、因子をCSVファイルにして行います。

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

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

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

学習のためのデータ作成

あやめのデータは、カルフォルニア大学アーバイン校のサイト から ダウンロード できます。ダウンロードサイトの“bezdekIris.data”が最新のものなので、今回はこのデータを利用します。

データについて

データは、以下の4項目+正解値の1項目で構成されています。

  1. sepal length in cm(萼片の長さ:cm)
  2. sepal width in cm (萼片の幅:cm)
  3. petal length in cm (花弁の長さ:cm)
  4. petal width in cm (花弁の幅:cm)
  5. class: (正解となる分類された種別名)

分類されるあやめの種類は、以下の3つです。

Iris setosa
Iris setosa
Iris versicolour
Iris versicolour
Iris virginica
Iris virginica

学習データの作成

ダウンロードしたデータをMLボードに学習させるためのデータを作成します。学習には、訓練と検証の2つのデータが必要です。

訓練用データは、MLボードが学習していくためのデータで、検証用データは、MLボードが学習した結果を検証するためのデータです。

2種類のデータを渡すことで、MLボードは自分で検証を行いながら学習をしていきます。

ビッグデータボードを利用した学習データの作成

学習データを作成するのは、表計算ソフトを使って行うこともできます。最終的にはCSVファイルにすればよいだけなので、簡単にデータを作りたいならそれでも構いません。

しかし、定期的に学習を行いたいとか、そもそもデータ量がすごく多い場合などは、BLOCKSのビッグデータボードを利用することをおすすめします。こうすれば、データの分析や学習データの作成、そして MLボードによる学習と予測まで、一貫してBLOCKSが利用できます。

実際の流れは、以下の通りです。

  1. あやめデータをGoogle Cloud Storage (GCS)にアップロード
  2. ビッグデータボードでアップロードしたファイルを取り込み
  3. データをランダムに並べ替え
  4. 訓練用データの作成
  5. 検証用データの作成

ビッグデータボードの利用設定については、こちら を参照してください。

あやめデータをGCSにアップロード

データをアップロードするには、以下のようにgsutil コマンドを利用します。GCSのバケット名は、自由に設定していただいて構いません。(今回の例では、 blocks- ml-class-demoというバケット名を利用します)

gsutil mb -c regional -l us-central1 gs://バケット名
gsutil cp アップロードするファイル gs://バケット名(例:gs://blocks-ml-class-demo/init)

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

データ作成フロー

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

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

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

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

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

あやめデータのビッグデータボードへの取り込み 

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

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

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

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

プロパティ
投入データのファイルGCS URL gs://blocks-ml-class-demo/init/bezdekIris.data
(blocks-ml-class-demoは任意のバケット名です)
投入先のデータセット (任意)
投入先のテーブル iris_init
スキーマ設定
sepal_length FLOAT NULLABLE
sepal_width FLOAT NULLABLE
petal_length FLOAT NULLABLE
petal_width FLOAT NULLABLE
class STRING NULLABLE
空でないテーブルが存在したとき 上書き
フィールド数が足りない行を許容する チェックをつける
ランダムな振り分け設定

学習データを作るときに注意すべきなのは、データに偏りを作らないようにすることです。与えたデータに特定のあやめに関する情報が少なかったら、学習は適切に行えないかもしれません。適切に与えるためには、一定の比率でデータを与える方法もありますが、ここではビッグデータボードを使って、データにランダムな値をつけて振り分けることとします。

まず、ブロックリストBigQueryからクエリーの実行ブロックを使ってデータにランダムな値を付与します。設定は以下のとおりです。

プロパティ
SQL 文法 Legacy SQL
クエリー
// blocks_ml_demoは任意のデータセット名です
SELECT
  rand(5) as rand_id,
  sepal_length,
  sepal_width,
  petal_length,
  petal_width,
  CASE
    WHEN class = "Iris-setosa" THEN 0
    WHEN class = "Iris-versicolor" THEN 1
    WHEN class = "Iris-virginica" THEN 2
    ELSE NULL
  END as class
FROM blocks_ml_demo.iris_init
WHERE class IS NOT NULL
ORDER BY rand_id
結果格納先のデータセット (任意)
結果格納先のテーブル iris_temp
空でないテーブルが存在したとき 上書き

ランダムな値を付与できたら、訓練用データと検証用データが作成できます。この2つの処理は相互に依存関係が無いですから、並列処理をしてしまいましょう。並列処理をするには、基本から並列分岐ブロックを選択します。

訓練用データの作成

それでは、訓練用データの作成です。クエリーの実行ブロックを使います。

プロパティ
SQL 文法 Legacy SQL
クエリー
// blocks_ml_demoは任意のデータセット名です
SELECT
  sepal_length,
  sepal_width,
  petal_length,
  petal_width,
  class
FROM blocks_ml_demo.iris_temp
ORDER BY rand_id ASC
LIMIT 120
結果格納先のデータセット (任意)
結果格納先のテーブル iris_training
空でないテーブルが存在したとき 上書き
訓練用データのGCSへの書き出し

訓練用データが作成できたら、MLボードが読み取れるようにCSVファイルに変換してGCSに書き出しましょう。利用するブロックは、BigQuery単一テーブルからGCSへエクスポートブロックです。

プロパティ
出力ファイルのGCS URL gs://blocks-ml-class-demo/data/iris_training
(blocks-ml-class-demoは任意のバケット名です)
出力元のデータセット (任意)
出力元のテーブル iris_training
ヘッダー行を出力する チェックを外す
検証用データの作成

次に検証用データの作成です。

プロパティ
SQL 文法 Legacy SQL
クエリー
// blocks_ml_demoは任意のデータセット名です
SELECT
  sepal_length,
  sepal_width,
  petal_length,
  petal_width,
  class
FROM blocks_ml_demo.iris_temp
ORDER BY rand_id DESC
LIMIT 30
結果格納先のデータセット (任意)
結果格納先のテーブル iris_test
空でないテーブルが存在したとき 上書き
検証用データのGCSへの書き出し

訓練用データと同じく、GCSに書き出します。利用するブロックは、BigQuery単一テーブルからGCSへエクスポートブロックです。

プロパティ
出力ファイルのGCS URL gs://blocks-ml-class-demo/data/iris_test
(blocks-ml-class-demoは任意のバケット名です)
出力元のデータセット (任意)
出力元のテーブル iris_test
ヘッダー行を出力する チェックを外す
フロー実行

BigDataボードのフローが作成できたらフローの開始ブロックにある で実行を開始します。

これで、機械学習のMLボードで利用する学習データの準備が整いました。ここまでで準備ができた学習データは以下の通りです。

訓練用データ

  • gs://blocks-ml-class-demo/data/iris_training
    (blocks-ml-class-demoは任意のバケット名です)

検証用データ

  • gs://blocks-ml-class-demo/data/iris_test
    (blocks-ml-class-demoは任意のバケット名です)

学習

それでは早速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ボードで、学習データの項目名、型、次元を設定します。

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

項目名 次元数 説明
sepal_length 数値型 1 萼片の長さ
sepal_width 数値型 1 萼片の幅
petal_length 数値型 1 花弁の長さ
petal_width 数値型 1 花弁の幅

分類する数:3(0: Iris setosa / 1: Iris versicolour / 2: Iris virginicaの3つの為)

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

学習の開始

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

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

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

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

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

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

学習結果の適用

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

予測

予測フロー作成

予測は、ビッグデータボードで行います。予測を行うためのフローを作成します。

簡単に確認するために、ビッグデータボードのブロックリストAlphaからDataブロックを使用します。

ここに予測したいあやめのデータを入れます。入力するデータは、以下のとおりです。

プロパティ
データ
- key: “1”
  sepal_lenth: 5.9
  sepal_width: 3.0
  petal_length: 4.2
  petal_width: 1.5
- key: “2”
  sepal_lenth: 6.9
  sepal_width: 3.1
  petal_length: 5.4
  petal_width: 2.1
- key: “3”
  sepal_lenth: 5.1
  sepal_width: 3.3
  petal_length: 1.7
  petal_width: 0.5

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

プロパティ
GCPサービスアカウント (任意)
Model Name (MLボードで作成したモデル名)
Output Variable _out

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

プロパティ
GCPサービスアカウント (任意)
投入先のデータセット (任意)
投入先のテーブル iris_predict
投入データの変数 _out.predictions

ログへ出力ブロックを使って、ビッグデータボード上で結果を確認することもできます。

プロパティ
ログへ出力する変数 _out.predictions

予測の実施

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

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

予測結果はログに出力されているので、確認してみましょう。

[
  {
    "score": [0.10034828633069992, 0.5175866484642029, 0.3820650279521942],
    "key": "1",
    "label": 1
  },
  {
    "score": [0.040482282638549805, 0.45981335639953613, 0.49970442056655884],
    "key": "2",
    "label": 2
    },
  {
    "score": [0.9810823202133179, 0.01643194630742073, 0.0024857944808900356],
    "key": "3",
    "label": 0
  }
]

出力内容は、Dataブロックで指定した「key」に対応した予測結果がlabelscoreとして出力されます。

labelの値は、どの種類かを表していて、以下のとおりとなっています。

  • 0:Iris setosa
  • 1:Iris versicolour
  • 2:Iris virginica

scoresは、どのくらいの可能性だと判断したかを表したものです。1.0が100%となります。