##内容
最近公開されたML.NETを使って、機械学習ではおなじみのタイタニック号の生存者予測をしてみました。
参考:https://qiita.com/github129/items/2ed5895f1a900f27038f
参考:https://docs.microsoft.com/ja-jp/dotnet/machine-learning/tutorials/sentiment-analysis
参考:https://www.youtube.com/watch?v=OhCysVU5RDA
##環境
- Visual Studio Community 2017 Version15.7.2(Version15.6以上必須)
- .NET FrameWork 4.6.1(.NET Standard 2.0必須)
##コード
GitHubにあげています
https://github.com/koshian2/Titanic-MLnet
##概要
データはKaggleから。事前に891人分のデータをID順で6:2:2で訓練、交差検証、テストに分割しています。TrainTestDatasetSplitterを使えばパイプライン上で分割できそうな気はするけど、使い方がよくわかりませんでした。
訓練データの前処理は年齢(Age)が不明のデータを落としたのと、性別(Sex)と乗船港(Embarked)をOneHotベクトルにしただけです。
アルゴリズムはランダムフォレスト(FastForestBinaryClassifier)を使っています。
交差検証を行い、NumTreesとNumLeavesの2つのハイパーパラメーターについてグリッドサーチをしています。グリッドサーチのクラスあるのかもしれないけど、ML.NETでのハイパーパラメーターのチューニングのやり方がよくわからなかったので、自分で実装しました。ハイパーパラメーターを変更する際、pipelineから一度削除しないと変更が反映されないみたいです。
ハイパーパラメーターをチューニングしたあと、テストデータにフィットさせると次のような結果になりました。
### Result ###
- Selected Classifier
NumTree=4, NumLeaves=32
- Trian Sets
Accuracy=83.45%, Precision=83.78%, Recall=72.94%, F1score=77.99%
- Cross Validation Sets
Accuracy=80.28%, Precision=86.67%, Recall=63.93%, F1score=73.58%
- Test Sets
Accuracy=86.58%, Precision=86.79%, Recall=77.97%, F1score=82.14%
テストデータで精度は86.58%、F1Scoreが82.14%と、訓練データとテストデータともに8割近いのでそこそこ良さそう。グリッドサーチも含めて2分ぐらいで終わりました。
##FAQ
自分がハマったところのまとめ
Q:NuGetからダウンロードできない
A:.NET Standard2.0(≠.NET Framework)、Visual Studio15.6以上が必要。VSのバージョンはVisual Studio Installerから更新する。プロジェクトを右クリック→プロパティ→ターゲットフレームワークを「.NET Framework 4.6.1」以上にする。
Q:TextLoaderで「Type not implemented or supported」と怒られる
A:データの型をintで定義しているから。floatかstringにすると直る。
Q:TrainのところでDLLがないと怒られる
A1:DLLが64ビットなので、64ビット環境必須。構成マネージャーから64ビットにすること。
参考:https://msdn.microsoft.com/ja-jp/library/ms185328.aspx
A2:ソリューションエクスプローラー→参照→packages.configをPackageReferenceに移行するを選択→そのままOK
参考:https://blog.nuget.org/20180409/migrate-packages-config-to-package-reference.html
参考:https://github.com/dotnet/machinelearning/issues/93
##わからなかったところ
- 新しいカラムってどうやって作るの?
→例えばCabinのカラムから、最初の一文字を取って船室の位置を見る変数を作るにはどうやるの? - MissingValueSubstitutorで欠損値を平均値に置き換えるとかできそうだけどどうやるの?
- TrainTestDatasetSplitterで、Sklearnでいうところのtrain_test_split的なことができそうだけどどう使うの?
- ハイパーパラメーターのチューニングってどうやるの?グリッドサーチ用のクラスってあるの?
##感想
久しぶりにC#の投稿。まだプレビュー版でドキュメントがほとんどないような状態だけど、結構使いやすかったです。特に前処理から訓練まで1つのパイプラインでできるというのがすごい(Pythonだと前処理にpandasなどでワンクッション入る)。
チュートリアルの回帰問題で重回帰でもSVMでもなく、いきなり勾配ブーストを使ってるのが面白かったです。MicrosoftといえばLightGBMという素晴らしいライブラリがあり、これがML.NETに組み込まれたという話は聞きませんが、勾配ブーストを重視してるのかもしれません。ロードマップによると、そのうちTensorFlowも対応になってディープラーニングできるらしいので、MSの期待の新星かもしれません。今後に期待しましょう。あとAPIドキュメント書いて(切実)