きなこもち.net

.NET Framework × UiPath,Orchestrator × Azure × AWS × Angularなどの忘備録

Windows ML × tudorial × タクシー料金の予測

この記事の目的

この記事では、
Windows MLのチュートリアルの実施メモを残すこと
を目的としています。
元ネタは、Microsoft Docsに投稿されている「New York taxi fares」です。
docs.microsoft.com

本題

★問題の概要

問題は、「ニューヨークで走っているタクシーの利用料金の予測」です。
ニューヨークでは、基本的に、走行距離に比例して値段が変動します。
しかし、タクシー会社によっては、乗客の数や、クレジットカード払いなど様々な要因によって、請求額が変更されるらしいです。


機械学習タスクの選択

タクシーの利用料金を予測するためにまずやらなければならないことは、適切なmachine learning task(機械学習タスク)を選択することです!
教師データに含まれる様々な要因に基づき、実際の根大を予想しようとしているため、今回は、Regression task(回帰タスク)を選択します。

----
Regression Taskとは・・・
関連する項目のセットから、特定の項目の値を予測するタスク。
例)株価予測
----
詳しくはここ
https://docs.microsoft.com/en-us/dotnet/machine-learning/resources/tasks#regression

★アプリケーションの作成

利用する機械学習タスクが決まったので、操作対象のアプリケーションを作成します。アプリケーションは、,NET Coreをターゲットとしたコンソールアプリを作成します。
f:id:kinakomotitti:20180701194904p:plain
こんな感じで作りました。
いきなり名前を無視してしまった…まぁいいか。

次に、Dataフォルダをプロジェクトに作成します。教師データを格納する場所ですね。
f:id:kinakomotitti:20180701194912p:plain

最後に、Microsoft.MLをNugetからインストールします。
f:id:kinakomotitti:20180701194917p:plain
これをインストールして、
f:id:kinakomotitti:20180701194923p:plain
こうなりました。確かに、依存関係にMicrosoft MLが追加されました。

★教師データの準備

githubリポジトリから、教師データをダウンロードします。
github.com
f:id:kinakomotitti:20180701194937p:plain
【Download】ボタンで右クリックしないと、対象ファイルを取得できない仕様に若干手こずりました(/・ω・)/

ダウンロードした2つのファイルを前のステップで作成したDataフォルダに格納します。
f:id:kinakomotitti:20180701195010p:plain
f:id:kinakomotitti:20180701195017p:plain

プロジェクトに追加されていることも確認できました!
f:id:kinakomotitti:20180701195028p:plain
出力ディレクトリーにコピーする設定も忘れずに行う!

今追加したデータの中で、今後のステップで利用する項目は以下の通りです。
+ vendor_id:タクシー会社のID
+ rate_code:乗車比率?←ちょっとよくわからない
+ passenger_count:乗客の数
+ trip_time_in_secs:乗車時間
+ trip_distance:移動距離
+ payment_type:支払い方法
+ fare_amount:料金

★dataクラスの作成

予測に使うデータ用のクラスを作成します。
チュートリアルに従い、「TaxiTrip」クラスを作成していきます。
f:id:kinakomotitti:20180701195037p:plain
コードは以下の通りです。(長いので一部だけ抜粋)
>|cs|
[Column("0")]
public string VendorId;

[Column("1")]
public string RateCode;

[Column("2")]
public float PassengerCount;
|


次に、予測結果を出力する先のクラスも作成します。
(TaxiTripクラスファイルの中に定義していますが、別のファイルに定義しても問題ないと思います。)
>|cs|
public class TaxiTripFarePrediction
{
[ColumnName("Score")]
public float FareAmount;
}
|

ColumnNameをScoreとしています。
Score列は特別な列名で、ML.NETでは、予測結果を格納するために利用されます。

★モデルの定義

いよいよ、先ほど作成したモデルクラスに、データを流し込む処理を実装します。
チュートリアルの手順に従い、Program.csに読み込み専用変数を定義します。
これらは、Dataフォルダに格納したCSVファイルのパスを格納するために利用します。

★学習処理の作成

いっぱいUSINGに追加します!
>|cs|
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.Models;
using Microsoft.ML.Trainers;
using Microsoft.ML.Transforms;
|


そして、いよいよモデルの作成処理を実装していきます!
ここからは、あらかじめ用意しておいたコードベースにメモを残しておきます。
※なお、コンソールアプリのエントリポイント(Mainメソッド)を非同期にする都合で、言語バージョンをC#7.1以上に設定する必要があります。
f:id:kinakomotitti:20180701195050p:plain

コードも長くなるので、チュートリアルの以下の項目を実施した後のコードを下に示します

★データのロードと整形
★学習アルゴリズムの選択
★学習実行
★モデルの評価
★学習済みモデルを使った予測の実施


まとめ

機械学習フレームワークチュートリアルをやってみました!
実装自体はサクサクできましたが、RMSやR値など、統計的な知識がなく、正確な予測ができているかすら分かりませんでした( ゚Д゚)

いよいよ、統計学に手を出す時が来た気がしました。。。