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

教師付きの機械学習サービスである Google AutoML Tables を使って、クレジットカードの利用明細(CSVファイル)から家計簿の勘定科目を予測してみます。
本記事では、AutoML Tables の概要をみて、トレーニングデータの準備を行います。

【目次】

[1]はじめに

少し前までAIブーム(機械学習ブーム)といった感じだったのが、機械学習はもはやブームというより、(進化は続いてますが)定着した技術分野といった感じになってきました。

とはいっても、今でも機械学習の基礎的な理論から勉強しようとすると敷居の高さを感じます。一方で、機械学習を利用する立場で考えると、分かりやすい書籍、セミナー、サンプルなどもいっぱいありますし、充実したツール群や実行環境も揃ってきて、敷居がとても低くなりました。

つまり、理論的なことはあまり考えなくても、ツールが使えれば、何らかの結果が出せる時代が来つつあるように思えます。(少し違うかもしれませんが、電卓の内部的な仕組みは理解してなくても、電卓を使って計算ができるのと似てきた感じです。)

ところで、scikit-lerrn、TensorFlow、PyTorchなど有名な機械学習ツールを使った書籍を読んでサンプルデータを試してみると、その結果に凄さを感じたり、納得するものはあるのですが、自分で機械学習を使った課題に取り組んでみると、以下のような素朴な疑問に突き当たります。
  • データの前処理が重要といわれるけど、自分の知識範囲の対応で大丈夫なのか?
  • 最良そうなアルゴリズムをちゃんと選択できているのか?
  • トレーニングからデプロイまでの環境構築が面倒なのでは?
  • 予測したい問題について、一般的にどの程度の精度が出せるべき問題なのか?といった指標が無いと、自分が作ったモデルの良し悪しが判断し難い?
    • 具体的には、仮に、専門家が作るモデルと、自分が作ったモデルを比べたとき、どのくらいの差があるのか分からない。(特に思うような精度が出ないとき。)

Google AutoML Tables を利用すると、これらの疑問にかなり答えてくれそうです。

Google AutoML Tables は、ざっくり言えば、表形式データから機械学習を行うための自動化されたツールや運用環境を提供しているサービスです。
(ちなみに、AutoML Tables は2021年9月時点ではベータ版です。)

具体的には、表形式データ(CSVファイルなど)を与えると、機械学習に必要な前処理からアーキテクチャの選択まで自動的に行って機械学習モデルを作ってくれます。そして作ったモデルを利用して予測を行うための運用環境までトータルでサポートしています。

さらに、Google AutoML Tables は、取り組む課題に対して、どれくらいの精度が望めるか?のベンチマークとしても使えると思います。(というか、課題にもよると思いますが、下記の通りベンチマーク以上でしょうか。。。)

といいつつ、私が最も AutoML Tables がいいなと思うのは、機械学習を使ってみたい課題があり、Excelなどで表形式レベルのデータが揃っていれば、「難しいことを考える前に、まずは手軽に試してみることができる」ところです。
(但し、無料のサービスではありませんので、ご利用は計画的に。。。私は無料トライアルで試しました(笑))

そこで、本記事では、身近な例を題材にして Google AutoML Tables の使い方をみていきます。

機械学習のサンプルとして適切かどうかは微妙ですが、過去の自分の家計簿のデータを利用して、クレジットカード会社のサイトからダウンロードした利用明細の勘定科目を予測してみます。

なお、記事の主眼は、AutoML Tablesの使い方のサンプルであり、その学習用データは自分のデータ(自分に特化したもの)のみです。
このため、本記事は、汎用的な精度の高い勘定科目の推測を意図するものではありませんので、あらかじめご了承ください。

また、本記事で利用する機械学習関係の用語は、Google のドキュメントで使われている用語に合わせます。

最後に、書いていると記事が長くなりましたので、記事を分けることにしました。本記事はその第1回目です。

[2]AutoML Tables を利用した機械学習の基本的な流れ

