학습 데이터 생성부터 기계학습, 구현까지[머신 러닝 with C#, ML.NET]

안녕하세요. 언제나 휴일에 언휴예요.

이번 강의는 ML.NET으로 프로그램 만드는 전체 공정을 알아보는 실습입니다.

학습 데이터를 만드는 것부터 기계 학습 시키기 및 머신 러닝을 이용한 프로그램 만들기까지 진행합니다.

실습에 사용할 소재는 알파벳 합계를 구하는 것으로 전체 공정을 이해하기 위한 목적 외에는 아무런 의미가 없습니다.

여기에서 얘기하는 알파벳 합계는 소문자 ‘a’에서 상대적 거리를 값으로 생각하여 합계를 계산하는 것입니다.

예를 들어 “abcd”일 때 a는 0, b는 1, c는 2, d는 3으로 취급하여 합계는 6입니다.

1. 학습 데이터 제작
2. 기계 학습(머신 러닝) 시키기
3. 머신 러닝 활용 응용 프로그램 제작하기

1. 학습 데이터 제작

여기에서는 학습 데이터도 별도의 프로그램을 제작하여 만들기로 할게요.

간단하게 콘솔 응용으로 제작할게요.

총 1000개의 랜덤한 데이터를 만들어서 파일에 기록하게 작성합니다.

        static void Main(string[] args)
        {
            FileStream fs = File.Create("alpha_sum.csv");
            StreamWriter sw = new StreamWriter(fs);
            for(int i=0;i<1000;i++)
            {
                sw.WriteLine(MakeRandomStr());
            }
            sw.Close();
        }

작성할 문자열은 “a, b, z, c,…,127″처럼 영문 소문자와 콤마의 조합과 맨 뒤에 합계 수치를 넣을 거예요.

10개의 문자를 랜덤하게 만들어서 콤마와 합계를 포함한 문자열을 만드는 메서드를 정의합시다.

        static Random rand = new Random();
        private static string MakeRandomStr()
        {
            char[] buf = new char[20];
            int i = 0;
            int rvalue = 0;
            int sum = 0;
            for(i=0;i<10;i++)
            {
                rvalue = rand.Next(26);
                buf[i * 2] = (char)(0x61 + rvalue);
                buf[i * 2 + 1] = ',';
                sum += rvalue;
            }
            string s = new string(buf);
            return string.Format("{0}{1}", s, sum);
        }

전체 소스 코드는 다음과 같습니다.

using System;
using System.Diagnostics;
using System.IO;

namespace 알파벳_합계_학습_데이터_만들기
{
    class Program
    {
        static void Main(string[] args)
        {
            FileStream fs = File.Create("alpha_sum.csv");
            StreamWriter sw = new StreamWriter(fs);
            for(int i=0;i<1000;i++)
            {
                sw.WriteLine(MakeRandomStr());
            }
            sw.Close();
            Process pro = Process.Start("notepad", " alpha_sum.csv");
        }

        static Random rand = new Random();
        private static string MakeRandomStr()
        {
            char[] buf = new char[20];
            int i = 0;
            int rvalue = 0;
            int sum = 0;
            for(i=0;i<10;i++)
            {
                rvalue = rand.Next(26);
                buf[i * 2] = (char)(0x61 + rvalue);
                buf[i * 2 + 1] = ',';
                sum += rvalue;
            }
            string s = new string(buf);
            return string.Format("{0}{1}", s, sum);
        }
    }
}

2. 기계 학습(머신 러닝) 시키기

머신 러닝을 이용한 프로그램을 만들기 위한 프로젝트를 생성합니다.

프로젝트 유형은 콘솔 앱(.NET Core)로 생성합니다.

그림 1. 콘솔 앱(.NET Core) 프로젝트 생성

솔루션 탐색기에서 프로젝트를 선택한 후 마우스 오른쪽 버튼을 클릭하세요.

컨텍스트 메뉴에서 Machine Learing을 추가합니다.

그림 2. Machine Learning 추가

시나리오에서 값 예측을 선택합니다.

값 예측 선택
그림 3. 값 예측 선택

이전 프로젝트에서 만든 파일을 선택하세요.

그리고 예측할 열로 col10을 선택합니다.

파일 및 컬럼 선택
그림 4. 파일 선택 및 예측할 열 선택

이제 학습을 시킵니다.

추천 시간이 너무 작아서 좀 크게 넣을게요.

40초를 학습시켰을 때 나오는 화면입니다.

학습 결과
그림 5. 학습 결과

평가 단계에서는 입력 값을 넣어 예측 값을 확인할 수도 있어요.

그리고 코드를 클릭하세요.

그리고 프로젝트 추가를 선택하면 자동으로 두 개의 프로젝트가 만들어집니다.

하나는 라이브러리 프로젝트이고 나머지 하나는 라이브러리 프로젝트를 이용하는 예제 프로젝트입니다.

그리고 어떻게 해야 하는지 코드를 복사 붙여넣기 할 수 있게 제공해 줍니다.

3. 머신 러닝 활용 응용 프로그램 제작하기

입력 데이터 부분을 예제 응용처럼 넣어서 예측 코드를 작성하세요.

ModelInput은 입력 개체이며 ModelOutput은 출력 개체입니다.

ConsumeModel 개체의 Predict 메서드에 입력 개체를 전달하면 값을 예측하여 출력 개체를 반환합니다.

값 예측에서는 예측 값이 출력 개체의 Score속성에 있어요.

using System;
using 알파벳_합계_학습_데이터_만들기ML.Model;

namespace 알파벳_합계_학습기
{
    class Program
    {
        static void Main(string[] args)
        {
            // Add input data
            ModelInput input = new ModelInput()
            {
                Col0 = @"a",
                Col1 = @"j",
                Col2 = @"b",
                Col3 = @"c",
                Col4 = @"d",
                Col5 = @"e",
                Col6 = @"f",
                Col7 = @"g",
                Col8 = @"h",
                Col9 = @"i",
            };

            // Load model and predict output of sample data
            ModelOutput result = ConsumeModel.Predict(input);
            Console.WriteLine("{0}", result.Score);
        }
    }
}

 

전체 실습 공정을 보면 역시 머신러닝에서 제일 중요한 것은 데이터입니다.