학습된 모델을 사용하여 예측
학습된 모델을 사용하여 예측을 만드는 방법을 알아봅니다.
데이터 모델 만들기
입력 데이터
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; }
}
출력 데이터
Features
및 Label
입력 열 이름과 마찬가지로 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
를 가져와야 합니다. 예를 들어, IEnumerable<HousingInput>
을 가져와 LINQ의 Select
메서드를 사용하여 각 요소에 Predict
메서드를 적용하십시오.
이 코드 샘플은 PredictionEnginePool이라는 predictionEnginePool
와 housingData
라는 IEnumerable<HousingData>
가 있다고 가정합니다.
IEnumerable<HousingPrediction> predictions = housingData.Select(input => predictionEnginePool.Predict(input));
결과는 예측 인스턴스를 포함하는 IEnumerable
객체입니다. 이 경우 IEnumerable<HousingPrediction>
입니다.
.NET