(1)アプリ制作と対比して機械学習の流れを考えてみる

少し無理矢理感がありますが、私は業務アプリ畑の人間なので、機械学習の流れを一般的なアプリの制作から運用までの流れと対比して考えてみます。

アプリ制作と機械学習フローの対比



一般的なソフトウェアの作成工程を考えると、分析・設計~実装~テストを経てアプリが作られます。そして、そのアプリを利用(運用)して様々な入力を処理します。

(私なりの理解ですが、)これを機械学習に対応させて考えてみます。
  • アプリの仕様書はトレーニングデータ(学習用データ)に対応する
  • プログラミングなどに対応するのがトレーニング
    • トレーニングは、ざっくり考えると、未知データに対する予測ができるように、トレーニングデータから自動的に何らかのパターンを抽出すること、と考えられます。
  • トレーニング結果の機械学習モデルはアプリに対応する
  • 機械学習モデルを用いて未知データに対する予測を行うことは、アプリの利用(運用)に対応する

ところで、アプリの成否に最も強く影響するのは、企画・要求分析・設計などの上流工程と言われます。
同様に、機械学習の技術面も重要ですが、その上流にあたる企画やトレーニングデータの質などがより重要であると思います。

なお、機械学習はイテレーティブなプロセスが重要といわれますが、これもアプリ開発におけるアジャイルにとても近いものと思います。

(2)AutoML Tables で機械学習モデルを作るまでの流れ

AutoML Tables を利用した機械学習の基本的な流れについては、以下の公式ドキュメントでコンパクトにまとめられています。

ここには以下のように機械学習ワークフローが書かれています。
  1. データの収集
    • 達成したい結果に向けて、モデルのトレーニング用データとテスト用データを選定します。
  2. データの準備
    • データが正しい形式であることを、データ インポートの前後に確認します。
  3. トレーニング
    • パラメータを設定してモデルを構築します。
  4. 評価
    • モデルの指標を確認します。
  5. テスト
    • モデルをテストデータで試します。
  6. デプロイと予測
    • モデルを利用できるようにします。

このフローに従って AutoML Tables を利用する流れを以下のように図にしてみました。(下図は機械学習モデルを作成するところまでです。モデル作成以降のフローについては、後の記事で書きます。)

AutoML Tablesの利用フロー

ここで、機械学習をよくご存じの方なら、特徴量エンジニアリングなどの重要なステップが書かれていないのでは?、と思われるかもしれませんが、機械学習における一般的なプラクティスの多くは AutoML Tables の処理に組み込まれています。

また、機械学習によくある難しそうな名前や概念などを理解しなくてもある程度は使えます。実際に、このフローにある矢印の方向にステップを進めるための操作は、かなりシンプルです。
例えば、上記一般的な「機械学習ワークフロー」のトレーニングの項には「パラメータを設定して~」と書かれていますが、AutoML Tables には、あまりパラメータがありません(笑)。

殆どAutoML Tablesが自動的に処理してしまうため、ユーザ側でほとんど設定の必要はない、というか、細かな設定はできません。

[3]課題の設定:今回試してみること

機械学習を行うにあたって、一番大切で、しかし、とても難しいのは、上流工程にあたる課題の設定と、学習に適したまとまった量のトレーニングデータを揃えることではないかと思います。

そうは思いつつも、私が自前で用意できる、ある程度のデータが揃った面白そうな課題は、家計簿に関することくらいしか思いつきませんでした。
(もう一つ、血圧測定データ(笑)がありますが、これは機械学習より統計の勉強に向いている気がする。)

課題の設定やデータの準備は AutoML Tables の範囲外ですが、機械学習の上流工程ということで、背景も含めて書きます。(とはいえ、極めて個人的な例のため、ここは適当にスルーして頂いて全く問題ありません。)

<課題:やりたいこと>

