-
ML.NET MSSQL 연동 [4]AI/ML.NET 2020. 11. 24. 14:15728x90
찾기가 너무 힘들어서 예제를 찾아보았다.
예제코드에 보기 좋게 설명을 달아 놓았다. 따로따로 보기가 너무 불편해서... 이렇게 보니 금방 이해가 된다.
문제는 파이프라인을 정의 하여 모델을 만들때 사용하는 부분에서 mlContext의 종속 메서드들의 정의가 필요할 것 같다.
public MLContext (int? seed = default); 이렇게 정의 되는데 seed 값이 무엇을 의미하는지 알아야 할 것 같았다.
MS-DOC에는 아래와 같이 설명되어 있다. seed값에 따라서 모델의 일관성유지가 된다는 소리 같은데 null을 보통 사용해도 상관없을 듯 싶다. 특별한 경우가 아니라면...
더보기ML.NET 많은 작업은 무작위 데이터 셔플, 무작위 샘플링, 무작위 매개 변수 초기화, 무작위 순열, 무작위 기능 선택 등과 같은 임의성을 필요로 합니다. MLContext의 난수 생성기는 이러한 모든 무작위 작업에 대한 임의의 글로벌 소스입니다.
고정 된 시드가 제공하는 경우 MLContext 환경은 결정적이되므로 결과가 반복 가능하고 여러 실행에서 동일하게 유지됩니다. 예를 들어 ML.NET의 API 참조 예제 코드 조각의 많은 경우 시드가 제공됩니다. 사용자가 예제 주석에 포함된 것과 동일한 출력을 얻으려면 사용자가 자신의 컴퓨터에서 예제를 실행하기 때문입니다.seed
일반적으로 반복성은 요구 사항이 아니며 기본 동작입니다. 시드가 제공하지 않는 경우, 즉 MLContext 환경은 결정적이지 않게 되고 여러 실행에서 출력이 변경됩니다.seednull
ML.NET 최소 최대 정규화, 열 연결, 누락된 값 표시 등과 같이 임의성을 사용하지 않는 작업이 많이 있습니다. 이러한 작업의 동작은 시드 값에 관계없이 결정적입니다.
또한 ML.NET 트레이너는 훈련이 끝난 후 임의성을 사용하지 않습니다. 따라서 로드된 모델의 예측은 시드 값에 의존하지 않습니다.
using System; using System.Collections.Generic; using System.Data.SqlClient; using System.IO; using System.Linq; using Microsoft.ML; using Microsoft.ML.Data; using Microsoft.ML.Transforms.TimeSeries; namespace BikeDemandForecasting { class Program {/* 이 예제에서 사용되는 알고리즘은 SSA(Singular Spectrum Analysis)입니다. SSA는 시계열을 주요 구성 요소 집합으로 분리하는 방식으로 작동합니다. 이러한 구성 요소는 추세, 노이즈, 계절성 및 기타 여러 요소에 해당하는 신호의 일부분으로 해석될 수 있습니다.그런 다음 이러한 구성 요소가 재구성되어 나중에 값을 예측하는 데 사용됩니다.*/ static void Main(string[] args) { string rootDir = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "../../../")); string dbFilePath = Path.Combine(rootDir, "Data", "DailyDemand.mdf"); string modelPath = Path.Combine(rootDir, "MLModel.zip"); var connectionString = $"Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename={dbFilePath};Integrated Security=True;Connect Timeout=30;"; //MLContext 클래스는 모든 ML.NET 작업의 시작점이며, //mlContext를 초기화하면 모델 생성 워크플로 개체 간에 공유할 수 있는 새 ML.NET 환경이 생성됩니다. //개념적으로 Entity Framework의 DBContext와 유사합니다. MLContext mlContext = new MLContext(); //ModelInput 형식의 레코드를 로드하는 DatabaseLoader를 만듭니다. DatabaseLoader loader = mlContext.Data.CreateDatabaseLoader<ModelInput>(); //데이터베이스에서 데이터를 로드하는 쿼리를 정의합니다. //ML.NET 알고리즘은 데이터를 Single 형식으로 간주합니다. 따라서 Real 형식이 아닌 데이터베이스에서 가져온 숫자 값(단정밀도 부동 소수점 값)은 Real로 변환해야 합니다. string query = "SELECT RentalDate, CAST(Year as REAL) as Year, CAST(TotalRentals as REAL) as TotalRentals FROM Rentals"; //데이터베이스에 연결하고 쿼리를 실행하는 DatabaseSource를 만듭니다. DatabaseSource dbSource = new DatabaseSource(SqlClientFactory.Instance, connectionString, query); //데이터를 IDataView에 로드합니다. IDataView dataView = loader.Load(dbSource); //데이터 세트에는 두 개 연도 분량의 데이터가 포함됩니다. //첫 번째 연도의 데이터만 학습에 사용되고, //두 번째 연도는 모델에서 생성된 예측과 실제 값을 비교하는 데 사용됩니다. //FilterRowsByColumn 변환을 사용하여 데이터를 필터링합니다. //SplitData - 학습용데이터와 테스트용데이터를 나누는것인데 설명 부족. IDataView firstYearData = mlContext.Data.FilterRowsByColumn(dataView, "Year", upperBound: 1); IDataView secondYearData = mlContext.Data.FilterRowsByColumn(dataView, "Year", lowerBound: 1); //forecastingPipeline은 첫 번째 연도와 샘플에 대해 365개의 데이터 요소를 사용하거나 //시계열 데이터 세트를 seriesLength 매개 변수에 지정된 대로 30일(월별) 간격으로 분할합니다. //이러한 각 샘플은 주별 또는 7일 기간을 통해 분석됩니다. //다음 기간에 대한 예측 값을 결정할 때 이전 7일의 값을 사용하여 예측을 수행합니다. //모델은 horizon 매개 변수로 정의된 대로 향후 7일의 기간을 예측하도록 설정됩니다. //예측은 추측이므로 항상 100 % 정확하지는 않습니다. //따라서 상한 및 하한으로 정의된 최선 및 최악의 시나리오 값 범위를 파악하고 있는 것이 좋습니다. //이 경우 하한 및 상한에 대한 신뢰 수준은 95 % 로 설정됩니다. //신뢰 수준을 적절하게 높이거나 줄일 수 있습니다. //값이 높을수록 원하는 수준의 신뢰도를 얻기 위해 상한 및 하한 간 범위가 넓어집니다. var forecastingPipeline = mlContext.Forecasting.ForecastBySsa( outputColumnName: "ForecastedRentals", inputColumnName: "TotalRentals", windowSize: 7, seriesLength: 30, trainSize: 365, horizon: 7, confidenceLevel: 0.95f, confidenceLowerBoundColumn: "LowerBoundRentals", confidenceUpperBoundColumn: "UpperBoundRentals"); //SsaForecastingEstimator를 사용하여 시계열 데이터 세트의 값을 예측하는 파이프라인을 정의합니다. //Fit 메서드를 사용하여 모델을 학습하고 이전에 정의된 forecastingPipeline에 데이터를 맞춥니다. SsaForecastingTransformer forecaster = forecastingPipeline.Fit(firstYearData); //모델평가 메서드 Evaluate(secondYearData, forecaster, mlContext); //모델저장 부분 //TimeSeriesPredictionEngine을 만듭니다. TimeSeriesPredictionEngine은 단일 예측을 만드는 편리한 메서드입니다. //이전에 정의된 modelPath 변수에 지정된 대로 MLModel.zip이라는 파일에 모델을 저장합니다. Checkpoint 메서드를 사용하여 모델을 저장합니다. var forecastEngine = forecaster.CreateTimeSeriesEngine<ModelInput, ModelOutput>(mlContext); forecastEngine.CheckPoint(mlContext, modelPath); Forecast(secondYearData, 7, forecastEngine, mlContext); Console.ReadKey(); } //모델평가 //Evaluate 메서드 내에서 학습된 모델과 함께 Transform 메서드를 사용하여 두 번째 연도의 데이터를 예측합니다. static void Evaluate(IDataView testData, ITransformer model, MLContext mlContext) { // Make predictions //Evaluate 메서드 내에서 학습된 모델과 함께 Transform 메서드를 사용하여 두 번째 연도의 데이터를 예측합니다. IDataView predictions = model.Transform(testData); // Actual values //CreateEnumerable 메서드를 사용하여 데이터에서 실제 값을 가져옵니다. IEnumerable<float> actual = mlContext.Data.CreateEnumerable<ModelInput>(testData, true) .Select(observed => observed.TotalRentals); // Predicted values //CreateEnumerable 메서드를 사용하여 예측 값을 가져옵니다. IEnumerable<float> forecast = mlContext.Data.CreateEnumerable<ModelOutput>(predictions, true) .Select(prediction => prediction.ForecastedRentals[0]); // Calculate error (actual - forecast) //일반적으로 오류라고 하는 실제 값과 예측 값의 차이를 계산합니다. var metrics = actual.Zip(forecast, (actualValue, forecastValue) => actualValue - forecastValue); // Get metric averages //절대 평균 오차 및 제곱 평균 오차 값을 계산하여 성능을 측정합니다. //절대 평균 오차: 예측이 실제 값과 얼마나 근접한지 측정합니다. 이 값의 범위는 0과 무한대 사이입니다. 0에 가까울수록 모델의 품질이 좋습니다. var MAE = metrics.Average(error => Math.Abs(error)); // Mean Absolute Error //제곱 평균 오차: 모델의 오류를 요약합니다. 이 값의 범위는 0과 무한대 사이입니다. 0에 가까울수록 모델의 품질이 좋습니다. var RMSE = Math.Sqrt(metrics.Average(error => Math.Pow(error, 2))); // Root Mean Squared Error // Output metrics Console.WriteLine("Evaluation Metrics"); Console.WriteLine("---------------------"); Console.WriteLine($"Mean Absolute Error: {MAE:F3}"); Console.WriteLine($"Root Mean Squared Error: {RMSE:F3}\n"); } //모델을 사용하여 수요 예측 static void Forecast(IDataView testData, int horizon, TimeSeriesPredictionEngine<ModelInput, ModelOutput> forecaster, MLContext mlContext) { //Predict 메서드를 사용하여 다음 7일 동안의 대여를 예측합니다. ModelOutput forecast = forecaster.Predict(); //7일간의 실제 값과 예측 값을 맞춥니다. IEnumerable<string> forecastOutput = mlContext.Data.CreateEnumerable<ModelInput>(testData, reuseRowObject: false) .Take(horizon) .Select((ModelInput rental, int index) => { string rentalDate = rental.RentalDate.ToShortDateString(); float actualRentals = rental.TotalRentals; float lowerEstimate = Math.Max(0, forecast.LowerBoundRentals[index]); float estimate = forecast.ForecastedRentals[index]; float upperEstimate = forecast.UpperBoundRentals[index]; return $"Date: {rentalDate}\n" + $"Actual Rentals: {actualRentals}\n" + $"Lower Estimate: {lowerEstimate}\n" + $"Forecast: {estimate}\n" + $"Upper Estimate: {upperEstimate}\n"; }); // Output predictions Console.WriteLine("Rental Forecast"); Console.WriteLine("---------------------"); foreach (var prediction in forecastOutput) { Console.WriteLine(prediction); } } } public class ModelInput { public DateTime RentalDate { get; set; } //관측 날짜 public float Year { get; set; } //인코딩된 관측 연도(0=2011, 1=2012) public float TotalRentals { get; set; } //해당 일에 대한 총 자전거 대여 수 } public class ModelOutput { public float[] ForecastedRentals { get; set; } //예측 기간의 예측값 public float[] LowerBoundRentals { get; set; } //예측 기간의 예측 최소값 public float[] UpperBoundRentals { get; set; } //예측 기간의 예측 최대값 } }
MLContext Class 의 Properties 를 살펴 보면 다음과 같다.
PROPERTIES
AnomalyDetection Trainers and tasks specific to anomaly detection problems.
변칙 검출 문제와 관련된 트레이너 및 작업.BinaryClassification Trainers and tasks specific to binary classification problems.
이진 분류 문제와 관련된 트레이너 및 작업.Clustering Trainers and tasks specific to clustering problems.
클러스터링 문제와 관련된 트레이너 및 작업.ComponentCatalog This is a catalog of components that will be used for model loading.
모델 로딩에 사용되는 구성 요소 카탈로그입니다.Data Data loading and saving.
데이터 로드 및 저장.Forecasting Trainers and tasks specific to forecasting problems.
트레이너 및 예측 문제와 관련된 작업.Model Operations with trained models.
숙련된 모델을 갖춘 작업.MulticlassClassification Trainers and tasks specific to multiclass classification problems.
다류 분류 문제와 관련된 트레이너 및 작업.Ranking Trainers and tasks specific to ranking problems.
랭킹 문제와 관련된 트레이너 및 작업.Regression Trainers and tasks specific to regression problems.
회귀 문제와 관련된 트레이너 및 작업.Transforms Data processing operations.
데이터 처리 작업.각 Properties 에서 분석 모델에 대한 클래스가 다 따로따로 있고 클래스 별로 사용법이 틀리다.
회귀분석을 해왔으니 회귀카탈로그를 이용하기로 했다. Regression에 들어가니
EXTENSION METHODS 가 주르륵 나온다.
2020/11/20 - [AI] - ML.NET 사용 선형회귀분석 [1]
ML.NET 사용 선형회귀분석 [1]
Viusal Studio 2019에 .NET Core 관련 설치를 하면 ME.NET Core가 같이 설치 된다. 프로젝트 생성후 추가에 Machine Learning 을 선택한다. 나에게 맞는 시나리오를 선택한다. 시나리오에 따라서 학습모델이 자..
iyousys.tistory.com
앞서 이렇게 자동 분석을 통해서 모델을 찾았으므로 모델에 해당하는 메서드를 선택하고 적용하도록 한다.
다시 시작이로군....ㅠㅠ
728x90반응형'AI > ML.NET' 카테고리의 다른 글
ML.NET MSSQL 연동 [5] (0) 2020.12.01 ML.NET MSSQL 연동 [3] (0) 2020.11.23 ML .NET MSSQL 연동 [2] (0) 2020.11.23 ML.NET 사용 선형회귀분석 [1] (0) 2020.11.20