머신 러닝은 한때 데이터 과학자의 전문 영역이었습니다. 뭔가 특별한 기술과 도구를 알아야 손을 댈 수 있는 그런 분야로 통했습니다. 2020년 현재 머신 러닝은 누가 더 전문성을 갖추고 있는지 실력을 겨루는 장이 아닙니다. 누가 더 참신한 아이디어를 가지고 있느냐가 더 중요한 시대가 되었습니다. 이런 변화를 만든 주인공은 클라우드입니다. 이제 코딩을 몰라도 데이터 전처리에서 모델 트레이닝까지 일사천리로 진행할 수 있습니다.
머신 러닝의 문턱을 낮춘 대표적인 서비스 중 하나가 구글의 Cloud AutoML입니다. 모델을 만들고 트레이닝 과정을 자동화, 간소화한 덕에 IT에 몸담고 있는 보다 많은 이들이 머신 러닝의 세계에 입문할 기회가 열렸습니다. Cloud AutoML이 그렇다고 아무나 할 수 있는 그런 것은 또 아닙니다. Cloud AutoML 관련 자습서나 안내 문서를 보면 공통적인 전제가 있습니다. 잘 준비된 데이터 세트가 있다는 가정입니다. 머신 러닝이 익숙하지 않은 이에게 데이터 전처리는 또 다른 장애물이 될 수 있습니다. 다행히 조금만 알아보면 데이터 전처리 역시 구글 클라우드에서는 매우 간단히 할 수 있다는 것을 알 수 있습니다. 이를 간단히 살펴보겠습니다.
뉴욕 소방국의 공개 데이터를 가지고 전처리 해보기
본 포스팅에서는 뉴욕 소방국의 공개 데이터를 전처리하고, 이를 머신 러닝 트레이닝에 적용해 사고 대응 시간을 예측하는 예를 살펴보겠습니다. 로우 데이터는 NYC OpenData 웹 사이트에서 다운로드 받습니다. 2009년부터 2018년까지 사고 내용을 기록한 데이터를 CSV 파일로 다운로드받습니다.
이 파일은 총 4,368개 행으로 구성되어 있습니다. 그리고 각 열은 해당 월의 사고 유형, 월 간 사고 숫자, 평균 응답 시간 등의 정보를 담고 있습니다.
본 포스팅에서 예측하려는 열은 AVERAGERESPONSETIME입니다. 로우 데이터는 mm:ss 형식으로 기록되어 있는데, 전처리를 통해 숫자 형식으로 바꾸어야 합니다.
필요한 것들
본 포스팅에서는 다음 4개의 구글 클라우드 서비스를 이용해 로우 데이터 전처리와 모델 트레이닝을 할 것입니다.
- Cloud Storage : 로우 데이터 저장을 위한 스토리지 서비스
- Cloud Data Fusion : 데이터 통합을 위한 서비스
- BigQuery : 전처리된 데이터를 저장할 데이터웨어하우스
- AutoML Tables : 머신 러닝 모델 구축과 배포 서비스
첫 단계는 NYC OpenData 웹 사이트에서 다운로드한 CSV 파일을 Cloud Storage 버킷에 올리는 것입니다. 그리고 Cloud Data Fusion 인스턴스를 생성하고 API를 활성화합니다. 이 과정은 관련 문서를 참조 바랍니다. 다음으로 BigQuery를 이용해 테이블을 생성합니다. 이때 스키마를 만들 필요는 없습니다. 데이터 파이프라인을 통해 자동으로 처리됩니다.
데이터 파이프라인 생성
Cloud Data Fusion을 사용하면 데이터 통합 파이프라인을 UI 환경에서 직관적으로 만들 수 있습니다. 데이터 소스, 변환 관련 노드와 플러그인을 이용해 원하는 파이프라인을 설계할 수 있습니다. 다음과 같이 ‘Studio’ 뷰를 클릭해 새 파이프라인을 만듭니다. 이 파이프라인은 Cloud Storage에서 CSV 파일을 검색하고, 머신 러닝에 적합한 형식으로 데이터를 변환하고, 처리된 데이터를 BigQuery 테이블에 저장합니다.
더 자세히 보겠습니다. 노드와 플러그인을 위 그림과 같이 캔버스로 드래그-앤-드롭 방식으로 끌어다 놓습니다. 먼저 첫 번째 노드에 Source 플러그인 목록에 있는 GCS 플러그인을 선택해 추가합니다. 레이블과 레퍼런스 이름은 자유롭게 지정하면 됩니다. 이름을 정하고 경로가 CSV 파일과 일치하는지 확인합니다.
- Label: From GCS
- Reference Name: GCS1
- Path: gs://<YOUR_BUCKET>/FDNY_Monthly_Response_Times.csv
데이터 변환
두 번째 노드에는 강력한 데이터 파싱, 변환, 맵핑 기능을 제공하는 Wrangler 플러그인을 추가합니다. 이는 Transform 플러그인 목록에서 찾을 수 있습니다. Wrangler 플러그인의 데이터 입력으로 From GCS를 연결합니다. 예제의 경우 레이블 명은 “FDNY Response Time Wrangler.”을 사용했으며, 다른 이름으로 해도 됩니다.
‘Wrangle’을 클릭한 다음 스토리지 버킷에서 CSV 파일을 찾습니다. 그리고 화살표를 클릭한 후 다음 그림과 같이 ‘Parse -> CSV’를 선택한 후 다음 옵션을 지정합니다.
- Separate by comma
- Check the box “Set first row as header“
그러고 나서 다음과 같은 추가 단계를 거쳐 데이터 변환을 완료합니다.
- Parse YEARMONTH as a Simple date
- Use custom format: yyyy/MM
- Filter out All Incidents under INCIDENTCLASSIFICATION
- Filter -> Remove Rows – > Value is “All Fire/Emergency Incidents”
- Filter out Citywide under INCIDENTBOROUGH
- Filter -> Remove Rows -> Value is “Citywide”
- Delete columns body and INCIDENTCOUNT
- We don’t know the number of incidents prior to the month beginning
- Remove the colon from AVERAGERESPONSETIME by:
- Find and replace “:” with “” (no quotes)
- Convert AVERAGERESPONSETIME to seconds with:
- Custom transform: (AVERAGERESPONSETIME / 100) * 60 + (AVERAGERESPONSETIME % 100)
추가 작업을 한 후 변환된 데이터를 자세히 검토하기 위해 페이지 상단에 있는 ‘Insights’를 클릭합니다. 이를 통해 각 열을 시각화하여 자세히 볼 수 있으며, 사용자 정의 보기를 통해 볼 수도 있습니다. 각 열의 데이터 변환 결과를 보니 뉴욕 소방국의 응답 시간 분포는 270초 부근인 것으로 나타났습니다.
‘Apply’를 눌러 전환을 마무리하고, ‘Validate’를 눌러 유효성 검사 결과에 오류가 없음을 확인합니다.
BigQuery에 데이터 저장
파이프라인이 마지막 단계는 각 레코드를 BigQuery 테이블에 쓰는 것입니다.화면 좌측에 있는 Sink 플러그인 목록 메뉴에서 BigQuery 플러그인을 선택해 끌어 옵니다. ‘Properties’를 눌러 다음과 같이 각 필드에 설정값을 넣습니다. 이외에 Update Table Schema 옵션을 이용해 각 데이터 필드 이름과 유형이 BigQuery에 자동으로 채워지게 합니다.
- Label: To BigQuery
- Reference Name: BQ1
- Dataset: <YOUR_DATASET>
- Table: <YOUR_NAME>
- Update Table Schema: True
‘Validate’를 클릭해 플러그인이 올바로 구성되었는지 확인합니다.
파이프라인 배포 및 실행
이제 모든 준비를 마쳤습니다. 본 포스팅에서는 파이프라인 이름을 fdny_monthly_response_time이라고 저장하였습니다. 파이프라인을 배포하면 Dataproc 클러스터를 프로비저닝 하고 실행하기 위한 준비가 이루어지는 데 몇 분 정도 기다리면 됩니다.
기본적으로 Cloud Data Fusion은 파이프라인 실행을 위해 임시 클러스터를 생성하고, 작업이 완료되면 클러스터를 삭제합니다. 이미 생성한 클러스터에서 파이프라인을 실행할 수도 있습니다.
BigQuery에서 변환된 데이터 검토
AutoML 테이블로 모델을 바로 임포트 할 수 있지만, 데이터 세트가 제대로 준비되었는지 최종 확인을 위해 BigQuery console에서 ‘Schema’를 클릭해 생성한 테이블을 탐색하여 검토해 볼 수 있습니다.
‘Preview’를 누르면 다음 화면과 같이 데이터 세트의 행을 볼 수 있습니다.
AutoML 테이블을 사용하여 모델 작성
데이터 세트를 잘 준비했으니, 이제 모델을 생성할 차례입니다. AutoML Tables에 접속해 다음과 같이 새로운 데이터 세트를 만듭니다.
그런 다음 BigQuery에서 데이터를 가져옵니다. 이는 아주 간단한 작업으로 프로젝트 ID, 데이터 세트 ID 및 테이블 이름을 넣어 데이터를 가져오면 됩니다.
데이터를 가져왔으니, 이제 남은 것은 트레이닝 하는 것입니다. 이때 설정해야 하는 것은 ‘Target column’ 옵션 하나뿐입니다. 80/10/10 Train / Test / Validate split과 같은 표준 설정은 그대로 두면 됩니다.
AVERAGERESPONSETIME 또는 Target column을 선택하면 AutoML Tables은 각 모델의 피처(feature)에 대한 통계를 계산합니다. 이를 거친 후 ‘Train Model’을 선택합니다.
트레이닝이 완료되면 모델 정확성을 살펴볼 수 있습니다. 예제의 경우 MAE(Mean Absolute Error)는 약 8일이며 R2 또는 모형에 의해 설명된 편차(0-1 범위)는 약 0.8로, 이는 나쁘지 않은 결과입니다.
이 밖에도 예제 머신 러닝 모델의 피처인 사건 유형, 사건이 발생한 지역(자치구), 그리고 연중 시간 관련 예측도 수행할 수 있습니다. 특정 예측에 대한 피처의 중요성에 대한 내용은 관련 포스팅을 참조 바랍니다.
마지막으로 본 포스팅을 통해 본 예제 모델은 배치 기반, 온라인 기반으로 예측할 수 있습니다. 필요에 따라 도커 컨테이너에 모델을 배포할 수도 있습니다. 이 중 온라인 기반 예측을 알아보겠습니다. 모델 배포 후 이에 대한 접근을 REST API를 통해서 하면 온라인 기반 예측을 할 수 있습니다. AutoML Tables은 API 테스트를 위한 몇 가지 방법을 사용자 인터페이스를 통해 제공합니다. 다음 그림을 보시죠. 1246406400000000 값은 2009년 7월 1일 자정을 뜻합니다. 이 시간의 뉴욕 소방국 사고 대응 시간에 대한 예측 결과는 262.26초입니다.
살펴본 바와 같이 머신 러닝 모델 기반 예측을 위한 데이터 전처리 작업 역시 모델 배포와 트레이닝 못지않게 손쉽게 가능합니다.
또한, 데이터 전처리에 사용하는 클라우드 인프라는 자동화 기반으로 확장이 이루어집니다. 세상 참 좋아진 것 같습니다.