2年半くらい前、つまらないきっかけから家計簿をつけ始めました。しかし無精者なので、家計簿に記帳(データ入力)することが苦痛でした。そこで、お金の出し入れには、現金を極力使わず、スマホ決済(クレジット決済)を利用して、銀行やクレジットカード会社から利用明細をダウンロード(CSVファイル)して家計簿に取り込むようになりました。

以下が、銀行やクレジット会社からCSVファイルをダウンロードして、家計簿ソフトに取り込むまでの流れです。

家計簿へのCSVファイル取込みフロー


ちなみに、自分でもいつまで続くか自信が無かったので(笑)、家計簿ソフトは無料で利用できるGnuCashを利用しています。

残念なことに、GnuCashはCSVデータのインポート機能はあるものの、私が利用している銀行やクレジット会社のCSVデータを直接インポートすることはできませんでした。
(銀行やクレジット会社のCSV形式は、GnuCashのインポート設定で調整できない形式でした。また銀行やクレジット会社毎に形式も異なります。)

そこで、ダウンロードしたCSVファイルを、GnuCashにインポートしやすいCSVファイルに変換する簡単なプログラム(図の「フォーマット変換プログラム」)を作成しました。

これだけでも負担はかなり軽減しましたが、GnuCashにインポートしてから勘定科目を設定する作業は残ったままであり、これも面倒です。

そのため、摘要や金額から勘定科目を特定しやすいものについて、勘定科目をルールとしてプログラムで設定(図の「勘定科目予測」)するようにしました。

これでかなり楽になりましたが、一部のパターンにしか対応していないし、新しいパターンを追加する場合は、ルールを考えてプログラムする必要もあって面倒です。

現状は以上ですが、もし、機械学習によって、CSVファイルの内容(日付、摘要、金額)から勘定科目が精度よく予測できるなら、自分でルールを考えたりプログラミングする必要がなくなり、さらに便利になるのではないかと考えました。
また、AutoML Tables の操作は(今回の記事のように)コンソールによる手動操作だけでなく、APIで自動化することもできますので、手順が確立できれば、機械学習モデルのメンテナンスも自動化できそうです。(私の家計簿では、そこまではやらないと思いますけど。。。)

ちなみに、私の家計簿の勘定科目は、会社などで利用する簿記会計の勘定科目のような厳密なものではなく、個人的な用途や基準で適当?に決めたものです。

というわけで今回は、図の「勘定科目予測」の部分に機械学習を試してみることにします。

[4]トレーニングデータの収集(作成)

やりたい事を決めましたので、そのトレーニングデータを準備します。

ここで、AutoML Tables におけるデータセット作成について考慮すべき点は、以下のドキュメントにまとめられています。

ただ、ここに書かれていること全てをクリアしないと AutoML Tables を使えないというわけではありません。むしろ、最低限の準備をして試しながら必要に応じて見直す、といったスタンスでも良いような気がします。

以下は、今回の事例で私が AutoML Tables を利用する前に行った準備作業です。

(1)目的やデータ項目など

今回は、クレジットカード会社のサイトからダウンロードするCSVファイル(日付、摘要、金額)から勘定科目を予測するためのトレーニングデータを作ります。
  • 特徴
    • date(日付)
    • description(摘要)
    • amount(金額)
  • ターゲット
    • account(勘定科目)

ここで、ターゲットとは「予測する値」のことで、特徴は、モデルのトレーニングに使用される入力属性のことです。

AutoML Tables は回帰問題または分類問題に対する予測ができます。分類問題は、バイナリ分類(2択)とマルチクラス分類(3つ以上から選択)があります。今回予測したいことは3つ以上ある勘定科目から1つを予測したいので、マルチクラス分類にあたります。

これらの用語を使って目的を書くなら、「日付、摘要、金額の3つの特徴から、勘定科目をターゲットとするマルチクラス分類を行う機械学習モデルを構築する」でしょうか。

(2)CSVファイルのレイアウトなど

AutoML Tables はトレーニングデータを、CSV形式またはBigQueryから読み込むことができます。

