きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

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値など、統計的な知識がなく、正確な予測ができているかすら分かりませんでした( ゚Д゚)

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