かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Hello ML.NET world

.NET Core 3.1 もリリースされたし ML.NET でも少し触ってみようと思います。今はカフェで Surface Go しか持ってないので先日作って寝かせておいた VIsual Studio Online につないでやってみようと思います。

.NET Core 3.1

このページに従ってコマンドをうってたらインストールできます。

docs.microsoft.com

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]

プロジェクトを作ってためしてみる

とりあえず以下のページの通りにやっていきます。まず写経。

docs.microsoft.com

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項文累計かな?

みたいな感じです。

とりあえず動いたので引き続き触っていってみよう。