今回はCSV形式を利用します。
但し、CSV形式であれば何でもよいというわけではなく、いくつか要件があります。
ここでは特に注意すべきところを書きます。(ファイル分割やその他の詳細については上記ドキュメントを参照して下さい。)
  • RFC4180に準拠したCSV形式であること。
  • ファイルのエンコードはUTF-8であること。
  • ファイルの 1 行目は、列の名前を含むヘッダ行であること。
    • 列名には、あらゆる英数字やアンダースコア(_)を使用できます。列名の先頭をアンダースコアにすることはできません。
    • AutoML Table の画面などで表示される列名は、ヘッダ行の列名が利用されます。

ここで、データの中に日本語テキストが含まれるのは問題ありませんが、ヘッダ行の列名には日本語を利用できません。
このため、今回の例のCSVファイルのヘッダの列名は、日付を date、摘要を description、金額を amount、勘定科目を account にしました。

また、AutoML Tables にインポートするCSVファイルのエンコードは UTF-8 である必要があるようです。(Shift-JISエンコードの日本語を含むファイルは、インポートする際に「Invalid UTF-8 record" found.」エラーになります。Excelから直接CSV出力する場合はご注意ください。)

結果として、トレーニングデータとして、特徴とターゲットを含んだ以下のようなレイアウトのCSVファイル(UTF-8エンコード)を作成します。
date,description,amount,account
2019/03/01,病院名,1210,医療費
(以下同様)

(3)データの作成

クレジットカード会社のCSVファイルには、日付、摘要(説明)、金額の項目があります。家計簿データには、日付、摘要(説明)、金額に加えて勘定科目があります。

そう考えるとトレーニングデータは家計簿データがそのまま使えそうですが、家計簿データには摘要(説明)欄に、自分でメモ書きしたテキストが含まれているため、そのままではトレーニングデータには使えません。(ベストプラクティスにある「ターゲットの漏出」にあたるため。)

そこで、下図のように、過去のダウンロードしたCSVファイル(日付、摘要、金額)と対応する家計簿データの記帳をプログラムで突き合わせて勘定科目を取り出したトレーニングデータを作成しました。

過去利用明細CSVファイルと勘定科目の突き合わせ


この結果、2019年2月から2021年6月までの、約1,100件のデータができました。
また、日付、摘要、金額は必ずクレジットカード会社のCSVファイルに含まれていますし、勘定科目も必ず割り当てているため、欠損値はありませんし、いわゆるnull値もありません。

ところで、データ量について、AutoML Tables の初心者向けガイドには以下の記述があります。
  • 一般的に、トレーニングの例が多ければ多いほど、成果は上がります。(中略)完璧な数式はありませんが、推奨されるサンプルデータの最低行数は次のとおりです。
    • 分類問題: 特徴数 × 50
    • 回帰問題: 特徴数 × 200

また、ベストプラクティスには、「データセットは必ず 1,000 行以上にしなければなりません。」とあります。

正直言って、最低限をギリギリクリアしたかどうか、という程度のデータ量です。当初の自分の感覚ではデータ量はそれなりにあると思っていましたが、実際に作ってみると思った以上に少ない。。。(これまでの自分の労力の印象が強すぎですね。。。)

最後に、ここで作成したデータは、元CSVファイルと家計簿の勘定科目データをそのまま格納しているだけで、各データの値は未加工です。当然、特徴量エンジニアリングでいわれるようなテクニカルな処理は一切していません。

教科書的には、機械学習を始める前に、ここでデータの性質を調べて云々。。。というところですが、今回の主目的は AutoML Tables を利用してみることでもあり、また、テクニカルな処理の多くは AutoML Tables がやってくれると見込んで、まずは、これで試してみることにします。
(後述しますが、実際には問題があることが分かって修正していきます。)

引き続き…

以降の記事で、今回作成したトレーニングデータを使って AutoML Tables で機械学習モデルを作成し、予測を行います。

コメント

このブログの人気の投稿

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

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

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