次の方法で共有


チュートリアル: ML.NET を使用した k 平均クラスタリングを使用してあやめの花を分類する

このチュートリアルでは、ML.NET を使用して、あやめの花データセットのクラスタリング モデルを構築する方法について説明します。

このチュートリアルでは、次の方法について説明します。

  • 問題を理解する
  • 適切な機械学習タスクを選択する
  • データを準備する
  • データを読み込んで変換する
  • 学習アルゴリズムを選択する
  • モデルをトレーニングする
  • 予測にモデルを使用する

前提 条件

問題を理解する

この問題は、花の特徴に基づいて、異なるグループであやめの花のセットを分割することです。 これらの特徴は、セパルの長さと幅、花弁の長さと幅です。 このチュートリアルでは、各花の種類が不明であると仮定します。 特徴からデータ セットの構造を学習し、データ インスタンスがこの構造にどのように適合するかを予測する必要があります。

適切な機械学習タスクを選択する

各花がどのグループに属するかがわからないので、教師なし機械学習 タスク 選択します。 同じグループ内の要素が他のグループの要素とより類似するようにグループ内のデータ セットを分割するには、機械学習タスク クラスタリングを使用します。

コンソール アプリケーションを作成する

  1. "IrisFlowerClustering" という名前の C# コンソール アプリケーション を作成します。 [次へ] ボタンをクリックします。

  2. 使用するフレームワークとして .NET 8 を選択します。 [作成] ボタンをクリックします。

  3. Data という名前のディレクトリをプロジェクトに作成し、データ セットとモデル ファイルを格納します。

    ソリューション エクスプローラーで、プロジェクトを右クリックし、[追加]>[新しいフォルダー] を選択します。 「データ」と入力し、「」を選択し、「」を押します。

  4. Microsoft.ML NuGet パッケージをインストールします。

    手記

    このサンプルでは、特に明記されていない限り、記載されている最新の安定バージョンの NuGet パッケージを使用します。

    ソリューション エクスプローラーで、プロジェクトを右クリックし、[NuGet パッケージの管理]選択します。 パッケージ ソースとして "nuget.org" を選択します。[参照] タブを選択し、「Microsoft.ML」を検索して、[インストール] を選択します。 [Preview Changes] ダイアログで [OK] ボタンを選択し、表示されているパッケージのライセンス条項に同意する場合は、[ライセンス同意] ダイアログで [ 同意する] ボタンを 選択します。

データを準備する

  1. iris.data データ セットをダウンロードし、前の手順で作成した Data フォルダーに保存します。 あやめのデータセットの詳細については、Wikipedia のページ あやめの花データセットと、データセットのソースである Iris Data Set ページを参照してください。

  2. ソリューション エクスプローラー で、iris.data ファイルを右クリックし、[プロパティ]選択します。 [詳細設定] で、[出力ディレクトリにコピー] の値を [新しい場合はコピーする] に変更します。

iris.data ファイルには、次を表す 5 つの列が含まれています。

  • がく片の長さ(センチメートル)
  • 花弁の幅(センチメートル)
  • 花弁の長さ (センチメートル)
  • 花弁の幅 (センチメートル単位)
  • あやめの花の種類

クラスタリングの例では、このチュートリアルでは最後の列を無視します。

データ クラスを作成する

入力データと予測のクラスを作成します。

  1. ソリューション エクスプローラーでプロジェクトを右クリックし、次に [追加]>[新しい項目]を選択します。

  2. [新しい項目の追加] ダイアログ ボックスで、[クラス] 選択し、[ フィールドを IrisData.csに変更します。 次に [] を選択して [] を追加します。

  3. 新しいファイルに次の using ディレクティブを追加します。

    using Microsoft.ML.Data;
    

既存のクラス定義を削除し、IrisData.cs ファイルにクラス IrisDataClusterPredictionを定義する次のコードを追加します。

public class IrisData
{
    [LoadColumn(0)]
    public float SepalLength;

    [LoadColumn(1)]
    public float SepalWidth;

    [LoadColumn(2)]
    public float PetalLength;

    [LoadColumn(3)]
    public float PetalWidth;
}

public class ClusterPrediction
{
    [ColumnName("PredictedLabel")]
    public uint PredictedClusterId;

    [ColumnName("Score")]
    public float[]? Distances;
}

IrisData は入力データ クラスであり、データ セットの各機能の定義があります。 LoadColumn 属性を使用して、データ セット ファイル内のソース列のインデックスを指定します。

ClusterPrediction クラスは、IrisData インスタンスに適用されるクラスタリング モデルの出力を表します。 ColumnName 属性を使用して、PredictedClusterId フィールドと Distances フィールドをそれぞれ PredictedLabel にバインドし、Score 列にバインドします。 クラスタリング タスクの場合、これらの列には次の意味があります。

  • PredictedLabel 列には、予測されたクラスターの ID が含まれています。
  • Score 列には、クラスターの重心へのユークリッド距離を二乗した値の配列が含まれます。 配列の長さはクラスターの数と同じです。

手記

入力データ クラスと予測データ クラスの浮動小数点値を表すには、float 型を使用します。

データパスとモデルパスを定義する

Program.cs ファイルに戻り、データ セット ファイルとファイルへのパスを保持する 2 つのフィールドを追加して、モデルを保存します。

  • _dataPath には、モデルのトレーニングに使用されるデータ セットを含むファイルへのパスが含まれています。
  • _modelPath には、トレーニング済みのモデルが格納されているファイルへのパスが含まれています。

これらのパスを指定するには、using ディレクティブの下に次のコードを追加します。

string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");

ML コンテキストを作成する

Program.cs ファイルの先頭に、次の追加の using ディレクティブを追加します。

using Microsoft.ML;
using IrisFlowerClustering;

Console.WriteLine("Hello World!"); 行を次のコードに置き換えます。

var mlContext = new MLContext(seed: 0);

Microsoft.ML.MLContext クラスは機械学習環境を表し、データの読み込み、モデル トレーニング、予測、およびその他のタスクのログ記録とエントリ ポイントのメカニズムを提供します。 これは概念的には、Entity Framework で DbContext を使用する場合と同等です。

データの読み込みを設定する

データを読み込む方法を設定するには、MLContext の下に次のコードを追加します。

IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');

ジェネリック MLContext.Data.LoadFromTextFile 拡張メソッド 指定された IrisData 型からデータ セット スキーマを推論し、トランスフォーマーの入力として使用できる IDataView を返します。

学習パイプラインを作成する

このチュートリアルでは、クラスタリング タスクの学習パイプラインは、次の 2 つの手順で構成されます。

  • 読み込まれた列を、クラスタリング トレーナーによって使用される 1 つの Features 列に連結します。
  • k-means++ クラスタリング アルゴリズムを使用してモデルをトレーニングするには、KMeansTrainer トレーナーを使用します。

データを読み込んだ後、次のコードを追加します。

string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
    .Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
    .Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));

