학습된 모델로 예측

학습된 모델을 사용하여 예측을 수행하는 방법 알아보기

데이터 모델 만들기

입력 데이터

public class HousingData
{
    [LoadColumn(0)]
    public float Size { get; set; }

    [LoadColumn(1, 3)]
    [VectorType(3)]
    public float[] HistoricalPrices { get; set; }

    [LoadColumn(4)]
    [ColumnName("Label")]
    public float CurrentPrice { get; set; }
}

출력 데이터

FeaturesLabel 열 이름처럼 ML.NET에는 모델에서 생성한 예측된 값 열에 대한 기본 이름이 있습니다. 작업에 따라 이 이름을 달라질 수 있습니다.

이 샘플에서 사용하는 알고리즘은 선형 회귀 알고리즘이므로 출력 열의 기본 이름은 Score이며 PredictedPrice 속성에 대한 ColumnName 특성으로 정의됩니다.

class HousingPrediction
{
    [ColumnName("Score")]
    public float PredictedPrice { get; set; }
}

예측 파이프라인 설정

단일 또는 일괄 처리 예측 모두에서 예측 파이프라인을 애플리케이션에 로드해야 합니다. 이 파이프라인은 미리 처리된 변환과 학습된 모델을 모두 포함합니다. 아래 코드 조각은 이름이 model.zip인 파일에서 예측 파이프라인을 로드합니다.

//Create MLContext
MLContext mlContext = new MLContext();

// Load Trained Model
DataViewSchema predictionPipelineSchema;
ITransformer predictionPipeline = mlContext.Model.Load("model.zip", out predictionPipelineSchema);

단일 예측

단일 예측을 만들려면 로드된 예측 파이프라인을 사용하여 PredictionEngine을 만듭니다.

// Create PredictionEngines
PredictionEngine<HousingData, HousingPrediction> predictionEngine = mlContext.Model.CreatePredictionEngine<HousingData, HousingPrediction>(predictionPipeline);

그런 다음, Predict 메서드를 사용하여 입력 데이터를 매개 변수로 전달합니다. Predict 메서드를 사용할 때는 입력이 IDataView가 되지 않아도 됩니다. 이것은 입력 데이터 형식의 개체를 전달할 수 있도록 입력 데이터 형식 조작을 간편하게 내부화하기 때문입니다. 또한 CurrentPrice는 새 데이터를 통해 예측하려는 대상 또는 레이블이므로 해당 시점에는 값이 없다고 가정합니다.

// Input Data
HousingData inputData = new HousingData
{
    Size = 900f,
    HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
};

// Get Prediction
HousingPrediction prediction = predictionEngine.Predict(inputData);

prediction 개체의 Score 속성에 액세스할 경우 150079와 유사한 값을 가져와야 합니다.

PredictionEngine는 스레드로부터 안전하지 않습니다. 또한 애플리케이션 내에서 필요한 모든 위치에서 인스턴스를 만들어야 합니다. 애플리케이션이 커지면 이 프로세스를 관리할 수 없게 됩니다. 성능 및 스레드 보안을 개선하려면 종속성 주입과 PredictionEnginePool 서비스를 함께 사용합니다. 이 서비스는 애플리케이션 전체에서 사용할 PredictionEngine 개체의 ObjectPool을 만듭니다.

PredictionEnginePool 서비스를 사용하는 방법에 관한 예제는 웹 API에 모델 배포Azure Functions에 모델 배포를 참조하세요.

자세한 내용은 ASP.NET Core에서 종속성 주입을 참조하세요.

다중 예측(IDataView)

다음 데이터의 경우 IDataView에 로드합니다. 이 경우 IDataView의 이름은 inputData입니다. CurrentPrice는 새 데이터를 통해 예측하려는 대상 또는 레이블이므로 해당 시점에는 값이 없다고 가정합니다.

// Actual data
HousingData[] housingData = new HousingData[]
{
    new HousingData
    {
        Size = 850f,
        HistoricalPrices = new float[] { 150000f, 175000f, 210000f }
    },
    new HousingData
    {
        Size = 900f,
        HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
    },
    new HousingData
    {
        Size = 550f,
        HistoricalPrices = new float[] { 99000f, 98000f, 130000f }
    }
};

이제 Transform 메서드를 사용하여 데이터 변환을 적용하고 예측을 생성합니다.

// Predicted Data
IDataView predictions = predictionPipeline.Transform(inputData);

GetColumn 메서드를 사용하여 예측된 값을 검사합니다.

// Get Predictions
float[] scoreColumn = predictions.GetColumn<float>("Score").ToArray();

점수 열의 예측된 값은 다음과 유사합니다.

관측 예측
1 144638.2
2 150079.4
3 107789.8

다중 예측(PredictionEnginePool)

PredictionEnginePool을 사용하여 여러 예측을 수행하려면 모델 입력의 여러 인스턴스를 포함하는 IEnumerable을 가져올 수 있습니다. 예를 들어 LINQ의 Select 메서드를 사용하여 각 요소에 IEnumerable<HousingInput>Predict 메서드를 적용합니다.

이 코드 샘플에서는 predictionEnginePool이라는 이름의 PredictionEnginePoolhousingData라는 이름의 IEnumerable<HousingData>가 있다고 가정합니다.

IEnumerable<HousingPrediction> predictions = housingData.Select(input => predictionEnginePool.Predict(input));

결과는 예측의 인스턴스를 포함하는 IEnumerable입니다. 이 경우 IEnumerable<HousingPrediction>입니다.