자습서: ML.NET와 함께 k-means 클러스터링을 사용하여 아이리스 꽃 분류

이 자습서에서는 ML.NET을 사용하여 아이리스 꽃 데이터 집합을 위해 클러스터링 모델을 빌드하는 방법을 보여줍니다.

이 자습서에서는 다음과 같은 작업을 수행하는 방법을 살펴봅니다.

  • 문제 이해
  • 적절한 기계 학습 작업 선택
  • 데이터 준비
  • 데이터 로드 및 변환
  • 학습 알고리즘 선택
  • 모델 학습
  • 예측에 모델 사용

사전 요구 사항

문제 이해

이 문제는 꽃 특징을 기반으로 아이리스 꽃 집합을 여러 그룹으로 나누는 것에 관한 것입니다. 그 특징은 꽃받침의 길이 및 너비와 꽃잎의 길이 및 너비입니다. 이 자습서에서는 각 꽃 유형이 알려지지 않은 것으로 가정합니다. 특정으로부터 데이터 집합의 구조를 파악하고 데이터 인스턴스가 이 구조에 어떻게 맞는지 예측해보려 합니다.

적절한 기계 학습 작업 선택

각 꽃이 속한 그룹을 모르기 때문에 감독되지 않는 기계 학습 작업을 선택합니다. 같은 그룹의 요소를 다른 그룹의 요소보다 더 서로 유사한 방식으로 그룹의 데이터 집합을 나누려면 클러스터링 기계 학습 작업을 사용합니다.

콘솔 애플리케이션 만들기

  1. "IrisFlowerClustering"이라는 C# 콘솔 애플리케이션을 만듭니다. 다음 단추를 클릭합니다.

  2. 사용할 프레임워크로 .NET 6을 선택합니다. 만들기 단추를 클릭합니다.

  3. 프로젝트에서 Data 디렉터리를 만들어 데이터 집합과 모델 파일을 저장합니다.

    솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가>새 폴더를 선택합니다. “Data”를 입력하고 Enter 키를 누릅니다.

  4. Microsoft.ML NuGet 패키지를 설치합니다.

    참고

    이 샘플에서는 별도로 지정하지 않은 한 언급된 NuGet 패키지의 최신 안정화 버전을 사용합니다.

    솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리를 선택합니다. "nuget.org"를 패키지 소스로 선택하고, 찾아보기 탭을 선택하고, Microsoft.ML을 검색하고, 설치 단추를 선택합니다. 변경 내용 미리 보기 대화 상자에서 확인 단추를 선택한 다음, 나열된 패키지의 사용 조건에 동의하는 경우 라이선스 승인 대화 상자에서 동의함 단추를 선택합니다.

데이터 준비

  1. iris.data 데이터 집합을 다운로드하고 이전 단계에서 만든 Data 폴더에 저장합니다. 아이리스 데이터 집합에 대한 자세한 내용은 아이리스 꽃 데이터 집합 Wikipedia 페이지와 데이터 집합의 출처인 아이리스 데이터 집합 페이지를 참조하세요.

  2. 솔루션 탐색기에서 iris.data 파일을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 고급 아래에서 출력 디렉터리에 복사 값을 변경된 내용만 복사로 변경합니다.

iris.data 파일에는 다음을 나타내는 5개의 열이 있습니다.

  • 꽃받침 길이(cm)
  • 꽃받침 너비(cm)
  • 꽃잎 길이(cm)
  • 꽃잎 너비(cm)
  • 아이리스 꽃의 종류

클러스터링 예제에서 이 자습서는 마지막 열을 무시합니다.

데이터 클래스 만들기

입력 데이터 및 예측에 대한 클래스를 만듭니다.

  1. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가>새 항목을 선택합니다.

  2. 새 항목 추가 대화 상자에서 클래스를 선택하고 이름 필드를 IrisData.cs로 변경합니다. 그런 다음, 추가 단추를 선택합니다.

  3. 새 파일에 다음 using 지시문을 추가합니다.

    using Microsoft.ML.Data;
    

