AutoML을 사용하여 분류 모델 만들기¶
- 튜토리얼 난이도: ★☆☆☆☆
- 읽는데 걸리는 시간: 4 분
- 사용 언어: SQL (100%)
- 실행 파일 위치: tutorial/thanosql_ml/classification/automl_classification.ipynb
- 참고 문서: (캐글) Titanic - Machine Learning from Disaster
튜토리얼 소개¶
분류 작업 이해하기
분류 작업은 목푯값(Target)이 속한 범주(Category 또는 Class)를 예측하기 위해 사용하는 머신러닝(기계학습/Machine Learning)의 한 형태입니다. 예를 들어, 남성 또는 여성을 분류하는 이진 분류와 동물의 종(개, 고양이, 토끼 등)을 예측하는 다중 분류 모두 분류 작업에 포함됩니다.
기업의 특정 마케팅 프로모션에 대해 잠재고객이 긍정적인 반응을 보일 것인지 아닌지를 예측하기 위해서는 고객의 CRM(Customer Relationship Management) 데이터(인구 통계학 정보, 고객의 행동/검색 데이터 등)를 이용할 수 있습니다. 이 경우 CRM 데이터에서 표현되는 특성(Feature)이 입력 데이터로 사용되며, 예측하고자 하는 값인 목푯값은 프로모션에 대한 대상 고객의 반응이 긍정(1 또는 True) 또는 부정(0 또는 False)일지 여부입니다. 이러한 분류 모델을 이용해서, 마케팅에 노출되지 않은 고객들의 프로모션에 대한 반응을 미리 예측하고 적절한 고객에게 마케팅을 노출함으로써 마케팅 효율을 지속적으로 높일 수 있습니다.
아래는 ThanoSQL 분류 모델의 활용 및 예시입니다.
- 분류 모델은 현재 사용자의 이탈에 대한 조기 탐지를 가능하게 하고 문제(이탈)에 사전에 대등할 수 있도록 해줍니다. 과거 데이터를 통해 이탈 고객의 특성을 파악할 수 있게 되고 이탈 가능성이 높은 사용자를 사전에 발견함으로써 적절한 조치가 가능해집니다. 이를 통해 고객이탈 방지 및 매출 증대 효과를 기대할 수 있습니다.
- 온라인 플랫폼 내에서 사용자의 세그먼트를 예측할 수 있습니다. 대부분의 서비스 사용자들은 서로 다른 특성을 가지고 다양한 행동방식(User Behaviour)과 니즈(Needs)를 가지고 있습니다. 분류 예측 모델은 서비스 사용자의 특성을 이용하여 세분화된 집단을 식별하고 그들에게 맞춤화된 전략 수립을 가능하게 합니다.
본 튜토리얼에서는
👉 대표적인 머신러닝 경진대회 플랫폼인 캐글의 입문자를 위한 Titanic: Machine Learning from Disaster 데이터 세트를 사용하여 생존자 예측 분류 모델을 만듭니다. 이 대회의 목표는 아래와 같습니다. (참고로, 해당 대회의 데이터는 1912년 4월 15일 실제 타이타닉 사건 때, 탑승했었던 승객들 명단입니다.)
타이타닉에서 살아남을 수 있는 승객을 예측하기
ThanoSQL에서는 자동화된 머신러닝(AutoML) 도구를 제공합니다. 본 튜토리얼에서는 AutoML을 사용하여 타이타닉에서 살아남을 수 있는 승객을 예측합니다. ThanoSQL에서 제공하는 AutoML은 모델(Model)개발을 위한 프로세스를 자동화하고, 데이터 과학(Data Science)에 대한 전문지식이 없어도 데이터의 수집 및 저장, 머신러닝 모델의 개발 및 배포(엔드투엔드 머신러닝 파이프라인)를 하나의 언어(ThanoSQL)만으로 가능하도록 지원합니다.
자동화된 ML을 사용하면 다음과 같은 장점이 있습니다
- 광범위한 프로그래밍 또는 데이터 과학에 대한 지식이 없어도 머신러닝 솔루션의 구현 및 배포가 가능
- 개발모델의 배포에 들어가는 시간 및 리소스를 절약
- 의사결정을 위해 보유하고 있는 데이터를 이용한 신속한 문제해결이 가능
이제부터 ThanoSQL을 사용하여 간단하게 타이타닉에서 살아남을 수 있는 승객을 예측하는 분류 모델을 만들어 봅니다.
0. 데이터 세트 준비¶
ThanoSQL의 쿼리 구문을 사용하기 위해서는 ThanoSQL 워크스페이스에서 언급된 것처럼 API 토큰을 생성하고 아래의 쿼리를 실행해야 합니다.
%load_ext thanosql
%thanosql API_TOKEN=<발급받은_API_TOKEN>
데이터 세트 준비¶
%%thanosql
GET THANOSQL DATASET titanic_data
OPTIONS (overwrite=True)
Success
쿼리 세부 정보
- "GET THANOSQL DATASET" 쿼리 구문을 사용하여 원하는 데이터 세트를 워크스페이스에 저장합니다.
- "OPTIONS" 쿼리 구문을 통해 GET THANOSQL DATASET에 사용할 옵션을 지정합니다.
- "overwrite": 동일 이름의 데이터 세트가 존재하는 경우 덮어쓰기 가능 여부 설정. True일 경우 기존 데이터 세트는 새로운 데이터 세트로 변경됨 (bool, optional, True|False, default: False)
%%thanosql
COPY titanic_train
OPTIONS (if_exists='replace')
FROM 'thanosql-dataset/titanic_data/titanic_train.csv'
Success
%%thanosql
COPY titanic_test
OPTIONS (if_exists='replace')
FROM 'thanosql-dataset/titanic_data/titanic_test.csv'
Success
쿼리 세부 정보
- "COPY" 쿼리 구문을 사용하여 데이터베이스에 저장 할 테이블명을 지정합니다.
- "OPTIONS" 쿼리 구문을 통해 COPY에 사용할 옵션을 지정합니다.
- "if_exists": 동일 이름의 테이블이 존재하는 경우 처리하는 방법 설정. 오류 발생, 기존 테이블에 추가, 기존 테이블 대체 (str, optional, 'fail'|'replace'|'append', default: 'fail')
1. 데이터 세트 확인¶
분류 모델을 만들기 위해 ThanoSQL 워크스페이스 데이터베이스에 저장되어 있는 titanic_train 테이블을 사용합니다. 아래의 쿼리 구문을 실행하고 테이블의 내용을 확인합니다.
%%thanosql
SELECT *
FROM titanic_train
LIMIT 5
passengerid | survived | pclass | name | sex | age | sibsp | parch | ticket | fare | cabin | embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | None | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | None | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | None | S |
데이터 테이블 이해하기
tianic_train 테이블은 아래와 같은 정보를 담고 있습니다.
- passengerid: 탑승승객 아이디
- survived: 탑승승객 생존 여부
- pclass: 탑승승객 티켓 등급
- name: 탑승승객 이름
- sex: 탑승승객 성별
- age: 탑승승객 나이
- sibsp: 탑승한 형제 자매 또는 배우자 수
- parch: 탑승한 부모 또는 자녀의 수
- ticket: 티켓 번호
- fare: 요금
- cabin: 선실
- embarked: 승선지 또는 항구
이번 튜토리얼에서는 추가적인 쿼리문을 이용한 데이터 전처리가 필요한 name, ticket, cabin, passengerid컬럼을 제외하고 모델 학습을 진행하겠습니다.
2. 분류 모델 생성¶
이전 단계에서 확인한 titanic_train 테이블을 사용하여 생존자 예측 분류 모델을 만듭니다. 아래의 쿼리 구문을 실행하여 titanic_automl_classification이라는 이름의 모델을 만듭니다.
(쿼리 실행 시 예상 소요 시간: 8 min)
%%thanosql
BUILD MODEL titanic_automl_classification
USING AutomlClassifier
OPTIONS (
target_col='survived',
impute_type='iterative',
features_to_drop=['name', 'ticket', 'passengerid', 'cabin'],
time_left_for_this_task=300,
overwrite=True
)
AS
SELECT *
FROM titanic_train
Success
쿼리 세부 정보
- "BUILD MODEL" 쿼리 구문을 사용하여 titanic_automl_classification이라는 모델을 만들고 학습시킵니다.
- "USING" 쿼리 구문을 통해 베이스 모델로 AutomlClassifier를 사용할 것을 명시합니다.
- "OPTIONS" 쿼리 구문을 통해 모델 생성에 사용할 옵션을 지정합니다.
- "target_col": 분류 모델의 목푯값이 담겨 있는 컬럼명 (str, default: 'target')
- "impute_type": 데이터 테이블의 빈 값(NaN)을 처리하는 방법 설정 (str, optional, 'simple'|'iterative', default: 'simple')
- "features_to_drop": 데이터 테이블에서 학습에 이용하지 못하는 컬럼명 리스트 (list[str], optional)
- "time_left_for_this_task": 적합한 분류 예측 모델을 찾는데 소요되는 초 단위 시간 (int, optional, default: 60)
- "overwrite": 동일 이름의 모델이 존재하는 경우 덮어쓰기 가능 여부 설정. True일 경우 기존 모델은 새로운 모델로 변경됨 (bool, optional, True|False, default: False)
3. 생성된 모델 평가¶
아래의 쿼리문을 실행하여 이전 단계에서 만든 예측 모델의 성능을 평가합니다.
%%thanosql
EVALUATE USING titanic_automl_classification
OPTIONS (
target_col='survived'
)
AS
SELECT *
FROM titanic_train
metric | score | |
---|---|---|
0 | Accuracy | 0.923681 |
1 | ROCAUC | 0.927237 |
2 | Recall | 0.939103 |
3 | Precision | 0.856725 |
4 | F1-Score | 0.896024 |
5 | Kappa | 0.835941 |
6 | MCC | 0.838139 |
쿼리 세부 정보
- "EVALUATE USING" 쿼리 구문을 사용하여 이전 단계에서 만든 titanic_automl_classification 모델을 평가합니다.
- "OPTIONS" 쿼리 구문을 통해 모델 평가에 사용할 옵션을 지정합니다.
- "target_col": 분류 모델의 목푯값이 담겨 있는 컬럼명 (str, default: 'target')
평가용 데이터 세트
평가용 데이터 세트는 학습 데이터 세트의 일부를 분리하여 학습에 사용되지 않아야 하나 튜토리얼에서는 편의상 학습 데이터를 사용합니다
4. 생성된 모델을 사용하여 생존자 예측¶
이전 단계에서 생성한 생존자 예측 모델을 사용해 탑승 승객 정보에 따른 생존 여부를 예측해 봅니다. 테스트용 데이터 세트(학습에 이용되지 않은 데이터 테이블, titanic_test)를 사용합니다.
%%thanosql
PREDICT USING titanic_automl_classification
OPTIONS (
result_col='predict_result'
)
AS
SELECT *
FROM titanic_test
passengerid | pclass | name | sex | age | sibsp | parch | ticket | fare | cabin | embarked | predict_result | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 892 | 3 | Kelly, Mr. James | male | 34.5 | 0 | 0 | 330911 | 7.8292 | None | Q | 0 |
1 | 893 | 3 | Wilkes, Mrs. James (Ellen Needs) | female | 47.0 | 1 | 0 | 363272 | 7.0000 | None | S | 0 |
2 | 894 | 2 | Myles, Mr. Thomas Francis | male | 62.0 | 0 | 0 | 240276 | 9.6875 | None | Q | 0 |
3 | 895 | 3 | Wirz, Mr. Albert | male | 27.0 | 0 | 0 | 315154 | 8.6625 | None | S | 0 |
4 | 896 | 3 | Hirvonen, Mrs. Alexander (Helga E Lindqvist) | female | 22.0 | 1 | 1 | 3101298 | 12.2875 | None | S | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
413 | 1305 | 3 | Spector, Mr. Woolf | male | NaN | 0 | 0 | A.5. 3236 | 8.0500 | None | S | 0 |
414 | 1306 | 1 | Oliva y Ocana, Dona. Fermina | female | 39.0 | 0 | 0 | PC 17758 | 108.9000 | C105 | C | 1 |
415 | 1307 | 3 | Saether, Mr. Simon Sivertsen | male | 38.5 | 0 | 0 | SOTON/O.Q. 3101262 | 7.2500 | None | S | 0 |
416 | 1308 | 3 | Ware, Mr. Frederick | male | NaN | 0 | 0 | 359309 | 8.0500 | None | S | 0 |
417 | 1309 | 3 | Peter, Master. Michael J | male | NaN | 1 | 1 | 2668 | 22.3583 | None | C | 0 |
418 rows × 12 columns
쿼리 세부 정보
- "PREDICT USING" 쿼리 구문을 사용하여 이전 단계에서 만든 titanic_automl_classification 모델을 예측에 사용합니다.
- "OPTIONS" 쿼리 구문을 통해 예측에 사용할 옵션을 지정합니다.
- "result_col": 데이터 테이블에서 예측 결과를 담을 컬럼 이름 (str, optional, default: 'predict_result')
5. 튜토리얼을 마치며¶
이번 튜토리얼에서는 캐글의 Titanic: Machine Learning from Disaster 데이터 세트를 사용하여 타이타닉 생존자 분류 예측 모델을 만들어 보았습니다. 초급 단계 튜토리얼인만큼 정확도 향상을 위한 과정보다는 전반적인 프로세스 위주의 설명으로 진행 하였습니다.
나만의 서비스를 위한 모델 배포 관련 문의
ThanoSQL을 활용해 나만의 모델을 만들거나, 나의 서비스에 적용하는데 어려움이 있다면 언제든 아래로 문의주세요😊
분류 모델 구축 관련 문의: contact@smartmind.team