.NET Core 3.1 もリリースされたし ML.NET でも少し触ってみようと思います。今はカフェで Surface Go しか持ってないので先日作って寝かせておいた VIsual Studio Online につないでやってみようと思います。
.NET Core 3.1
このページに従ってコマンドをうってたらインストールできます。
dotnet --list-sdks
して入ってることを確認しましょう。
vsonline:~/workspace/HelloMLNET$ dotnet --list-sdks 2.1.802 [/usr/share/dotnet/sdk] 3.0.100 [/usr/share/dotnet/sdk] 3.1.100 [/usr/share/dotnet/sdk]
プロジェクトを作ってためしてみる
とりあえず以下のページの通りにやっていきます。まず写経。
dotnet new console -o HelloMLNET
とうってコンソールアプリのプロジェクトを作って、そのフォルダーを VS Code で開きます。
dotnet add package Microsoft.ML
で ML.NET のパッケージを追加して写経モードに入ります。
using System; using Microsoft.ML; using Microsoft.ML.Data; namespace HelloMLNET { class HouseData { public float Size { get; set; } public float Price { get; set; } } class Prediction { [ColumnName("Score")] public float Price { get; set; } } class Program { static void Main(string[] args) { var mlContext = new MLContext(); var houseData = new[] { new HouseData { Size = 1.1F, Price = 1.2F }, new HouseData { Size = 1.9F, Price = 2.3F }, new HouseData { Size = 2.8F, Price = 3.0F }, new HouseData { Size = 3.4F, Price = 3.7F }, }; var trainingData = mlContext.Data.LoadFromEnumerable(houseData); var pipeline = mlContext.Transforms.Concatenate("Features", new[] { nameof(HouseData.Size) }) .Append(mlContext.Regression.Trainers.Sdca( labelColumnName: nameof(HouseData.Price), maximumNumberOfIterations: 100)); var model = pipeline.Fit(trainingData); var size= new HouseData { Size = 2.5f }; var price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size); Console.WriteLine(price.Price); } } }
これを実行すると
2.7478235
と表示されました。参考にしたサイトの結果と数字が違うのは何か間違えたのか、それとも ML.NET のバージョンが変わって何か微妙に変わったのかよくわからないけど、元ネタのデータ(今回の場合 houseData)を作って、トレーニングして実際に Predict メソッドで結果出してる感じですね。
モデルのテストとかはしてないので、本番はもうちょいコードは長くなると思いますが、何となくこんな感じでいけるんだなぁという感じ。
ML.NET のルール
ルールというか使い方なのですが、ML.NET は MLContext クラスにすべてが詰まってる感じです。
例えば
var mlContext = new MLContext(); mlContext.Data // データの読み書き関係の処理が詰まってる mlContext.Transforms // データの変換系が詰まってる mlContext.Regression // 回帰分析系かな? mlContext.BinaryClassification // 2項文累計かな?
みたいな感じです。
とりあえず動いたので引き続き触っていってみよう。