ForePaaSで公開データから機械学習モデルを構築する手順 ~Part1~

ForePaaSで公開データから機械学習モデルを構築する手順 ~Part1~
ForePaaS解説 コラム

デモ動画を視聴

更新日:2022年10月27日
このコラムは日本ビジネスシステムズ株式会社(JBS)がForePaaSを使ってみた流れを記載したものとなっています。データ利活用プラットフォームであるForePaaSの機能を理解するため、公開データを収集・加工し機械学習アルゴリズムを利用した予測モデルを構築します。
本稿では、ボートレースの公開情報を利用して、着順を予想しつつ、ForePaaSの使い方やできることのイメージをお伝えできればと考えています。

※モデルのスコアを実用性のある精度にすることは本記事の対象としていませんが、ファンとしてできる限り頑張ります。

なぜ公開データか?

ビジネスデータを活用した分析も可能ですが、実際のファイル内容や処理内容を詳しくご紹介するため、今回は公開データを利用した分析を実施しました。

なぜボートレースか?

ボートレースは6艇のモーターボートで勝敗を競う公営競技の1つです。勝敗の予想には選手の情報、使用するボート、使用するモーター、レース場、艇番(コース取りをするための最初の出走順)などによって左右され、これらの情報をもとに勝敗を予想してレース鑑賞を楽しみます。
僕はこれまでは単に選手の情報や艇番をもとに頭の中で予想するだけでしたが、前述したとおり予想に使用できうるデータはいくつもあり、また大量のデータが公開されています。これらのデータを使えば、簡単な機械学習モデルでもデータに基づいた勝敗予想ができるのではないかと考え、ForePaaSを使ってモデル実装をしてみることにしました。
また、簡単なレースだけ的中しても、その場合は払戻金が少なくなるため、ファンとしては実入りが良いとは言えません。
もし、モデルの精度が良かった場合は、払戻金と組み合わせて勝率も分析したいと考えています。

全体の記事

本稿では、3つのパートでそれぞれ、データの取り込み、加工、分析をご紹介していこうと思います。

■ForePaaSへの (1)データ取り込み、(2)データ加工、(3)データ分析 に関する概要

■ForePaaSへの (1)データ取り込み、(2)データ加工、(3)データ分析 に関する概要

使用する言語について

本稿では、ForePaaSの画面や機能名の説明が一部英語となっております。
筆者が普段使用しているため英語表記となっておりますが、ForePaaSでは日本語表示でご利用いただくことも可能です。

1. 今回のPartの概要

1.1. ForePaaSとは

