AI/ML.NET

ML.NET MSSQL 연동 [5]

Urong 2020. 12. 1. 18:04
728x90

ML.NET 을 건드린지 1주가 지났는데 아직 자동화 밖에 쓰질 못하겠다.

그래서 자동화로 생성된 코드들을 보기로 했다.

시나리오를 선택하고 환경 선택하고 데이터를 선택하고 학습을 하면

가장 정확도가 높은 알고리즘을 찾아준다.

학습시간이 길 수록 정확도가 높아지지만 적은 데이터를 무작정 길게 학습한다고해서 더욱더 좋아지지는 않는다.

LightGbmRegression이 제일 높은 정확도를 가진것으로 결과가 나왔다.

이 상태로 코드에서 프로젝트추가를 하면

이렇게 코드가 추가되고 샘프로 코드가 주어진다.

그럼 생성된 프로젝트로 들어가보자.

ConsoleApp에 들어가보면 ModelBuilder 클래스가 있다.

여기에서 학습시킨 후에 선택된 알고리즘 LightGbmRegression를 사용해서 모델을 생성하는 코드들을 확인 할 수 있다.

알고리즘에 대한 옵션도 들어가 있고 생성된 모델의 저장위치도 지정된다. 

알고리즘이 바뀌도록 데이터를 바꿔가면서 해봤는데 생성되는 코드가 확실하게 다르다.

        public static void CreateModel()
        {
            // 데이터를 읽어서
            IDataView trainingDataView = mlContext.Data.LoadFromTextFile<ModelInput>(
                                            path: TRAIN_DATA_FILEPATH,
                                            hasHeader: true,
                                            separatorChar: '\t',
                                            allowQuoting: true,
                                            allowSparse: false);

            // 학습 pipeline 을 만들고
            IEstimator<ITransformer> trainingPipeline = BuildTrainingPipeline(mlContext);

            // 모델을 학습시키고
            ITransformer mlModel = TrainModel(mlContext, trainingDataView, trainingPipeline);

            // Evaluate quality of Model
            Evaluate(mlContext, trainingDataView, trainingPipeline);

            // 모델을 저장한다.
            SaveModel(mlContext, mlModel, MODEL_FILEPATH, trainingDataView.Schema);
        }
        
        //pipeline을 만드는데 여기에서 알고리즘을 선택한다.
        public static IEstimator<ITransformer> BuildTrainingPipeline(MLContext mlContext)
        {
            // Data process configuration with pipeline data transformations 
            var dataProcessPipeline = mlContext.Transforms.Concatenate("Features", new[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M" });
            // Set the training algorithm 
            //LightGbmRegression이 선택되어있는걸 볼 수 있다.
            var trainer = mlContext.Regression.Trainers.LightGbm(new LightGbmRegressionTrainer.Options() { NumberOfIterations = 100, LearningRate = 0.05942692f, NumberOfLeaves = 70, MinimumExampleCountPerLeaf = 20, UseCategoricalSplit = false, HandleMissingValue = true, UseZeroAsMissingValue = true, MinimumExampleCountPerGroup = 50, MaximumCategoricalSplitPointCount = 16, CategoricalSmoothing = 1, L2CategoricalRegularization = 10, Booster = new GradientBooster.Options() { L2Regularization = 0.5, L1Regularization = 0 }, LabelColumnName = "도막두께", FeatureColumnName = "Features" });

            var trainingPipeline = dataProcessPipeline.Append(trainer);

            return trainingPipeline;
        }

여기에서 데이터를 불러와서 모델을 만들고 학습시키는 과정을 거치고

Model 프로젝트로 들어가면 ConsumeMedel 클래스에서 생성된 모델에 값을 입력하고 예측값을 리턴받는다.

    public class ConsumeModel
    {
        private static Lazy<PredictionEngine<ModelInput, ModelOutput>> PredictionEngine = new Lazy<PredictionEngine<ModelInput, ModelOutput>>(CreatePredictionEngine);

        // For more info on consuming ML.NET models, visit https://aka.ms/mlnet-consume
        // Method for consuming model in your app
        public static ModelOutput Predict(ModelInput input)
        {
            ModelOutput result = PredictionEngine.Value.Predict(input);
            return result;
        }

        public static PredictionEngine<ModelInput, ModelOutput> CreatePredictionEngine()
        {
            // Create new MLContext
            MLContext mlContext = new MLContext();

            // Load model & create prediction engine
            string modelPath = @"C:\Users\AppData\Local\Temp\MLVSTools\ML.test1ML\ML.test1ML.Model\MLModel.zip";
            ITransformer mlModel = mlContext.Model.Load(modelPath, out var modelInputSchema);
            var predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel);

            return predEngine;
        }
    }

위 두개의 클래스를 이용하면 DB에서 바로 데이터를 가져와서 알고리즘도 입맛대로 골라서 학습시키고 예측값을 가져올 수 있다.

아래 포스트에서 연동해서 생각하도록 하자.

2020/11/20 - [AI] - ML.NET 사용 선형회귀분석 [1]

728x90
반응형