このコードでは、データ セットを 3 つのクラスターに分割する必要があることを指定します。

モデルをトレーニングする

前のセクションで追加した手順により、トレーニング用のパイプラインが準備されましたが、実行されていません。 ファイルの下部に次の行を追加して、データの読み込みとモデルトレーニングを実行します。

var model = pipeline.Fit(dataView);

モデルを保存する

この時点で、既存または新しい .NET アプリケーションのいずれかに統合できるモデルがあります。 モデルを .zip ファイルに保存するには、Fit メソッドを呼び出す次のコードを追加します。

using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
    mlContext.Model.Save(model, dataView.Schema, fileStream);
}

予測にモデルを使用する

予測を行うには、トランスフォーマー パイプラインを介して入力型のインスタンスを受け取り、出力型のインスタンスを生成する PredictionEngine<TSrc,TDst> クラスを使用します。 次の行を追加して、そのクラスのインスタンスを作成します。

var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);

PredictionEngine は便利な API であり、データの 1 つのインスタンスに対して予測を実行できます。 PredictionEngine はスレッド セーフではありません。 シングルスレッド環境またはプロトタイプ環境で使用することは許容されます。 運用環境でのパフォーマンスとスレッド セーフを向上させるには、アプリケーション全体で使用する PredictionEngine オブジェクトの ObjectPool を作成する PredictionEnginePool サービスを使用します。 ASP.NET Core Web APIで どのように使用するかについては、このガイドを参照してください。

手記

PredictionEnginePool サービス拡張機能は現在プレビュー段階です。

テスト データ インスタンスを収容する TestIrisData クラスを作成します。

  1. ソリューション エクスプローラー で、プロジェクトを右クリックして、[追加 ] [新しい項目>] を選択

  2. [新しい項目 の追加 ] ダイアログ ボックスで、[クラス 選択し、[名] フィールドを TestIrisData.csに変更します。 その後、 [追加] を選択します。

  3. 次の例のように、クラスを静的に変更します。

    static class TestIrisData
    

このチュートリアルでは、このクラス内に 1 つの iris データ インスタンスを紹介します。 他のシナリオを追加して、モデルを試すことができます。 TestIrisData クラスに次のコードを追加します。

internal static readonly IrisData Setosa = new IrisData
{
    SepalLength = 5.1f,
    SepalWidth = 3.5f,
    PetalLength = 1.4f,
    PetalWidth = 0.2f
};

指定した項目が属するクラスターを確認するには、Program.cs ファイルに戻り、ファイルの下部に次のコードを追加します。

var prediction = predictor.Predict(TestIrisData.Setosa);
Console.WriteLine($"Cluster: {prediction.PredictedClusterId}");
Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances ?? Array.Empty<float>())}");

プログラムを実行して、指定されたデータ インスタンスを含むクラスターと、そのインスタンスからクラスターの重心までの 2 乗距離を確認します。 結果は次のようになります。

Cluster: 2
Distances: 11.69127 0.02159119 25.59896

おめでとうございます! これで、虹彩クラスタリング用の機械学習モデルが正常に構築され、それを使用して予測が行われるようになりました。 このチュートリアルのソース コードは、GitHub リポジトリの dotnet/samples にあります。

次の手順

このチュートリアルでは、次の方法を学習しました。

  • 問題を理解する
  • 適切な機械学習タスクを選択する
  • データを準備する
  • データを読み込んで変換する
  • 学習アルゴリズムを選択する
  • モデルをトレーニングする
  • 予測にモデルを使用する

dotnet/machinelearning GitHub リポジトリを確認して、学習を続け、その他のサンプルを見つけてください。