Google AutoML Tables の機械学習を使ってカード利用明細から家計簿の勘定科目を予測する(3)予測

教師付きの機械学習サービスである Google AutoML Tables を使って、クレジットカードの利用明細(CSVファイル)から家計簿の勘定科目を予測してみます。第3回目の本記事では、前回作成した機械学習モデルを使って勘定科目を予測する方法(AutoML Tables が提供する方法)を見ていきます。

【目次】

[1]はじめに


前回の記事で、勘定科目を予測する機械学習モデルを作成しました。この機械学習モデルを使って、実際のデータで勘定科目を予測する方法を見ていきます。

予測を行うには、ざっくり、
  • AutoML Tables が提供(管理)する実行環境で予測する
  • モデルをエクスポートしてAutoML Tables 以外の環境で予測する
の2つがありますが、本記事では、まず前者の AutoML Tables が提供する実行環境で予測する方法を見ていきます。この方法は有償サービスではありますが、面倒な環境構築などは不要です。

なお、モデルをエクスポートして予測する方法や、その後の試行錯誤に関しては以降の記事で書きます。

[2]予測の実行環境

前回作成した作成した機械学習モデルは、いわばパラメータの塊のようなデータですので、モデルだけで動作するものではありません。

機械学習モデルを用いて入力データに対して予測を行うためには、入力データを受け付けて、機械学習モデルを使った予測を行い、予測結果を返却する機能を持つプログラムが必要です。

さらに、そのプログラムを動かすための実行環境が必要です。(実行環境とは、例えばマシン、OSなど、プログラムを実行できる環境を含みます。)

考え方は、一般的なWebサービスやアプリの構成と同じです。

予測処理環境


AutoML Tables では、利用目的に応じて、実行環境とプログラムの組み合わせが、ざっくり2通り用意されています。
  • AutoML Tables が提供(管理)する実行環境で予測
    • バッチ予測
    • オンライン予測
  • AutoML Tables 以外の環境で予測
    • 機械学習モデルをエクスポートして、外部のDocker環境で予測する

この2つの大きな違いは、課金に関する違いと環境構築の容易性のように思います。
  • AutoML Tables が提供(管理)する方法(バッチ予測、オンライン予測)は、GCPリソースを利用するため課金が発生しますが、面倒な環境構築は不要です。
  • 一方、エクスポートして外部環境で予測する方法は、AutoML Tables としての課金はありませんが、自前の実行環境を用意する必要があります(環境によっては別途費用が必要かもしれません)。

本記事では、AutoML Tables が提供(管理)する方法(バッチ予測、オンライン予測)について、特徴や使い方を見ていきます。(モデルをエクスポートして利用する方法については、次回の記事で書きます。)

なお、本記事ではGCPコンソールや簡単なコマンドから利用できる方法(プログラムの作成不要な方法)をみていきます。このため、APIの利用やBigQuery関係などについては割愛します。

<課金に関する注意>

GCP(Google Cloud Platform)を利用するバッチ予測とオンライン予測は、GCPのリソース(仮想サーバなど)を利用するので利用料金が発生します。(無料ではありません。但し、無料トライアルはあります。)
また、オンライン予測とバッチ処理は課金方法が異なることにもご注意ください。

一方、モデルをエクスポートしてDocker環境で実行する方法は、自分のPCなどでDocker環境を用意すれば無料で予測できます。今回の例のような超個人的な利用目的にはこの方法がよいのですが(笑)、企業利用などに耐えうる本格的な実行環境を作るのはそれなりに大変ですので、費用対効果を検討してみる必要はありそうです。

[3]バッチ予測

(1)概要

名前の通り、複数の入力データを与えて、一度に複数の予測を取得できる方法です。

使い方はとても簡単で、トレーニングの時と同じような感覚で使えます。入力データをCSVファイルで用意すれば、予測結果もCSVファイルで返してくれます。
(入力と出力にBigQueryを利用する方法もありますが、本記事では割愛します。)

