다음을 통해 공유


학습된 모델을 사용하여 예측

학습된 모델을 사용하여 예측을 만드는 방법을 알아봅니다.

데이터 모델 만들기

입력 데이터

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 모델에서 생성된 예측 값 열에 대한 기본 이름을 줍니다. 이름은 작업에 따라 다를 수 있습니다.

이 샘플에서 사용되는 알고리즘은 선형 회귀 알고리즘이므로 출력 열의 기본 이름은 ScorePredictedPrice 속성의 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를 가져와야 합니다. 예를 들어, IEnumerable<HousingInput>을 가져와 LINQ의 Select 메서드를 사용하여 각 요소에 Predict 메서드를 적용하십시오.

이 코드 샘플은 PredictionEnginePool이라는 predictionEnginePoolhousingData라는 IEnumerable<HousingData>가 있다고 가정합니다.

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

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