C# & .NET

[C# ML] C#으로 머신러닝 모델 구축하기 (ML.NET)

카루-R 2022. 2. 20. 00:45
반응형

환영합니다, Rolling Ress의 카루입니다.

import sklearn
import tensorflow

보통 머신러닝과 딥러닝 학습을 할 땐 파이썬을 사용하죠.

그런데 제 주력 언어는 C#입니다. (원래는 C++이었지만, 최근에 UWP 개발을 하면서 바뀌었어요...ㅎㅎ) 그런데 C#에서는 파이썬의 사이킷런과 텐서플로를 이용하기 힘들죠. 뭐, IronPython을 이용해서 편법을 쓸 수는 있어요. 그런데 C#에서는 dynamic으로 받아야 하고, 무엇보다 C#은 컴파일 언어인데 비해 파이썬은 인터프리터 언어라, 괴리감이 엄청납니다. 그래서 힘들더라고요.

https://dotnet.microsoft.com/en-us/learn/ml-dotnet/get-started-tutorial/install

 

ML.NET Tutorial | Get started in 10 minutes | .NET

Step-by-step instructions for building a simple prediction model with ML.NET on Windows, Linux, or macOS. ML.NET is a machine learning framework for .NET.

dotnet.microsoft.com

그런데 정말 다행스럽게도 C#에서 머신러닝 라이브러리를 제공하고 있었습니다. 이름은 ML.NET. 아마 Machine Learning Dot-Net의 약자인 것 같아요.

바로 Visual Studio부터 실행해보죠! 콘솔 앱으로 프로젝트 지정해주시고, .NET 6.0 (LTS)로 하시면 됩니다. 그 다음, Microsoft.ML 라이브러리를 추가해주세요. 이곳에서 머신러닝 라이브러리를 사용할 수 있습니다.

그 다음, 프로젝트를 우클릭하고 머신러닝 모델을 추가합시다. 이름은 적당히 정해줍니다. 여기서는 Rolling Model로 하겠습니다.

이번에 할 프로젝트는 머신러닝을 통해 문장의 부정/긍정을 판정하는 것입니다. 테스트 데이터에는 문장이 하나 있고, 긍정이면 1, 부정이면 0이 뒤에 따라붙습니다. 우리는 문장을 통해 긍정/부정의 결과를 유추해낼 것입니다. 실습을 위해 1000개의 문장이 적힌 파일을 받습니다. MS에서 제공해줍니다.

60초 동안 훈련을 시켜봅시다. 그럼 자기가 알아서 별 모델을 다 씁니다. 지금 보면 로지스틱 회귀 모델이 상당히 정확도가 높은 걸 알 수 있습니다.

시험삼아 두 개의 문장을 입력해봤습니다. 참고로 제가 자꾸 '언젠가 여자친구와 "올 거야"', '내가 여길 "안 왔다면" 좋았을텐데' 따위의 문장을 입력했죠. 이게, 레스토랑 평점을 가지고 학습을 시켜서 그래요. 단순 긍/부정보다 리뷰형 문장으로 쓴 게 추론 확률이 더 높을 것 같기도.. 어쨌든, 각각 1과 0으로 완벽하게 예측했네요.

테스트가 끝나고 우리가 검증을 하면, 본격적으로 머신러닝 모델을 사용할 수 있게 됩니다. RollingModel.zip은 머신러닝이 완료된 파일이라 보시면 되고, RollingModel.consumption과 .training은 VS에서 자동으로 만들어낸 파일이에요. 얘네가 모델을 만들어줬으니, 우린 그냥 갖다 쓰기만 하면 됩니다.

//Load sample data
var sampleData = new RollingModel.ModelInput()
{
    Col0 = @"Wow... Loved this place.",
};

//Load model and predict output
var result = RollingModel.Predict(sampleData);

VS가 제공한 코드 snippit은 이렇습니다. 어디선가 많이 본...predict 메서드...ㅋㅋㅋㅋㅋㅋ 맞아요. 머신러닝 분야에선 Fit, Predict 메서드가 거의 관용적으로 쓰이는 것 같습니다. Fit은 어디 있냐고요? 이미 아까 학습을 시켰잖아요. 쓰지 않아도 됩니다.

using RollingML;
using static System.Linq.Enumerable;

List<RollingModel.ModelInput> samples = new()
{
    new() { Text = @"I want to re-visit here." },
    new() { Text = @"What an awesome place." },
    new() { Text = @"Haha. I will never be back." },
    new() { Text = @"I don't have gf, so I never visit here" },
};

foreach (var i in Range(0, 4))
{
    Console.WriteLine($"Sample {i + 1} ==============\n");

    var result = RollingModel.Predict(samples[i]);
    Console.WriteLine($"Source Text: {samples[i].Text}");
    Console.WriteLine($"Result: {(result.Prediction is 1 ? "Positive (1)" : "Negative (0)")}");
    Console.WriteLine($"Positive: {result.Score[0]*100:0.00}%, Negative: {result.Score[1]*100:0.00}%\n");
}

Console.WriteLine("Model test finished.");

자, 코드를 이렇게 작성해봅시다. samples에는 Input 객체가 있는 거예요. 하...파이썬 안 보니까 살 것 같다. 텍스트 데이터는 Col0에 있습니다. (원한다면 RollingModel.consumption.cs에서 바꿀 수 있습니다) foreach문을 통해 반복하면서, Result와 추론 퍼센티지를 각각 측정합니다. 소수점 셋째 자리에서 반올림해서 출력합니다.

..? 1번이 조금 이상하네요. 비슷비슷하긴 한데, 부정적인 응답으로 추론했습니다. want to를 will로 바꾸니 긍정으로 추론하긴 합니다만, 조금 마음에 걸리네요.


아무튼, 이렇게 첫 머신러닝 모델을 구축했습니다. C# 으로 작성해서 그런지..왠지 모르게 반가운 기분 ㅋㅋㅋㅋㅋㅋ 여하튼, C# 에서는 Microsoft.ML.Tensorflow로 텐서플로(딥러닝 라이브러리)도 제공합니다. 이건 나중에 해보고, 새로운 프로젝트로 찾아뵙겠습니다. 다음에 만나요 :)

반응형