予測のための実行環境(デプロイなど)を意識する必要はありませんので、手軽に利用できます。(但し、無料ではありません。)

バッチ予測は、作成した機械学習モデルが実際にどれくらい使えるのか?を試すにはとても手っ取り早い方法だと思います。また、今回の例のような、毎月ダウンロードしたCSVファイルに対して一括して勘定科目を予測したいような場合に向いています。

但し、後述のオンライン予測と違って、リアルタイム予測には使えません、というか用途が異なります。

さて、バッチ予測は以下の手順で行います。
  1. 入力となるCSVファイルを準備する。
  2. CSVファイルをCloud Storageにアップロードする。
  3. AutoML Tables の画面からバッチ予測を実行する。
  4. Cloud Storageに保存された予測結果を確認する。

AutoML Tables のバッチ予測フロー



これから各手順を見ていきます。書くと長くなりますが、そんなに面倒な手順ではありません。

(2)入力データ(CSVファイル)の準備

まず、入力データとなるCSVファイルを準備します。

入力データCSVファイルは、トレーニング用に作成したCSVファイルの形式からターゲットの列を除いたものです。(トレーニングデータのCSVファイルのレイアウトについては「こちら」を参照して下さい。)

入力データCSVファイルの要点をまとめます。
  • RFC4180に準拠したCSV形式であること。
  • ファイルのエンコードはUTF-8であること。
  • ファイルの 1 行目は、列の名前を含むヘッダ行であること。
  • トレーニングに利用した特徴列が全て揃っていること。
    • トレーニングデータの全ての列から、ターゲットの列だけ除いたものです。
    • 特徴列の並び順はトレーニングデータと異なっていても問題ありません。
    • トレーニングに利用した特徴列が欠けている場合はエラー終了となり、予測できません。

以下、具体的な例で説明します。

今回用意したトレーニングデータは、列が date(日付)、description(摘要)、amount(金額)、account(勘定科目:ターゲット)で、以下のようなものでした。
date,description,amount,account
2019/03/01,病院名,1210,医療費
(以下同様)

予測用の入力データCSVファイルは、ターゲットの account(勘定科目)を除いて、date、description、amountの3列で作成します。
date,description,amount
2021/07/01,スーパーマーケット名,510
(以下同様)

(3)CSVファイルをCloud Storage にアップロード

続いて、用意したCSVファイルを Cloud Storage にアップロードします。

トレーニングの準備として、データセットにトレーニングデータ(CSVファイル)をインポートするときは、
  • Cloud Storage から CSV ファイルを選択
  • パソコンからファイルをアップロードする
が選択できましたが、バッチ予測は「Cloud Storage から CSV ファイルを選択」にあたる機能しかありません。
(その他、入力と出力にBigQuery を選択できますが、今回は割愛します。)

このため入力データ(CSVファイル)を、AutoML Tables と連携できる Cloud Storage へアップロードする必要があります。
(AutoML Tables と連携できる Cloud Storage のバケット要件については「こちら」の記事を参照して下さい。)

Cloud Storage にファイルをアップロードする最も簡単な方法は、GCPコンソールのCloud Storage/バケット画面で、連携するフォルダにCSVファイルをドロップする(あるいは「ファイルをアップロード」からファイル選択する)ことだと思います。

しかし繰り返しアップロードする場合はツールを利用するのが便利です。ツールの利用についてはこちらの記事も参考にしてください。

(4)バッチ予測の実行

連携する Cloud Storage にCSVファイルをアップロードしたら、AutoML Tables データセット画面の「テストと仕様タブ」に切り替えます。



