성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>ML.NET Model Builder - 회귀(Regression), 다중 분류(Multi-class classification) 예제</h1> <p> 지난번에 설명한,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Visual Studio - ML.NET Model Builder 소개 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11894'>http://www.sysnet.pe.kr/2/0/11894</a> </pre> <br /> 예제는 간단한 2진 분류였는데요, 지난 튜토리얼의 마지막 단계까지 가면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ML.NET Tutorial - Get started in 10 minutes ; <a target='tab' href='https://dotnet.microsoft.com/learn/machinelearning-ai/ml-dotnet-get-started-tutorial/next'>https://dotnet.microsoft.com/learn/machinelearning-ai/ml-dotnet-get-started-tutorial/next</a> </pre> <br /> 이제 또 다른 시나리오를 실습해 보라면서 "Price prediction dataset" 예제 파일을 링크하고 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Price prediction dataset ; <a target='tab' href='https://raw.githubusercontent.com/dotnet/machinelearning-samples/master/samples/csharp/getting-started/Regression_TaxiFarePrediction/TaxiFarePrediction/Data/taxi-fare-train.csv'>https://raw.githubusercontent.com/dotnet/machinelearning-samples/master/samples/csharp/getting-started/Regression_TaxiFarePrediction/TaxiFarePrediction/Data/taxi-fare-train.csv</a> </pre> <br /> 혹시 당황하셨다면 ^^ 완벽한 예제 코드로 정리된 다음의 문서를 보면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > dotnet/machinelearning-samples ; <a target='tab' href='https://github.com/dotnet/machinelearning-samples/tree/master/samples/csharp/getting-started/Regression_TaxiFarePrediction'>https://github.com/dotnet/machinelearning-samples/tree/master/samples/csharp/getting-started/Regression_TaxiFarePrediction</a> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 그러니까 결국 문제는 Model Builder를 사용할 때 어떤 종류의 기계학습에 대한 시나리오가 맞는지 선택하는 것입니다.<br /> <br /> <ol> <li>회귀</li> <li>분류 - {2진 분류, 다중 분류}</li> </ol> <br /> 일단, 2진 분류는 결과가 Yes/No로 나온다는 점에서 기준이 매우 간단합니다. 그리고 회귀와 다중 분류의 경우는 결과가 학습 데이터의 "Label"로 제한된 것이라면 다중 분류, 그렇지 않고 연속 공간에서 나오는 것이라면 회귀라고 간단하게 정리할 수 있습니다.<br /> <br /> 따라서, 이번 주제인 "택시 요금 예측(Taxi Fare Prediction)"은 결괏값이 연속 공간이므로 회귀에 해당합니다. 그럼 Model Builder를 간단하게 사용할 수 있겠죠. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 1. Scenario Price Prediction 2. Data Input: File Select a file: taxi-fare-train.csv Column to Predict (Label): fare_amount 3. Train Time to train (seconds): 10 </pre> <br /> MLModel.zip 파일이 생성되었으면 <a target='tab' href='http://www.sysnet.pe.kr/2/0/11894'>이전 글</a>과 동일하게 다음의 작업을 추가하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 1) Install-Package Microsoft.ML Install-Package Microsoft.ML.FastTree 2) MLModel.zip 추가 - "Copy to Output Directory" - "Copy if newer" 3) ModelInput.cs, ModelOutput.cs 추가 </pre> <br /> 예측 코드를 작성하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; using Microsoft.ML; using ConsoleApp1ML.Model.DataModels; class Program { static void Main(string[] args) { MLContext mlContext = new MLContext(); ITransformer mlModel = mlContext.Model.Load("MLModel.zip", out DataViewSchema inputSchema); var predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel); // Create sample data to do a single prediction with it ModelInput sampleData = new ModelInput { Vendor_id = "VTS", Rate_code = 1.0f, Passenger_count = 1, Trip_time_in_secs = 1140, Trip_distance = 3.75f, Payment_type = "CRD", }; // Try a single prediction ModelOutput result = predEngine.Predict(sampleData); Console.WriteLine($"Single Prediction --> Predicted value: {result.Score}"); } } /* 출력 결과 Single Prediction --> Predicted value: 15.95807 */ </pre> <br /> <hr style='width: 50%' /><br /> <br /> 이렇게 해서 "2진 분류"와 "회귀"에 대한 예제를 살펴봤는데요. "다중 분류"도 마저 살펴보겠습니다. 다중 분류의 가장 유명한 사례가 바로 붓꽃 판정입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Iris Data Set ; <a target='tab' href='https://archive.ics.uci.edu/ml/datasets/iris'>https://archive.ics.uci.edu/ml/datasets/iris</a> </pre> <br /> 즉, 결괏값이 택시 요금 예측과 같이 연속 공간이 아니라, 데이터 파일 자체에 포함된 Label(붓꽃 데이터의 경우 class) 집합으로 한정되기 때문에 "다중 분류" 시나리오가 됩니다.<br /> <br /> 그럼 Python 예제만 있는 붓꽃 분류를 ^^ C# ML.NET으로 해보겠습니다.<br /> <br /> 우선, 위의 사이트에서 다운로드한 <a target='tab' href='https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'>iris.data</a>는 CSV 형식의 파일이지만 아쉽게도 칼럼 정보가 없습니다. 대신 <a target='tab' href='https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.names'>iris.names</a> 파일을 보면 다음과 같이 속성 정보가 있으니,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 1. sepal length in cm 2. sepal width in cm 3. petal length in cm 4. petal width in cm 5. class: -- Iris Setosa -- Iris Versicolour -- Iris Virginica </pre> <br /> 이를 참고해 iris.data의 첫 행에 다음과 같이 칼럼 정보를 넣고 파일명을 .csv를 붙여 저장합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > sepal_length,sepal_width,petal_length,petal_width,class 5.1,3.5,1.4,0.2,Iris-setosa 4.9,3.0,1.4,0.2,Iris-setosa ...[생략]... </pre> <br /> 끝입니다 이제 Model Builder를 실행해 다음과 같은 설정으로 자동 코드를 생성하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 1. Scenario Custom Scenario 2. Data Input: File Select a file: iris.data.csv Column to Predict (Label): class 3. Train Machine learning task: multiclass-classification Time to train (seconds): 10 </pre> <br /> 자동 코드가 생성되었으면 역시 우리의 응용 프로그램 프로젝트에 다음과 같은 설정을 한 후,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 1) Install-Package Microsoft.ML 2) MLModel.zip 추가 - "Copy to Output Directory" - "Copy if newer" 3) ModelInput.cs, ModelOutput.cs 추가 </pre> <br /> 간단하게 붓꽃 판정 코드를 만들 수 있습니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using ConsoleApp1ML.Model.DataModels; using Microsoft.ML; using System; namespace ConsoleApp2 { class Program { static void Main(string[] args) { MLContext mlContext = new MLContext(); ITransformer mlModel = mlContext.Model.Load("MLModel.zip", out DataViewSchema inputSchema); var predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel); ModelInput sampleData = new ModelInput { Sepal_length = 5, Sepal_width = 2.9f, Petal_length = 1, Petal_width = 0.2f, }; ModelOutput predictionResult = predEngine.Predict(sampleData); Console.WriteLine($"Single Prediction --> Predicted value: {predictionResult.Prediction} | Predicted scores: [{String.Join(",", predictionResult.Score)}]"); } } } /* 출력 결과 Single Prediction --> Predicted value: Iris-setosa | Predicted scores: [0.8280767,0.1602236,0.01169968] */ </pre> <br /> 엄청 쉽죠? ^^<br /> <br /> (<a target='tab' href='https://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=1450&boardid=331301885'>첨부 파일은 이 글의 예제 코드를 포함</a>합니다.)<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1187
(왼쪽의 숫자를 입력해야 합니다.)