택시 요금 예측 프로그램 구현 [머신러닝 with C#, ML.NET]

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

이번 강의는 ML.NET 첫 번째 프로그램입니다.

택시 요금 예측 프로그램인데 학습 데이터를 구하는 부분으로 인해 미국판입니다.

1. 프로젝트 생성 및 Merchine Learning 추가
2. Merchine Learning 시키기 및 학습 데이터 다운로드
3. 코드 작성 및 실행

1. 프로젝트 생성 및 Merchine Learning 추가

프로젝트는 C#, Windows, 콘솔을 선택한 후 콘솔 앱(.NET Core)로 만들어주세요.

그림 1. 프로젝트 생성
그림 1. 프로젝트 생성

솔루션 탐색기에서 프로젝트를 선택합니다.

그리고 오른쪽 마우스 버튼을 클릭하여 컨텍스트 메뉴에서 추가>Machine Learning을 선택합니다.

그림 2. 프로젝트 컨텍스트 메뉴에서 Merchine Learning 선택
그림 2. 프로젝트 컨텍스트 메뉴에서 Merchine Learning 선택

2. Merchine Learning 시키기 및 학습 데이터 다운로드

제일 먼저 시나리오를 선택합니다. 여기에서는 택시 요금을 알아내기 위한 것이라 값 예측을 선택하세요.

그림 3. 시나리오에서 값 예측 선택
그림 3. 시나리오에서 값 예측 선택

환경에서는 데이터 버튼을 클릭합니다.

그림 4. 데이터 버튼 클릭
그림 4. 데이터 버튼 클릭

먼저 파일을 다운로드 받으세요.

taxi-fare-train.csv 이동 후에 브라우저에서 다른 이름으로 저장을 이용하여 다운로드 후 프로젝트로 이동시킵니다.

파일 내용을 보면 vendor_id, rate_code, passenger_count, trip_time_in_secs, trip_distance, payment_type, fare_amount 컬럼으로 구성하고 있음을 알 수 있습니다.

이 중에서 알고 싶은 컬럼은 fare_amount(요금)입니다.

데이터에서 파일을 선택하고 열 선택에서 fare_mount를 선택하세요.

관련 없는 컬럼은 제외시킵니다. 여기에서는 trip_time_in_secs(여행 시간)을 제외시켰어요.

그림 5. 파일 및 컬럼 선택
그림 5. 파일 및 컬럼 선택

선택이 끝났으면 학습 버튼을 클릭하세요.

그림 6. 학습 버튼 클릭
그림 6. 학습 버튼 클릭

학습에 필요한 시간을 예측하여 보여줍니다. 너무 학습 시간이 작아 보이면 좀 더 학습 시키세요.

그림 7. 학습 시키기
그림 7. 학습 시키기

ML.NET Model Builder에서는 여러 가지 모델로 학습을 시키는 것을 시도합니다.

그리고 정확도가 높다고 판단하는 5가지 모델을 추천합니다.

RSquared 값이 1에 가까우면 유용성이 높은 것이고 0에 가까우면 낮은 것입니다.

이상한 값은 무시하세요.

그림 8. 추천 모델 Top5
그림 8. 추천 모델 Top5

평가 버튼을 클릭하세요.

그림 9. 평가 버튼 클릭
그림 9. 평가 버튼 클릭

평가 화면에서는 컬럼 값을 넣어서 예측 값을 확인할 수도 있습니다.

코드를 클릭하세요.

그림 10. 코드 버튼 클릭
그림 10. 코드 버튼 클릭

프로젝트 추가 버튼을 클릭하세요.

그림 11. 프로젝트 추가 클릭
그림 11. 프로젝트 추가 클릭

두 개의 프로젝트를 만들어 줍니다. 하나는 라이브러리 프로젝트이고 하나는 라이브러리를 사용하는 예제 프로젝트입니다.

3. 코드 작성 및 실행

코드를 복사 붙여넣기 하세요.

그리고 예제 코드처럼 ModelInput 개체 생성에 필요한 컬럼 값을 전달합니다.

using System;
using 택시_요금ML.Model;
namespace 택시_요금
{
    class Program
    {
        static void Main(string[] args)
        {
            // Add input data
            var input = new ModelInput()
            {
                Vendor_id = "CMT",
                Rate_code = 1,
                Passenger_count = 1,
                Trip_distance = 3.8f,
                Payment_type = "CRD"
            };

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

ModelInput 개체는 예측하기 위해 전달해야 하는 값을 갖는 개체입니다.

ModelOutput 개체는 예측한 결과 값을 갖는 개체입니다.

ConsumeModel의 Predict 메서드는 예측하는 메서드로 ModelInput을 입력받아 ModelOutput 개체를 반환합니다.

값 예측에서는 ModelOutput 개체의 Score속성이 예측 값입니다.