<バッチ予測の実行手順>
  1. 「テストと使用」タブ画面下の「バッチ予測」をクリックします。
  2. 「入力データセット」項目で「Cloud Storage のCSV」を選択して「BROWSE」ボタンをクリックします。
    1. 右端に「オブジェクトの選択」ダイアログが表示されますので、アップロードしたCSVファイルを指定して「SELECT」で決定します。
  3. 「結果」項目で「Cloud Storage バケット」を選択して「BROWSE」ボタンをクリックします。
    1. 右端に「フォルダの選択」ダイアログが表示されますので、予測結果を格納したいCloud Storageのフォルダを指定して「SELECT」で決定します。
  4. 「バッチ予測を送信」ボタンをクリックします。

バッチ予測を送信すると、「テストと仕様タブ」の下側にある「最近の予測」のリストに実行状況が表示されます。

処理開始時の最近の予測画面

このリストを見ると、処理中を示すアイコンがあり、「入力」列には、指定した Cloud Storage のCSVファイルパスが表示されています。処理が完了するまで「結果ディレクトリ」列は空です。

バッチ予測はデータ量に応じて時間がかかりますが、予測処理が完了すると、メールで通知してくれます。(今回試したモデルで50件程度の予測を行うと、2分程度で処理が終わりました。)

(5)予測結果のファイル構成

予測が完了するとメール通知があり、指定した Cloud Storage フォルダの下に、「prediction-モデル名-開始タイムスタンプ」の名前のフォルダが作られて、結果データが格納されます。

この状況は「テストと仕様タブ」の「最近の予測」のリストからも確認できます。

処理終了時の最近の予測画面

チェックマークのアイコンになり、「結果ディレクトリ」列に結果データを格納した Cloud Storage のフォルダ名が表示されます。

何度かバッチ予測を繰り返すと、入力データと結果フォルダの関係が分かり難くなるため、この「最近の予測」リストにある「入力」、「結果ディレクトリ」の表示は重宝します。

さて、結果フォルダには2種類のファイルが格納されます。
  • 予測ファイル
    • 予測ができた入力データ行に予測値が格納されます。
    • ファイル名前は、tables_1.csvです。
      • 予測件数が多い場合は追加のファイルが作成されます(tables_2.csv など)。
  • エラーファイル
    • 予測に失敗した入力データ行とエラー原因が格納されます。
    • ファイル名は、errors_1.csv です。
      • 予測エラー件数が多い場合は追加のファイルが作成されます(errors_2.csv など)。

この2つのファイルの詳細は後述しますが、その前に共通することを少し補足します。
  • CSVファイルのエンコードはUTF-8です。
  • エラーファイルと予測ファイルの1行目はヘッダ行です。
  • 入力データの行ごとに、予測ファイル(予測成功)かエラーファイル(予測失敗)のどちらかに入ります。
  • 行の順序は、入力ファイルの行の順序と異なります。
    • 例えば、入力ファイルの3行目に対する予測は、予測ファイルの3行目にあるとは限りません。

これらのファイルをダウンロードすれば、スプレッドシートソフトウェアなどで確認できます。

(6)予測ファイルの内容

予測結果の内容は分類と回帰で少し異なりますが、今回はマルチクラス分類モデルを試しましたので、これについて見ていきます。

機械学習に詳しい方にとっては当たり前の話だと思いますが、予測の結果は、ターゲットのカテゴリ値がそのまま得られるわけではありません。各カテゴリの確率が得られます。

具体的に今回の例でいえば、日付、摘要、金額を与えると、予測結果として食費や医療費などの勘定科目が返ってくるわけではなくて、食費の確率がX%、医療費の確率がY%といった値が得られます。

このため、予測ファイルの内容は、ターゲットの全てのカテゴリ値に対して「ターゲットの列名_カテゴリ値_score」という列が入力ファイルに追加されたものになっています。

なお、どのようなカテゴリ値があるかについては、トレーニングデータを確認すればわかりますが、データセットの「トレーニング」タブのターゲット列からでも確認できます。例えば、ターゲット列の「固有の値」でカテゴリの数が確認できますし、詳細画面を見ると、カテゴリ値の具体的な値も確認できます。

