#1 概要
機械学習をするときにデータを加工したい場合、SQLを使うことがあると思うのでPostgreSQLのデータベース上にあるデータをML.NETから取り込んで学習できるか試してみました。
前回の続きになります。
【動作環境】
- Windows 10 Home(1903)
- VisualStudio2019 v16.5.2
- .NetCore v2.2, v3.1
- ML.NET Model Builder(Preview) v16.0.2003.302
- Npgsql v4.1.3.1
- PostgreSQL v12.2.2(x64)
【事前準備】
- ML.NETチュートリアルを実施してソリューションを作成しておく。
- PostgreSQLダウンロードからダウンロードしインストールしておく。
#2 フォルダ構成
チュートリアルに従い、ソリューションを作成した後のフォルダ構成は以下になっています。
まずは、ダウンロードしたCSVをデータベースに取り込みます。
[動作環境]
TaxiFarePrediction
├TaxiFarePrediction
│ └Data
│ └taxi-fare-train.csv ・・・ ダウンロードしたデータ
├TaxiFarePredictionML.ConsoleApp
├TaxiFarePredictionML.Model
└TaxiFarePrediction.sln
#3 データベース作成
pgAdmin4を使いデータベースを作成しますので、pgAdmin4を起動します。
【データベース名】TaxiFare
drop table if exists taxi_fare_train;
create table taxi_fare_train
(
vendor_id text,
rate_code integer,
passenger_count integer,
trip_time_in_secs integer,
trip_distance real,
payment_type text,
fare_amount real
);
copy taxi_fare_train
from 'C:\[任意のローカル環境]\TaxiFarePrediction\TaxiFarePrediction\Data\taxi-fare-train.csv'
CSV HEADER;
※[任意のローカル環境]は作成したソリューションまでのパスにする。
PostgreSQLのバージョンによりパスが日本語の場合はエラーとなる場合があるため英語にする
4. SQLを実行する
これで、「taxi-fare-train.csv」を「taxi_fare_train」テーブルに取り込めました。
セレクト文を実行すると取り込んだデータが確認できます。
select * from taxi_fare_train;
#4 Npgsqlインストール
.NetからPostgreSQLにアクセスするライブラリをnugetからダウンロードしてきます。
VisualStudioツールバーの「ツール」>「NuGetパッケージマネージャ(N)」>「ソリューションのNuGetパッケージの管理(N)...」を開き、検索バーから「npgsql」を入力し検索するとでてきます。
「TaxiFarePredictionML.ConsoleApp」プロジェクトにチェックを入れ、Npgsqlをインストールします。
#5 PostgreSQLテーブル読み込み方法
モデルビルダーで生成した「TaxiFarePredictionML.ConsoleApp」プロジェクトの以下のソースコードを修正します。
- ModelBuilder.cs
- Program.cs
[動作環境]
TaxiFarePrediction
├TaxiFarePrediction
│ └Data
│ └taxi-fare-train.csv ・・・ ダウンロードしたデータ
├TaxiFarePredictionML.ConsoleApp
│ ├ModelBuilder.cs ・・・ ファイル読み込み処理をDBアクセス処理に変更
│ └Program.cs ・・・ CreateModel関数コールを追加
├TaxiFarePredictionML.Model
└TaxiFarePrediction.sln
① インクルードにNpgsqlを追加します。
② 生成されたコードのファイル読み込み処理をデータベースアクセスに変更します。
このとき、DB接続情報はPostgreSQLをインストールしたときの情報にします。
// ⓵インクルードにNpgsqlを追加する
using Npgsql;
~~~
namespace TaxiFarePredictionML.ConsoleApp
{
public static class ModelBuilder
{
~~~
// ⓶CreateModel関数の”Load Data”コメント箇所をファイル読み込みからデータベースアクセスの変更する
public static void CreateModel()
{
// Load Data
//IDataView trainingDataView = mlContext.Data.LoadFromTextFile<ModelInput>(
// path: TRAIN_DATA_FILEPATH,
// hasHeader: true,
// separatorChar: ',',
// allowQuoting: true,
// allowSparse: false);
DatabaseLoader loader = mlContext.Data.CreateDatabaseLoader<ModelInput>();
string connectionString = "Server=localhost;Port=5432;User ID=postgres;Database=TaxiFare;Password=password;Enlist=true";
string sqlCommand = "select * from taxi_fare_train;";
DatabaseSource dbSource = new DatabaseSource(NpgsqlFactory.Instance, connectionString, sqlCommand);
IDataView trainingDataView = loader.Load(dbSource);
~~~
}
③Main関数の先頭にCreateModel関数コールを追加します。
namespace TaxiFarePredictionML.ConsoleApp
{
class Program
{
~~~
static void Main(string[] args)
{
// ⓷Main関数の先頭にCreateModel関数コールを追加
ModelBuilder.CreateModel();
~~~
}
#6 実行
今回は、デバッグ実行でDBアクセスを確認しつつ行ったため、スタートアッププロジェクトを「TaxiFarePredictionML.ConsoleApp」に設定して実行しました。
スタートアッププロジェクトはソリューションのプロパティから設定できます。
#7 まとめ
ML.NETでPostgreSQLにアクセスして学習する方法についてみてきました。
DBはSQL Server、Azure SQL Database、Oracle、SQLite、PostgreSQL、Progress、IBM DB2などが使えるようです。
最初の学習はCSVファイルが使いやすいと思いますが、データを蓄積して再学習したい場合にデータベースが使えればデータの管理がしやすいと思います。