모델 학습 및 평가
ML.NET을 사용한 기계 학습 모델 빌드, 메트릭 수집 및 성능 측정 방법을 알아봅니다. 이 샘플에서는 회귀 모델을 학습하지만 개념은 대부분의 다른 알고리즘에 널리 적용할 수 있습니다.
학습 및 테스트를 위한 데이터 분할
기계 학습 모델의 목표는 학습 데이터 안에서 패턴을 식별하는 것입니다. 이러한 패턴은 새 데이터를 사용하여 예측을 수행하는 데 사용됩니다.
데이터는 HousingData
같은 클래스로 모델링할 수 있습니다.
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; }
}
IDataView
로 로드되는 다음 데이터의 경우:
HousingData[] housingData = new HousingData[]
{
new HousingData
{
Size = 600f,
HistoricalPrices = new float[] { 100000f ,125000f ,122000f },
CurrentPrice = 170000f
},
new HousingData
{
Size = 1000f,
HistoricalPrices = new float[] { 200000f, 250000f, 230000f },
CurrentPrice = 225000f
},
new HousingData
{
Size = 1000f,
HistoricalPrices = new float[] { 126000f, 130000f, 200000f },
CurrentPrice = 195000f
},
new HousingData
{
Size = 850f,
HistoricalPrices = new float[] { 150000f,175000f,210000f },
CurrentPrice = 205000f
},
new HousingData
{
Size = 900f,
HistoricalPrices = new float[] { 155000f, 190000f, 220000f },
CurrentPrice = 210000f
},
new HousingData
{
Size = 550f,
HistoricalPrices = new float[] { 99000f, 98000f, 130000f },
CurrentPrice = 180000f
}
};
TrainTestSplit
메서드를 사용하여 데이터를 학습 및 테스트 집합으로 분할합니다. 그 결과는 학습 집합용 하나와 테스트 집합용 하나 등, 두 IDataView
멤버를 갖는 TrainTestData
개체가 됩니다. 데이터 분할 백분율은 testFraction
매개 변수로 결정됩니다. 아래 코드 조각은 원래 데이터의 20%를 테스트 집합용으로 보유합니다.
DataOperationsCatalog.TrainTestData dataSplit = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
IDataView trainData = dataSplit.TrainSet;
IDataView testData = dataSplit.TestSet;
데이터 준비
기계 학습 모델로 학습하려면 먼저 데이터를 미리 처리해야 합니다. 데이터 준비에 대한 자세한 정보는 데이터 준비 방법 문서 및 transforms page
에서 확인할 수 있습니다.
ML.NET 알고리즘은 입력 열 형식에 제약 조건이 있습니다. 또한 값을 지정하지 않은 경우 입력 및 출력 열에 기본값을 사용합니다.
예상한 열 형식 작업
ML.NET의 기계 학습 알고리즘은 입력으로 알려진 크기의 부동 소수점 벡터를 기대합니다. 모든 데이터가 이미 숫자 형식이고 다 함께 처리될 예정이라면(즉 이미지 픽셀) 데이터 모델에 VectorType
특성을 적용합니다.
데이터의 일부가 숫자가 아니며 열마다 각기 다른 데이터 변환을 적용하려는 경우 모든 열이 처리된 뒤에 Concatenate
메서드를 사용하여 모든 개별 열을 새 열에 출력되는 단일 기능 벡터로 결합합니다.
다음 코드 조각은 Size
및 HistoricalPrices
열을 새 열 Features
에 출력되는 단일 기능 벡터로 결합합니다. 배율에 차이가 있기 때문에 NormalizeMinMax
는 데이터 표준화를 위해 Features
열에 적용됩니다.
// Define Data Prep Estimator
// 1. Concatenate Size and Historical into a single feature vector output to a new column called Features
// 2. Normalize Features vector
IEstimator<ITransformer> dataPrepEstimator =
mlContext.Transforms.Concatenate("Features", "Size", "HistoricalPrices")
.Append(mlContext.Transforms.NormalizeMinMax("Features"));
// Create data prep transformer
ITransformer dataPrepTransformer = dataPrepEstimator.Fit(trainData);
// Apply transforms to training data
IDataView transformedTrainingData = dataPrepTransformer.Transform(trainData);
기본 열 이름 작업
지정하지 않은 경우 ML.NET 알고리즘은 기본 열 이름을 사용합니다. 모든 학습자는 알고리즘 입력을 위해 featureColumnName
매개 변수를 가지며 해당하는 경우 예상된 값에 대한 매개 변수 labelColumnName
도 갖습니다. 이러한 값은 기본적으로 각각 Features
및 Label
입니다.
미리 처리하는 중에 Concatenate
메서드를 사용하여 Features
라는 새 열을 만들면 알고리즘의 매개 변수에서 기능 열을 지정할 필요가 없습니다. 미리 처리된 IDataView
에 이미 존재하기 때문입니다. 레이블 열은 CurrentPrice
이지만 데이터 모델에서 ColumnName
특성을 사용하므로 ML.NET이 CurrentPrice
열의 이름을 Label
로 바꿉니다. 이 때문에 labelColumnName
매개 변수를 기계 학습 모델 평가자에 제공할 필요가 없습니다.
기본 열 이름을 사용하지 않으려면 이후의 코드 조각에서 설명하는 것처럼 기계 학습 알고리즘 평가자를 정의할 때 기능과 레이블 열 이름을 매개 변수로 전달합니다.
var UserDefinedColumnSdcaEstimator = mlContext.Regression.Trainers.Sdca(labelColumnName: "MyLabelColumnName", featureColumnName: "MyFeatureColumnName");
데이터 캐싱
기본적으로 데이터를 처리할 때 데이터는 지연 로드되거나 스트리밍됩니다. 즉, 트레이너가 디스크에서 데이터를 로드하고 학습 중에 여러 번 반복할 수 있습니다. 따라서 데이터를 디스크에서 로드하는 횟수를 줄일 수 있도록 메모리에 맞는 데이터 세트를 위해 캐싱을 권장합니다. 캐싱은 AppendCacheCheckpoint
를 사용하여 EstimatorChain
의 일부로 이루어집니다.
파이프라인의 모든 트레이너 전에 AppendCacheCheckpoint
를 사용하는 것이 좋습니다.
다음 EstimatorChain
을 사용하여 StochasticDualCoordinateAscent
트레이너 앞에 AppendCacheCheckpoint
를 사용하면 이전 예측 도구의 결과가 나중에 트레이너에서 사용되도록 캐시됩니다.
// 1. Concatenate Size and Historical into a single feature vector output to a new column called Features
// 2. Normalize Features vector
// 3. Cache prepared data
// 4. Use Sdca trainer to train the model
IEstimator<ITransformer> dataPrepEstimator =
mlContext.Transforms.Concatenate("Features", "Size", "HistoricalPrices")
.Append(mlContext.Transforms.NormalizeMinMax("Features"))
.AppendCacheCheckpoint(mlContext);
.Append(mlContext.Regression.Trainers.Sdca());
기계 학습 모델 학습
데이터를 미리 처리한 후에는 Fit
메서드를 사용하여 StochasticDualCoordinateAscent
회귀 알고리즘으로 기계 학습 모델을 학습합니다.
// Define StochasticDualCoordinateAscent regression algorithm estimator
var sdcaEstimator = mlContext.Regression.Trainers.Sdca();
// Build machine learning model
var trainedModel = sdcaEstimator.Fit(transformedTrainingData);
모델 매개 변수 추출
모델을 학습한 후에는 검사 또는 재학습을 위해 학습한 ModelParameters
를 추출합니다. LinearRegressionModelParameters
는 편차와 학습된 계수 또는 학습된 모델의 가중치를 제공합니다.
var trainedModelParameters = trainedModel.Model as LinearRegressionModelParameters;
참고 항목
다른 모델에는 해당 작업에 특정한 매개 변수가 있습니다. 예를 들어, K-Means 알고리즘은 무게 중심에 따라 클러스터에 데이터를 배치하며 KMeansModelParameters
에는 이러한 학습된 무게 중심을 저장하는 속성이 있습니다. 자세한 정보는 Microsoft.ML.Trainers
API 설명서에서 이름에 ModelParameters
가 포함된 클래스를 찾아보세요.
모델 품질 평가
최상의 모델을 선택하기 위해 테스트 데이터에서 성능을 반드시 평가해야 합니다. Evaluate
메서드를 사용하여 학습된 모델에 대한 여러 메트릭을 측정합니다.
참고 항목
Evaluate
메서드는 수행된 기계 학습 작업에 따라 다른 메트릭을 생성합니다. 자세한 정보는 Microsoft.ML.Data
API 설명서에서 이름에 Metrics
가 포함된 클래스를 찾아보세요.
// Measure trained model performance
// Apply data prep transformer to test data
IDataView transformedTestData = dataPrepTransformer.Transform(testData);
// Use trained model to make inferences on test data
IDataView testDataPredictions = trainedModel.Transform(transformedTestData);
// Extract model metrics and get RSquared
RegressionMetrics trainedModelMetrics = mlContext.Regression.Evaluate(testDataPredictions);
double rSquared = trainedModelMetrics.RSquared;
앞의 코드 샘플에서:
- 테스트 데이터 세트는 앞에서 정의한 데이터 준비 변환을 통해 미리 처리됩니다.
- 학습된 기계 학습 모델을 사용하여 테스트 데이터에 대한 예측을 수행합니다.
Evaluate
메서드에서 테스트 데이터 세트의CurrentPrice
열 값을 새 출력 예측의Score
열과 비교하여 회귀 모델의 메트릭을 계산하는데, 이 중 하나인 R 제곱이rSquared
변수에 저장됩니다.
참고 항목
이 작은 예제에서 R 제곱은 데이터의 크기 제한으로 인해 0-1 범위에 있지 않은 숫자입니다. 실제 시나리오에서는 0과 1 사이의 값이 됩니다.
.NET