そして、予測ファイルの「ターゲットの列名_カテゴリ値_score」の列の値には、確率スコア(信頼度の推定値)が設定されます。確率なので同じ行の全てのカテゴリ値のスコアを足すと1になります。

説明より具体的な例を見た方が直観的に理解できますので、例を書きます。

今回の例では、ターゲットの列名が「勘定科目」で、そのカテゴリ値は、「食費」、「医療費」等々でした。この場合、以下のような予測ファイルが作成されます。

date,description,amount,account_食費_score,account_医療費_score,残りのカテゴリ値‗score
2021/07/01,スーパーマーケット名,510,0.99664908647537231,0.00034268829040229321,残りのスコア値が続く
(以下同様)

この例だと、ほぼ99%の確率で食費だといっています。実際に食費で当たってました。

これは分かりやすい例ですが、中には20%くらいの確率で候補が分散して勘定科目を決めかねているようなケースもありました(笑)。

ところで、面白い機能として「特徴量の重要度を生成」という機能があります。最近よく言われる「AIの説明可能性」にも関係するところだと思いますが、特徴量の重要度を見ると、どの特徴量がどのくらい予測結果に寄与したかが何となくわかります。

しかし、特徴量の重要度の生成は、出力が BigQuery に限定されているようで、残念ながら Cloud Storage のCSVファイルには出力されません。(次のオンライン予測では見ることができます。)

最後に、CSVファイルのままだと見にくいので、スプレッドシートソフトで表示すると少し見やすくなります。ただ、特徴やカテゴリ値が多いと横長になってやっぱり見にくいです(涙)。その点では結果を評価しやすくするために、マクロやプログラムを作る必要があるかもしれません。

(7)エラーファイルやエラー終了など

予測の失敗には、入力ファイルの問題などにより予測が行われず処理が打ち切られてしまうようなケースと、予測処理は完了するけど行レベルでエラーがあるケースがあります。これらについて具体例を書きます。

①予測処理が途中で打ち切られる例

例えば、トレーニングに利用した特徴列が揃っていないデータでバッチ予測を実行すると
強制終了するようです。予測に必要な情報が揃っていないと予測できないので、予測処理を行う前に終わる感じです。

このような特徴列が欠けている場合、「AutoML Tables was unable to batch predict using model "モデル名"」というタイトルでメール通知されます。また、メール本文に原因が記載されます。
Operation State: Failed with errors
Error Messages: Missing column from input: 列名

これは、「最近の予測」画面でも確認できます。

処理中断時の最近の予測画面


赤いエクスクラメーションマークでエラーが示されて、結果ディレクトリの値は空のままです。また、ステータス欄にエラーメッセージが表示されます。

結果ディレクトリの値が空であることが示す通り、結果を格納する Cloud Storage フォルダも作成されません。当然、エラーファイルも作成されません。

②エラーファイルの例

入力ファイルのデータ行のうち、予測ができなかった(エラーになった)行がエラーファイルに記録されます。

エラーファイルの内容は、入力ファイルに、「errors_ターゲットの列名」という列が追加されたものです。

例えば今回は、date(日付)は「null値許容」(Nullable)が無効の列としていましたが、入力データ行にdateの値が無い(空文字の)場合、以下の内容がエラーファイルに格納されました。
date,description,amount,errors_account
,スーパーマーケット名,486,"{""code"":""3"",""message"":""Null value for non-nullable column: 1; Error parsing ProtoValue for column: date""}"


[4]オンライン予測

(1)概要

オンライン予測は、単一、低レイテンシのリアルタイム予測を行うものです。

バッチ処理は、一度に複数行のデータの予測を行うことができますが、時間がかかります。一方、オンライン予測は、1リクエストにつき1つの入力データしか処理を受け付けませんが、同期処理で即座に予測結果を返してくれます。

分かりやすい利用例としては、リアルタイム性が要求されるアプリケーション連携用のAPIサーバといったところかと思います。

