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

ML Board How-To Guide

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

はじめに

ML ボードに用意された数値分類モデルは、与えた特徴データから分類を行うことができます。

例えば、以下のような利用方法が考えられます。

  • キャンペーンなどの実施により「会員登録する (0) / 会員登録しない (1)」に分類
  • ウェブサイトで表示される広告を「クリックしない (0) / クリックする (1)」に分類
  • ユーザーの趣向性を数値化して「地域特性など数パターン (0 から n)」に分類
  • クレジットカードや ATM の利用特性から「正当利用 (0) / 不正利用 (1)」に分類

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

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

予測因子

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

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

ベンチマーク

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

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

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

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

そのフィッシャーが発表した論文にあやめの分類データがあり、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 ファイル(カンマ区切りファイル)にしてください。ファイルフォーマットの基本的ルールはひとつだけ。一行毎に、因子を並べて、最後に正解値を置くことです(正解値は数値型のみ)。

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

萼片の長さ, 萼片の幅, 花弁の長さ, 花弁の幅, 種別

種別は、数値型のみのため、あやめの種別名を以下の規則で、0 から 2 の数値で置き換えます。

  • 0: Iris setosa (Iris-setosa)
  • 1: Iris versicolour (Iris-versicolor)
  • 2: Iris virginica (Iris-virginica)
ビッグデータボードを利用した学習データの作成

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

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

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

  1. あやめデータを Google Cloud Storage (GCS)にアップロード

       ここで使用する GCS バケットは、デフォルトのストレージクラスが「Regional」で、Regional のロケーションが「us-central1」もののみとしてください。これ以外のバケットを使用した場合の動作は保証できません。

  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 のインストール方法については、Google ドキュメントの「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

スキーマの設定は、スキーマ設定プロパティの「JSONで編集」リンクをクリックして、以下のコードを貼り付けると簡単です。

[
 {
  "name": "sepal_length",
  "type": "FLOAT",
  "mode": "NULLABLE"
 },
 {
  "name": "sepal_width",
  "type": "FLOAT",
  "mode": "NULLABLE"
 },
 {
  "name": "petal_length",
  "type": "FLOAT",
  "mode": "NULLABLE"
 },
 {
  "name": "petal_width",
  "type": "FLOAT",
  "mode": "NULLABLE"
 },
 {
  "name": "class",
  "type": "STRING",
  "mode": "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つの処理は相互に依存関係が無いですから、並列処理をしてしまいましょう。並列処理をするには、ブロックリストの「基本」から「並列分岐」ブロックを選択します。

訓練用データの作成

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

プロパティ
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
ヘッダー行を出力する チェックを外す

フローの作成が完了したら、画面右上の保存ボタンをクリックしてフローを保存しておきましょう。フローは、保存されていないと実行できません。

フロー実行

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

これで、機械学習の 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 に保存されます。ですので保存先のバケット、ディレクトリを選択してください。

   ここで使用する GCS バケットは、デフォルトのストレージクラスが「Regional」で、Regional のロケーションが「us-central1」もののみとしてください。これ以外のバケットを使用した場合の動作は保証できません。

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_length: 5.9
  sepal_width: 3.0
  petal_length: 4.2
  petal_width: 1.5
- key: “2”
  sepal_length: 6.9
  sepal_width: 3.1
  petal_length: 5.4
  petal_width: 2.1
- key: “3”
  sepal_length: 5.1
  sepal_width: 3.3
  petal_length: 1.7
  petal_width: 0.5

次にブロックリストの「Alpha」から「ML Board オンライン予測」ブロックをフローに配置して、設定を行います。設定は、ML ボード名に学習で作成した ML ボードのボード名を設定するだけです。

プロパティ
GCPサービスアカウント (任意)
MLボード名 (MLボードで作成したボード名)
予測結果変数 _out

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

プロパティ
GCPサービスアカウント (任意)
投入データの変数 _out.predictions
投入先のデータセット (任意)
投入先のテーブル iris_predict
スキーマ設定
key STRING NULLABLE
label INTEGER NULLABLE
score FLOAT REPEATED

スキーマの設定は、スキーマ設定プロパティの「JSONで編集」リンクをクリックして、以下のコードを貼り付けると簡単です。

[
 {
  "name": "key",
  "type": "STRING",
  "mode": "NULLABLE"
 },
 {
  "name": "label",
  "type": "INTEGER",
  "mode": "NULLABLE"
 },
 {
  "name": "score",
  "type": "FLOAT",
  "mode": "REPEATED"
 }
]
空でないテーブルが存在したとき 上書き
ファイル形式 NEWLINE_DELIMITED_JSON

ブロックリストの「基本」から「ログへ出力」ブロックを使って、ビッグデータボード上で結果を確認することもできます。

プロパティ
ログへ出力する変数 _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」に対応した予測結果が「label」と「score」として出力されます。

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

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

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