Search
🤖

ML 01. 머신러닝 프로젝트 프로세스

Created at
2021/01/26
Updated at
2021/01/26
Tags
Keywords
ML
3 more properties
머신러닝 알고리즘도 중요하지만 머신러닝 프로젝트 전체의 프로세스를 올바로 구축하는 것도 매우 중요합니다! 핸즈온 머신러닝 Ch 2. 머신러닝 프로젝트 처음부터 끝까지 파트를 보면서 정리한 내용입니다.
목차 (=머신러닝 프로젝트의 주요 단계)
머신러닝 학습을 위한 데이터를 구할 수 있는 곳
유명한 공개 데이터 저장소
UC Irvine 머신러닝 저장소: http://archive.ics.uci.edu/ml
Kaggle 데이터셋: http://www.kaggle.com/datasets
Amazon AWS 데이터셋: https://registry.opendata.aws
메타 포털 (공개 데이터 저장소 나열)
Open Data Monitor: https://opendatamonitor.eu
기타
위키백과 머신러닝 데이터셋 목록: https://goo.gl/SJHN2k
데이터셋 subreddit: www.reddit.com/r/datasets

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⟫