例えば、今回の勘定科目予測で考えると、アプリ画面で日付、摘要、金額を入力すると、勘定科目が表示されるような感じでしょうか。

このようなリアルタイム性を実現するためには、予測プログラムが常時起動状態で待ち受けている実行環境が必要です。このため、以下の図のように、機械学習モデルを「デプロイ」して実行環境を作る必要があります。
(バッチ予測と同様に、オンライン予測も無料ではありません。但し、無料トライアルはあります。)

オンライン予測環境

(2)デプロイして予測

本来の用途を考えると、オンライン予測は、ツールやAPIを使って利用するのが基本かと思いますが、ここでは簡単にGCPコンソールの画面から予測する手順を見ていきます。

①モデルをデプロイ

オンライン予測を行うには、まず予測を粉うための実行環境を作るために、モデルをデプロイする必要があります。

これは以下のようにとても簡単な手順でデプロイできます。
データセット画面の「テストと使用」タブで「オンライン予測」をクリックします。
説明書きの下に「モデルをデプロイ」というテキストをクリックします。
確認画面が表示されますので「デプロイ」ボタンをクリックします。

(モデルのデプロイは、モデルの一覧画面の行のメニューからも行うことができます。)

なお、デプロイには時間がかかります。画面の説明には「デプロイには 10~15 分を要します。」とあります。デプロイが完了すると、メールで通知してくれます。
(私が試した時は開始から20分程度してメール通知がありました。)


AutoML Tables オンライン予測の画面

②予測の実行

モデルをデプロイしていれば、特徴量の名前が表示されているデータ入力フォームに、予測したいデータを入力して「予測」ボタンをクリックすると、予測結果が表示されます。

バッチ予測の時と同様に、結果はターゲットのカテゴリ値に対する確率スコアですが、これが可視化(グラフ表示など)されていますので、直観的に分かりやすいです。
レスポンスもいい感じです。

また「特徴量の重要度を生成」をチェックして予測すると、「ローカル機能の重要度」の列に、そのスコア表示とグラフ表示が行われます。(分類モデルのローカル特徴量の重要度は常に -1.0~1.0 です。)
これを見ると、予測に対して、どの特徴量が効いているか何となくわかります。

詳細については、以下のドキュメントを参照して下さい。

その他として、「JSONコードビュー」をクリックすると、ツールやAPIを利用する際のJSON形式を確認することができます。ツールやAPIから利用する場合は参考になるかもしれません。

(3)デプロイメントを削除

オンライン予測は、バッチ予測と違って、モデルをデプロイしている間(GCPリソースを利用している間)は、予測を実行するかどうかに関係なく課金されます。

このため、オンライン予測が不要になったらデプロイしたモデル(実行環境)を削除する必要があります。これは以下の手順で行います。
  1. デプロイしたモデルのデータセット画面の「テストと使用」タブで「オンライン予測」をクリックします。
  2. デプロイ中の場合は、説明書きの下に「デプロイメントを削除」と表示されていますので、これをクリックします。

(デプロイの削除は、モデルの一覧画面のメニューからも行うことができます。)

AutoML Tables オンライン予測:デプロイの削除


なお、デプロイを削除してもモデルが削除されるわけではありませんので、同じモデルに対して、何度でもデプロイとデプロイの削除を繰り返すことができます。

[5]引き続き…

本記事では、AutoML Tables が提供する実行環境で予測する方法をみました。次回の記事では、機械学習モデルをエクスポートして、外部のDocker環境で予測する方法を見てみます。個人利用では課金が気になるところなので、エクスポート機能が提供されているのはありがたいです(笑)。

コメント

このブログの人気の投稿

VirtualBoxのスナップショット機能

Google Document AIで画像から表形式データを抽出する(Vision API OCRとの違い)

Ubuntu/Colab環境でPDFファイルのページを画像化する(pdf2image、pdftoppm、pdftocairo)