ForePaaSはデータ利活用のためのデータ収集、加工/成整形、AIモデリング、BI、その他多数のプロセスを1つのプラットフォームで提供する製品です。それぞれのプロセスを実現するためにさまざまな機能が1つの環境で用意されています。(ForePaaSとは
ForePaaSにはファイルなどのオブジェクトを格納する場所として「バケット」、ForePaaS内で利用するデータとして格納する場所として「テーブル」、アクション内で一時的にローカル利用できる「ディレクトリ」が用意されています。また、それらを加工し分析する処理を作成できる機能として「アクション」、テーブルのデータを画面に表示する「アプリケーション」といった機能が用意されています。今回は、これら機能を駆使して手順を実施していきます。

1.2. 手順概要

ForePaaSでの処理は「アクション」として定義することができます。
アクションは複数のアクションを作成し実行することができ、それぞれ何かのアクションの後に実行したり(トリガー実行)定期的に実行したり(バッチ実行)することができます。
今回は公開データの取得とテーブルへの格納を「データ読み込み用アクション」として1つのアクションに定義し、毎日実行されるようにしてみましょう。

データ読み込み用アクションの処理の流れ

①ボートレースデータをダウンロード
②配置/③読み取り(今回の公開データはLZH形式で圧縮されたファイルであるため、一度バケットにダウンロードして解凍したデータをテーブルに追加していくアクションを定義します。)
④加工
⑤テーブルへ格納

■データ読み込み用アクションの処理の流れ

■データ読み込み用アクションの処理の流れ

2. テーブルの定義

まずはForePaaSに作成するテーブルについて定義しておく必要があります。
今回ダウンロードできる解凍後のデータを見てみます。

ダウンロードするデータ

今回ダウンロードするデータはBOAT RACEオフィシャルウェブサイトにある以下の2つのデータを使います。

競争成績データ

日ごとの各レース場のレース結果が記載されています。
レースタイム、着順、組み合わせごとの払戻金などが記載されています。
今回大事な情報は着順と艇番になるため、着順と艇番※がキーとなります。

※艇番は最初のコース取りに出走する順番であり、ほとんどの場合はこの艇番どおりにインコースからコース取りがされていきます。ボートレースはインコースが圧倒的に有利な競技であり、最初のコース取りの順番≒艇番が非常に重要な指標となります。


番組表データ

日ごとの各レース場のレース情報が記載されています。
こちらには選手の情報が細かく記載されていますが、着順は記載されていません。
今回大事な情報は選手の詳細情報と使用するボート/モーターになるため、年齢や体重などの選手情報や全国勝率などの選手の勝率およびボート/モーターの番号とそれらの勝率がキーとなります。

2.1. 競争成績

解凍後のTXTデータにはボートレースのその日のレースごとの成績に関する情報が含まれています。

■ForePaaSに取り込んでデータ化する対象情報1

■ForePaaSに取り込んでデータ化する対象情報1
今回最終的にモデル作成するためには、各選手の着順の情報をテーブルに格納する必要があります。
今回は競争成績のデータを格納するテーブルを以下のように定義します。

■ForaPaaSに格納する際の形式(テーブル表)に情報を落とし込んだ状態1

■ForaPaaSに格納する際の形式(テーブル表)に情報を落とし込んだ状態1

2.2. 番組表

解凍後のTXTデータにはボートレースのその日の選手情報に関する情報が含まれています。

■ForePaaSに取り込んでデータ化する対象情報2

■ForePaaSに取り込んでデータ化する対象情報2
今回最終的にモデル作成するためには、レースごとの各選手の詳細情報をテーブルに格納する必要があります。
今回は番組表のデータを格納するテーブルを以下のように定義します。

■ForaPaaSに格納する際の形式(テーブル表)に情報を落とし込んだ状態2

■ForaPaaSに格納する際の形式(テーブル表)に情報を落とし込んだ状態2

3. 手順

目次

  • ・テーブルを定義する
  • ・データを収集しテーブルに格納するアクションを定義する
  • ・アクションのトリガーを定義する

3.1. テーブルを定義する

ForePaaSでは、テーブルを細かく手動で定義することもできますが、サンプルデータがあれば、自動で分析してテーブル定義を作ってくれる[ANALYZER]を利用する事で簡単に定義することもできます。
今回は[ANALYZER]を使ってテーブルを定義してみましょう。

(1)競争成績と番組表それぞれのテーブル定義に合わせてサンプルCSVデータをUTF-8で作成するか、以下リンクからダウンロードします。
以下のように、サンプルデータを入れたCSVファイルをUTF-8で作成します。

■競争成績

■競争成績

■番組表

■番組表
(2)[DATA MANAGER]にアクセスします。
ここではバケットの操作やテーブル定義などデータ定義に関連する機能がそろっています。

■ForePaaS操作画面(Data Manager)

■ForePaaS操作画面(Data Manager)
参照:Data Manager

(3)[SOURCES]にアクセスし、[NEW SOURCES]をクリックします。

■ForePaaS操作画面(Sources)

■ForePaaS操作画面(Sources)
(4)[File Upload]を選択して[SELECT]をクリックします。

■ForePaaS操作画面(New Source)取り込みデータのアップロード

■ForePaaS操作画面(New Source)取り込みデータのアップロード
(5)[Drop a file~]の範囲に先ほど作成した2つのサンプルCSVファイルをドラッグアンドドロップし、画面上部の名前に任意の名前を入力し、[CREATE]をクリックします。

■ForePaaS操作画面(Sources)データ登録

■ForePaaS操作画面(Sources)データ登録
これでデータソースとして先ほどのサンプルCSVを登録できました。
データソースとして今回は[File Upload]を使用してCSVファイルをアップロードしていますが、APIやDBなどさまざまなコネクタが用意されています。
参照:Sources

(6)[ANALZER]にアクセスします。

■ForePaaS操作画面(Data Manager)分析1

■ForePaaS操作画面(Data Manager)分析1
(7)データ一覧から先ほど登録したサンプルデータをクリックします。クリックするだけでForePaaSがデータを分析し、画面右側に分析した結果を表示します。これを競争成績のサンプルデータと番組表のサンプルデータのそれぞれで行います。

■ForePaaS操作画面(Data Manager)分析2

■ForePaaS操作画面(Data Manager)分析2

■ForePaaS操作画面(Data Manager)分析3

■ForePaaS操作画面(Data Manager)分析3
(8)[TABLES]にアクセスし、画面左にある+ボタンから先ほどのデータまで展開し、データを画面右側にドラッグアンドドロップします。

■ForePaaS操作画面(Data Manager)データ表示

■ForePaaS操作画面(Data Manager)データ表示
(9)テーブルの概要を設定できる画面が開くので、テーブル名に以下のように入力し、[SAVE]をクリックします。
競争成績:boat_result_table
番組表:boat_race_table

テーブルが作成されます。

■ForePaaS操作画面(Data Manager)テーブル作成1

■ForePaaS操作画面(Data Manager)テーブル作成1
(10)race_numberにカーソルを合わせ、[Unset primary key]をクリックします。

(11)(8)~(10)の手順を競争成績のサンプルデータと番組表のサンプルデータのそれぞれで行います。

(12)画面左にある[Build all tables]をクリックし、テーブルをビルドします。
ビルドすることで、定義したテーブル情報に従って実際にForePaaSのテーブルが作成されます。

■ForePaaS操作画面(Data Manager)テーブル作成2

■ForePaaS操作画面(Data Manager)テーブル作成2
これでサンプルデータからテーブルを定義し、ForePaaSにテーブルがビルドされました。

3.2. データを収集しテーブルに格納するアクションを定義する

先ほどテーブルを定義してビルドしましたが、まだ何もデータが入っていません。
外部公開されているデータを取得してテーブルに追加していく必要があります。

ForePaaSにはユーザーが作成しなくても標準でロードアクションが用意されており、ファイルを読み込んでテーブルに展開することができます。
しかし、今回は元データがLZHで圧縮されたファイルなので、そのままファイルを読む事ができません。そういう場合は、Pythonコードを用いたカスタムアクションでデータ追加の一連の作業を行う必要があります。

まずはデータをCSVファイルオブジェクトとして格納する場所、バケットを用意します。

(1)[DATA MANAGER]にアクセスし[BUCKETS]をクリックします。

■ForePaaS操作画面(Data Manager)オブジェクト格納場所

■ForePaaS操作画面(Data Manager)オブジェクト格納場所
(2)[NEW BUCKET]をクリックします。

■ForePaaS操作画面(Data Manager)オブジェクト格納場所の作成

■ForePaaS操作画面(Data Manager)オブジェクト格納場所の作成
(3)バケット名に以下のように入力し、[CREATE]をクリックします。
競争成績:boat-result-bucket
番組表:boat-player-bucket

(4)[DATA PROCESSING ENGINE]にアクセスします。
ここではアクションの作成やアクションを組み合わせたワークフローの定義などForePaaSのジョブ関連を定義することができます。

■ForePaaS操作画面(Data Processing Engine)表示

■ForePaaS操作画面(Data Processing Engine)表示
(5)[ACTIONS]にアクセスし、[NEW ACTION]をクリックします。

■ForePaaS操作画面(Data Processing Engine)調整対象選択

■ForePaaS操作画面(Data Processing Engine)調整対象選択
(6)[Custom]を選択し、[SELECT]をクリックします。

■ForePaaS操作画面(Data Processing Engine)加工

■ForePaaS操作画面(Data Processing Engine)加工
今回は自由にpythonコードを記載できるカスタムアクションを使用していますが、データのロードや加工を簡単に行うことができるForePaaSの標準アクションがたくさん用意されています。
参照:Actions

(7) [start with a boilerplate]をクリックして、空のテンプレートを開きます。

■ForePaaS操作画面(Data Processing Engine)新規テンプレート選択

■ForePaaS操作画面(Data Processing Engine)新規テンプレート選択
カスタムアクションでは、使用するpythonライブラリの設定やpythonコードを記載するエリアが存在します。

■ForePaaS操作画面(Data Processing Engine)設定とコード記載

■ForePaaS操作画面(Data Processing Engine)設定とコード記載
①使いたいPythonライブラリを設定
②Pythonコードを入力

今回は以下の処理をPythonコードで書いていきます。
前処理や解凍処理などのForePaaSに関連しないpython処理については説明を割愛しますが、元のテキストがテキストとして美しいものでしたのでCSVファイルへの変換に苦労しました。

(8) [Python requirements]にlhafileと入力しEnterを押します。

(9)[ FILE PREVIEW]にはアクション作成時にサンプルコードが書かれています。今回このコードは使用しないため削除し、以下のソースコードを貼り付けます。

■ForePaaS操作画面(Data Processing Engine)コード入力

■ForePaaS操作画面(Data Processing Engine)コード入力
(10)アクション名に任意の名前を入力し、[CREATE]をクリックします。

■ForePaaS操作画面(Data Processing Engine)作成

■ForePaaS操作画面(Data Processing Engine)作成
(11)CREATEの完了後、[RUN]をクリックし、実行結果にエラーが発生しないことを確認します。

■ForePaaS操作画面(Data Processing Engine)動作確認

■ForePaaS操作画面(Data Processing Engine)動作確認
(12)[DATA MANAGER]>[TABLES]にアクセスします。

■ForePaaS操作画面(Data Manager)テーブル表示

■ForePaaS操作画面(Data Manager)テーブル表示
(13)競争成績のアクションの場合はboat_result_table、番組表のアクションの場合はboat_race_tableの[Infos]をクリックします。

(14)[PREVIEW TABLE]をクリックします。

(15)Analytics Managerが開き、テーブルの全量を取得するクエリが自動で作成されているので、[RUN]をクリックします。

■ForePaaS操作画面(Analytics Manager)クエリ確認

■ForePaaS操作画面(Analytics Manager)クエリ確認
(16)画面の下にデータが表示されたら、アクションが正常に動いてForePaaSのテーブルにデータが格納されたことを確認できます。

■ForePaaS操作画面(Analytics Manager)実装確認

■ForePaaS操作画面(Analytics Manager)実装確認
(17)(1)~(16)の手順を競争成績データと番組表データそれぞれで行います。

3.2.1. ソースコードの解説

ソースコードのうち、ForePaaS独自の処理について補足します。

データのダウンロード

外部の公開されているURLにアクセスしてデータを取得し、バケットに保存する処理を行っています。
ForePaaSアクション用のライブラリがすでに組み込まれているのでインポートして使用します。
バケットに接続し、バケットに用意されているput_request関数を実行するだけです。

■ForePaaSソースコード解説_データダウンロード

■ForePaaSソースコード解説_データダウンロード
これで先ほどのボートレースのサイトから圧縮された結果ファイルをダウンロードして指定のバケットに保存できました。
参照:ForePaaS Buckets connector

データの解凍・CSVへの変換

LZHファイルを解凍してTEXTファイルを取り出し、そこからデータを抽出してCSVファイルに変換するとなると、欲しいデータはCSVだけなのですが、中間ファイルで複数のデータができてしまいます。
そんなとき何度もバケットに保存するのはバケットが散らかっていくので、アクション内で利用できる一時ディレクトリ(tmp)を使用します。ここに置いたファイルはアクションが終了したタイミングで削除されるため、処理の途中で利用したいファイルがある場合に利用できます。

■ForePaaSソースコード解説_csvファイルの仮置き

■ForePaaSソースコード解説_csvファイルの仮置き
このようにtmpディレクトリを使うことができるので、解凍した後のTXTファイルをtmpディレクトリ内の別の場所に置いて、次に変換したCSVファイルを置いておくことができます。こうすることで無駄にバケットにファイルを保存する必要がなくなります。

テーブルへの追加

テーブルへの追加はCSVのデータをデータフレームに変換し、bulk_insert関数を利用して追加します。
先ほどバケットにコネクタで接続したように、今度はテーブルに接続します。

■ForePaaSソースコード解説_テーブルに追加

■ForePaaSソースコード解説_テーブルに追加
細かな説明は省きましたが、要はテーブルに追加したいデータのデータフレームを作成してテーブルにbulk_insertするだけでテーブルにデータを追加することができます。
ForePaaSのドキュメントにはカスタムアクションのサンプルが用意されていますので、とても参考になりました。
参照:Custom Actions SDK

では、Pythonコードが書けたら[CREATE]をクリックし、[RUN]をクリックします。

■ForePaaS操作画面(Data Processing Engine)作成と実装

■ForePaaS操作画面(Data Processing Engine)作成と実装

3.3. アクションのトリガーを定義する

先ほど作成したアクションは実行日のデータを取得するものなので、毎日定期的に実行するように設定すると、毎日のボートレースのデータがForePaaSのテーブルに追記されていきます。

(1)[DATA PROCESSING ENGINE]にアクセスし、[ACTIONS]にアクセスします。

■ForePaaS操作画面(Data Processing Engine)アクショントリガー設定

■ForePaaS操作画面(Data Processing Engine)アクショントリガー設定
(2)作成したアクションの[Edit]をクリックします。

■ForePaaS操作画面(Data Processing Engine)編集

■ForePaaS操作画面(Data Processing Engine)編集
(3) [PREFERENCES]をクリックします。

(4) [TRIGGERS]の[Add]をクリックします。

(5) 名前に任意のトリガー名を入力し、[Mode]をAdvancedに変更します。

(6)[Expression]に0 14 * * *と入力し、[CONFIRM]をクリックします。

Cron式

今回は処理の実行タイミングにCron式という時間指定方法を使っています。
Cron式は「* * * * *」の5カ所に値を指定することで、処理の起動タイミングを設定することができます。
それぞれ左から「分」「時」「日」「月」「曜日」となります。
今回の場合、「0分」、「14時」、「毎日」、「毎月」、「すべての曜日」となり、毎日14時0分に実行するという意味になります。

ForePaaSでCron式を設定する際にはタイムゾーンがUTC(協定世界時)となっているため、日本時間との時差を考慮する必要があります。日本時間で設定したいイベント日時の9時間前で設定します。
今回は日本時間の23時に実行したいので、14時に設定しましょう。

(7)(1)~(6) の手順を競争成績データと番組表データそれぞれで行います。

本手順を実施した以降の毎日23時に、テーブルの中身に新しいデータが追加されていることを確認できます。


これでPart1の記事は終了となります。
次回Part2では、2つのテーブルを加工して1つの機械学習モデル用のデータテーブルを作成します。
最後に、JBSではForePaaSのデータ分析実装を継続的に支援するデータ分析ラボ for ForePaaSを提供しております。毎月ご契約いただいた時間を消費することで、要望をいただいた機能を実装および支援を行います。

ForePaaSを活用できるか悩んでいて導入を検討している、ForePaaSを導入したが継続的な機能実装に人手が足りないといった場合にぜひご検討ください。よろしくお願いいたします。

こちらの関連記事も
合わせてお読みください