머신러닝 알고리즘도 중요하지만 머신러닝 프로젝트 전체의 프로세스를 올바로 구축하는 것도 매우 중요합니다! 핸즈온 머신러닝 Ch 2. 머신러닝 프로젝트 처음부터 끝까지 파트를 보면서 정리한 내용입니다.
목차 (=머신러닝 프로젝트의 주요 단계)
머신러닝 학습을 위한 데이터를 구할 수 있는 곳
•
유명한 공개 데이터 저장소
◦
UC Irvine 머신러닝 저장소: http://archive.ics.uci.edu/ml
◦
Kaggle 데이터셋: http://www.kaggle.com/datasets
◦
Amazon AWS 데이터셋: https://registry.opendata.aws
•
메타 포털 (공개 데이터 저장소 나열)
◦
Data Portals: https://dataportals.org
◦
Open Data Monitor: https://opendatamonitor.eu
◦
Quandl: http://quandl.com
•
1. 큰 그림 보기
•
문제 정의
◦
이 모델을 어떻게 사용하려는 것인지 목적을 정의
▪
문제를 어떻게 구성하고, 어떤 알고리즘을 선택할지, 어떤 성능 지표를 사용할지, 모델 튜닝을 위해 얼마나 노력을 투여할지 결정하는 아주 중요한 문제
◦
현재 상황 파악
▪
문제 해결 방법에 대한 정보, 참고 성능으로 사용
파이프라인(pipeline)
- 데이터 처리 컴포넌트(component)들이 연속되어 있는 것을 데이터 파이프라인이라고 함
- 머신러닝 시스템은 데이터를 조작하고 변환할 일이 많아 파이프라인을 흔히 사용
- 컴포넌트들은 비동기적, 독립적으로 동작하며 컴포넌트 사이의 인터페이스는 데이터 저장소뿐
- 파이프라인은 시스템을 이해하기 쉽게 만들고 각 팀이 각자의 컴포넌트에 집중할 수 있게하고 시스템을 견고하게 만듦
•
성능 지표 선택
•
가정 검사
2. 데이터 가져오기
•
작업 환경 만들기
•
데이터 다운로드
•
데이터 구조 훑어보기
◦
df.info()
◦
df.describe()
◦
df.hist()
•
test set 만들기
◦
test set을 들여다보고서 머신러닝모델을 선택한후 측정한 일반화 오차는 낙관적인 추정이 되며, 실제로는 기대한 성능이 나오지 않을 수 있음 → 데이터 스누핑(data snooping) 편향
◦
사이킷런은 데이터셋을 나누는 다양한 방법 제공
▪
train_test_split
▪
StratifiedSuffleSplit
3. 데이터 탐색과 시각화
•
데이터 특성에 맞는 plotting
•
상관 관계 조사
◦
Pearson r: df.corr()
◦
산점도
•
여러 특성의 조합으로 실험
◦
유용할 것으로 예상되는 변수를 조합하여 생성할 수 있음
◦
이는 반복적인 과정으로 프로토타입의 결과를 분석 후 더 많은 통찰을 얻고 이 단계로 돌아오고 반복
4. 머신러닝 알고리즘을 위한 데이터 준비
데이터 준비 작업을 함수를 만들어 자동화해야 하는 이유
•
어떤 데이터셋에 대해서도 데이터 변환을 손쉽게 반복 (e.g. 새로운 데이터셋을 사용할 때)
•
향후 프로젝트에 사용할 수 있는 변환 라이브러리를 점진적으로 구축
•
실제 시스템에서 알고리즘에 새 데이터를 주입하기 전에 변환시키는 데 사용
•
여러 가지 데이터 변환을 쉽게 시도해보고 어떤 조합이 가장 좋은지 확인하는 데 편리
데이터 정제
•
수치형 feature: missing value 처리
◦
df.dropna(): 해당 데이터 제거
◦
df.drop(): 해당 특성 제거
◦
df.fillna(): 다른 값으로 대체 (imputation) - 0, 평균, 중간값 등
▪
사이킷런 SimpleImputer 사용 가능
•
imputer는 각 특성의 대체값을 계산해서 그 결과를 객체의 statistics_ 속성에 저장함
•
서비스시를 고려해서 모든 수치형 특성에 imputer를 적용하는 것이 바람직
from sklearn.impute import SimpleImputer
imputer = simpleImputer(strategy='median')
imputer.fit(df) # median 값 저장
X = imputer.transform(df) # missing value impute
# numpy 배열인 X를 dataframe으로 변환
train_df = pd.DataFrame(X, columns=df.columns, index=df.index)
Python
복사
•
텍스트와 범주형 feature
◦
카테고리 to 숫자: ordinal data인 경우
▪
사이킷런 OrdinalEncoder 클래스 사용
◦
원핫인코딩(one-hot encoding)
▪
사이킷런 OneHotEncoder 클래스 사용
•
특성 스케일링(feature scaling)
◦
많은 머신러닝 알고리즘은 feature들의 스케일이 크게 다르면 잘 작동하지 않는 경우가 많음
(트리 기반 알고리즘은 해당 없음)
타깃 값에 대한 스케일링은 일반적으로 불필요함
1.
min-max 스케일링
•
0~1 범위에 들도록 스케일 조정: (데이터 - 최솟값) / (최댓값 - 최소값)
•
사이킷런 MinMaxScaler 변환기 사용
2.
표준화(standardization)
•
평균을 빼고 표준편차로 나누어 결과 평균 0, 분포의 분산이 1이 되도록 함
•
결과 범위에 이상치에 영향을 덜 받음
•
사이킷런 StandardScaler 변환기 사용
◦
모든 변환기에서 스케일링은 train set에 대해서만 fit() 메서드를 적용해야 함
→ 그 다음에 train set과 test set에 대해 transform() 메서드 사용
변환 파이프라인
•
연속된 변환 단계를 정확하게 순서대로 실행해야 함
•
사이킷런 Pipeline 클래스 사용
•
하나의 변환기로 열마다 적절한 변환을 적용하려면 사이킷런 ColumnTransformer 클래스 사용
5. 모델 선택과 훈련
•
훈련 세트에서 훈련하고 평가
•
교차 검증
◦
train set을 train_test_split 함수로 더 작은 train set - validation set으로 나눔
◦
사이킷런의 k-겹 교차 검증(k-fold cross-validation) 기능 사용
•
실험한 모델을 저장해두면 필요할 때 모델을 쉽게 복원 가능
◦
pickle 패키지나 joblib(큰 넘파이 배열 저장에 효율적)을 사용하여 사이킷런 모델을 간단하게 저장
import joblib
# 모델 저장
joblib.dump(my_model, "my_model.pkl")
# 나중에 모델 복원
my_model_loaded = joblib.load("my_model.pkl")
Python
복사
6. 모델 세부 튜닝
그리드 탐색
•
사이킷런 GridSearchCV 사용
◦
탐색하려는 하이퍼파라미터와 시도해볼 값을 지정하면 가능한 모든 하이퍼파라미터 조합에 대해 교차 검증을 사용해 평가함
랜덤 탐색
•
하이퍼파라미터 탐색 공간이 커지면 RandomizedSearchCV를 사용하는 편이 좋음
•
장점
◦
랜덤 탐색을 1000회 반복하도록 실행하면 하이퍼파라미터마다 각기 다른 1000개의 값을 탐색
◦
단순히 반복 횟수를 조절하는 것만으로 하이퍼파라미터 탐색에 투입할 컴퓨팅 자원 제어 가능
앙상블 방법
•
모델의 앙상블은 최상의 단일 모델보다 더 나은 성능을 발휘할 때가 많음
•
특히 개개의 모델이 각기 다른 형태의 오차를 만들 때 효과적
최상의 모델과 오차 분석
•
Radon Forest는 정확한 예측을 만들기 위한 각 특성의 상대적 중요도를 알려줌
→ 이 정보를 바탕으로 덜 중요한 특성들을 제외할 수 있음
•
시스템이 특정한 오차를 만들었다면 왜 그런 문제가 생겼는지 이해하고 해결 방법을 찾아야 함
(추가 특성 포함, 불필요 특성 제거, 이상치 제외 등)
Test set으로 시스템 평가
•
test set에서 full_pipeline을 사용해 데이터 변환(test set에서는 fit 없이 transform 만!)하고 최종 모델을 평가
•
test set에서 성능을 좋게하려고 하이퍼파라미터 튜닝을 하지 말 것
7. 시스템 론칭, 모니터링, 유지 보수
•
제품 시스템에 적용하기 위한 준비 (코드 정리, 문서와 테스트 케이스 작성)
•
모델을 상용 환경에 배포
◦
REST API
◦
구글 클라우드 AI 플랫폼 같은 클라우드에 배포
•
모니터링 시스템 준비
◦
일정 간격으로 시스템의 실시간 성능을 체크하고 성능이 떨어졌을 때 알람을 통지
◦
모델 실패시 무엇을 할 지 정의하고 대비 관련 프로세스를 준비
•
데이터가 계속 변화하면 데이터셋을 업데이트하고 모델을 정기적으로 다시 훈련. 자동화 필요
•
모델의 입력 데이터 품질을 평가
•
모델 백업(backup): 문제가 생겼을 때 이전 모델로 빠르게 롤백하기 위한 절차와 도구 준비
참고 자료
•
오렐리앙 제롬 지음, 박해선 옮김, ⟪핸즈온 머신러닝 2/E⟫