기존 클래스 정의를 제거하고 IrisDataClusterPrediction 클래스를 정의하는 다음 코드를 IrisData.cs 파일에 추가합니다.

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 속성을 사용하여 PredictedClusterIdDistances 필드를 각각 PredictedLabelScore 열에 바인딩합니다. 클러스터링 작업의 경우 이들 열의 의미는 다음과 같습니다.

  • PredictedLabel열에는 예측된 클러스터의 ID가 있습니다.
  • Score 열에는 클러스터 중심까지의 유클리드 거리가 제곱인 배열이 포함됩니다. 배열 길이는 클러스터와 같습니다.

참고

float 유형을 사용하여 입력 및 예측 데이터 클래스에서 부동 소수점 값을 나타냅니다.

데이터 및 모델 경로 정의

Program.cs 파일로 돌아가서 두 개의 필드를 추가하여 데이터 집합 파일에 대한 경로와 모델을 저장할 파일에 대한 경로를 저장합니다.

  • _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를 반환합니다.

학습 파이프라인 만들기

이 자습서의 경우 클러스터링 작업의 학습 파이프라인은 다음 두 단계로 구성됩니다.

  • 로드된 열을 클러스터링 교육 담당자가 사용하는 하나의 기능 열로 연결합니다.
  • KMeansTrainer 교육 담당자를 사용하여 k-means++ 클러스터링 알고리즘을 사용하는 모델을 학습합니다.

데이터를 로드한 후에 다음을 추가합니다.

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입니다. PredictionEngine는 스레드로부터 안전하지 않습니다. 단일 스레드 또는 프로토타입 환경에서 사용할 수 있습니다. 프로덕션 환경에서 성능 및 스레드 보안을 개선하려면 PredictionEnginePool 서비스를 사용합니다. 이 서비스는 애플리케이션 전체에서 사용할 PredictionEngine 개체의 ObjectPool을 만듭니다. ASP.NET Core Web API에서 PredictionEnginePool을 사용하는 방법에 대한 이 가이드를 참조하세요.

참고

PredictionEnginePool 서비스 확장은 현재 미리 보기 상태입니다.

테스트 데이터 인스턴스를 수용할 수 있도록 TestIrisData 클래스를 만듭니다.

  1. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가>새 항목을 선택합니다.

  2. 새 항목 추가 대화 상자에서 클래스를 선택하고 이름 필드를 TestIrisData.cs로 변경합니다. 그런 다음, 추가 단추를 선택합니다.

  3. 다음 예제처럼 클래스를 static으로 수정합니다.

    static class TestIrisData
    

이 자습서에서는 이 클래스 내에 하나의 아이리스 데이터 인스턴스를 소개합니다. 이 모델로 실험할 다른 시나리오를 추가할 수 있습니다. 다음 코드를 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>())}");

프로그램을 실행하여 지정된 데이터 인스턴스가 포함된 클러스터와 해당 인스턴스에서 클러스터 중심까지 제곱 거리를 확인합니다. 다음과 같은 결과가 나타나야 합니다.

Cluster: 2
Distances: 11.69127 0.02159119 25.59896

지금까지 이제 아이리스 클러스터링을 위한 기계 학습 모델을 성공적으로 구축하고 예측을 위해 사용했습니다. dotnet/samples GitHub 리포지토리에서 이 자습서의 소스 코드를 찾을 수 있습니다.

다음 단계

본 자습서에서는 다음 작업에 관한 방법을 학습했습니다.

  • 문제 이해
  • 적절한 기계 학습 작업 선택
  • 데이터 준비
  • 데이터 로드 및 변환
  • 학습 알고리즘 선택
  • 모델 학습
  • 예측에 모델 사용

학습을 계속하고 더 많은 샘플을 찾으려면 GitHub 리포지토리를 체크 아웃하세요.