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 の Big Data ボードを利用して学習済みモデルを利用した予測を行うことができます。ここで学習に利用していないデータを使い、予測精度に関する評価をします。実際に利用する場合、もし精度が十分でなければ、予測因子に関する考察から見直し、どんな因子を ML ボードに見せるべきか、見せる場合にどのように見せたら良いのかからもう一度考えてください。

  6. 利用: 実用的な学習済モデルが完成したら、BLOCKS の Big Data ボードを使って予測を行ったり、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)
Big Data ボードを利用した学習データの作成

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

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

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

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

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

  2. Big Data ボードでアップロードしたファイルを取り込み
  3. データをランダムに並べ替え
  4. 訓練用データの作成
  5. 検証用データの作成

Big Data ボードの利用設定については、こちら を参照してください。

フルサービスプランの場合
GCS は BLOCKS が用意したものを利用します。この GCS を利用するためには、Google アカウントが別途必要です。

すでに、Google アカウントをお持ちの場合は、「プロジェクト設定」の「GCP アクセス 」からその Google アカウントを登録してください。

Google アカウントをお持ちでない場合は、「Google アカウントを作成する 」を参考に Google アカウントを作成してから、「プロジェクト設定」の「GCP アクセス 」で、その Google アカウントを登録してください。

あやめデータをGCSにアップロード
フルサービスプランの場合

データをアップロードするには、Google Cloud Console を利用します。

  1. 「プロジェクト設定」の「GCP サービスアカウント 」を開きます。

    プロジェクト設定(GCP サービスアカウント)
  2. 登録済みアカウントのデータアップロードの gs:// で始まる URL をクリックします。ウェブブラウザーの別タブが開き Google Cloud Console の画面が表示されます。

    gs://******** 部分が GCS のバケット名です。以降、バケット名はここで表示されているバケット名に読み替えてください。

  3. 今回は、GCS 上に「init」という名称のフォルダを作成して、そこにデータをアップロードします。Google Cloud Console 画面上部の「フォルダを作成」(1)をクリックして、「init」フォルダを作成してください。

    Cloud Console の GCS の画面(ステップ1)
  4. 作成された「init」フォルダのリンク(2)をクリックして、「init」フォルダに移動します。

    Cloud Console の GCS の画面(ステップ2)
  5. Google Cloud Console 画面上部の「ファイルをアップロード」(3)をクリックして、あやめデータをアップロードします。

    Cloud Console の GCS の画面(ステップ3)
セルフサービスプランの場合

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

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

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

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

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

あやめデータの Big Data ボードへの取り込み

では早速あやめデータを読み込みましょう。データの読み込みは、ブロックリストの「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"
 }
]
空でないテーブルが存在したとき 上書き
フィールド数が足りない行を許容する チェックをつける
ランダムな振り分け設定

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

まず、ブロックリストの「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
ヘッダー行を出力する チェックを外す

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

フロー実行

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

これで、機械学習の 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 ボード」を選択します。

ML ボード選択

数値分類タイプを選択します。

タイプ選択

ボード名を入力します。

ボード名設定

↓以下はセルフサービスプランの場合のみのステップです。

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

GCP サービスアカウント設定

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

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

gcloud ml-engine init-project

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

Cloud ML Engine 設定

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

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

ストレージ設定

↑ここまでがセルフサービスプランの場合のみのステップです。

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

トレーニングデータ設定

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

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

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

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

入力内容の確認

学習の開始

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

ML ボード詳細

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

トレーニング開始
  • 画面から、トレーニング名を入力します。
  • 訓練データURL、検証データ URL は、GCS に保存した訓練データと検証データの場所になります。
    • 訓練データ URL 例: blocks-ml-class-demo/data/iris_training
    • 検証データ URL 例: blocks-ml-class-demo/data/iris_test

    パスに指定できる文字は、英数字・アンダースコア(_)・ハイフン(-)・スラッシュ(/)などのアスキー(ASCII)文字のみです。

  • トレーニングの経過制限時間(分)を設定したい場合は、制限時間を入れてください。
  • トレーニングの最大試行回数を設定します。ここに試行回数を指定すれば、ML ボードは自動的にパラメータを変更して、最適な結果ができるようにチューニングをはじめます。

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

トレーニング詳細

学習結果の適用

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

予測は、適用ボタンクリック後、時間を数分空けてから行ってください。現バージョンでは、適用後直ちに予測を行うとエラーになる可能性があります。もし、エラーになった場合は、しばらく時間を空けてから再度予測を行ってください。

予測

予測フロー作成

予測は、Big Data ボードで行います。予測を行うためのフローを作成します。

予測フロー

簡単に確認するために、Big Data ボードのブロックリストの「基本」から「オブジェクト生成」ブロックを使用します。

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

プロパティ
結果を格納する変数 _(既定値そのまま)
データ
オブジェクト生成ブロックのデータプロパティの例(分類)

ここでは、3 種類のあやめのデータで予測します。data.0 / data.1 / data.2 がそれぞれのあやめのデータです。オブジェクト生成ブロックでは、このような複数データを列挙する場合は、「Array」型を使用します。data.0 / data.1 / data.2 は、Array 横の「+」ボタンを使って追加します。

それぞれのあやめのデータは、「Object」型を使用して、データを識別するキー(key) / 萼片の長さ(sepal_length) / 萼片の幅(sepal_width) / 花弁の長さ(petal_length) / 花弁の幅(petal_width)をひとつにまとめます。まとめる各データは、Object 横の「+」ボタンを使って追加します。

次にブロックリストの「機械学習」から「ML Board オンライン予測」ブロックをフローに配置して、設定を行います。

プロパティ
GCPサービスアカウント (任意)
MLボード名 (MLボードで作成したボード名)
予測因子データの変数 _.data
予測結果変数 _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

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

プロパティ
ログへ出力する変数 _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
  }
]

出力内容は、「オブジェクト生成」ブロックで指定した「key」に対応した予測結果が「label」と「score」として出力されます。

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

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

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

ML ボードオンライン予測」ブロックを使った予測の方法には、ここで紹介した方法以外にもいくつかります。ここで紹介した以外の予測方法については、「ML ボードオンライン予測ブロックを使ったいろいろな予測の方法」を参照してください。