[Machine Learning 기초]E2E 머신러닝 프로젝트

4 minute read

주요 단계

  1. 큰 그림을 봅니다 (look at the big picture).
  2. 데이터를 구합니다 (get the data).
  3. 데이터로부터 통찰을 얻기 위해 탐색하고 시각화합니다 (discover and visualize the data to gain insights).
  4. 머신러닝 알고리즘을 위해 데이터를 준비합니다 (prepare the data for Machine Learning algorithms).
  5. 모델을 선택하고 훈련시킵니다 (select a model and train it).
  6. 모델을 상세하게 조정합니다 (fine-tune your model).
  7. 솔루션을 제시합니다 (present your solution).
  8. 시스템을 론칭하고 모니터링하고 유지 보수합니다 (launch, monitor, and maintain your system).

1. 큰 그림 보기

  • 이 모델이 전체 시스템 안에서 어떻게 사용될 지를 이해하는 것이 중요합니다.
  • 중요한 질문: 현재 솔루션은? 전문가가 수동으로? 복잡한 규칙? 머신러닝?

문제 정의

  • 지도학습(supervised learning), 비지도학습(unsupervised learning), 강화학습(reinforcement learning) 중에 어떤 경우에 해당하는가?
  • 분류문제(classification)인가 아니면 회귀문제(regresssion)인가?
  • 배치학습(batch learning), 온라인학습(online learning) 중 어떤 것을 사용해야 하는가?

성능측정지표(performance measure) 선택 평균제곱근 오차(root mean square error (RMSE))
$\mathrm{RMSE}(\mathbf{X}, h) = \sqrt{\frac{1}{m}\sum_{i=1}^{m}\left(h\left(\mathbf{x}^{(i)}\right)-y^{(i)}\right)^2}$

  • $m$: 데이터셋에 있는 샘플 수
  • $\mathbf{x}^{(i)}$: $i$번째 샘플의 전체 특성값의 벡터(vector)
  • $y^{(i)}$: $i$번째 샘플의 label(해당 샘플의 기대 출력값) $\begin{align} \mathbf{x}^{(1)} = \begin{bmatrix} -118.29
    33.91
    1,416
    38,372 \end{bmatrix} \end{align
    }$

\(y^{(1)} = 156,400\)

  • $\mathbf{X}$: 데이터셋 모든 샘플의 모든 특성값(features)을 포함하는 행렬(matrix) $\begin{align} \mathbf{X} = \begin{bmatrix} \left(\mathbf{x}^{(1)}\right)^T
    \left(\mathbf{x}^{(2)}\right)^T
    \vdots
    \left(\mathbf{x}^{(2000)}\right)^T \end{bmatrix} = \begin{bmatrix} -188.29 & 33.91 & 1,416 & 38,372
    \vdots & \vdots & \vdots & \vdots \end{bmatrix} \end{align
    }$

  • $h$: 예측함수(prediction function). 하나의 샘플 $\mathbf{x}^{(i)}$에 대해 예측값 $\hat{y}^{(i)} = h\left(\mathbf{x}^{(i)}\right)$를 출력함.
  • $\mathrm{RMSE}(\mathbf{X}, h)$: 모델 $h$가 얼마나 좋은지 평가하는 지표, 또는 비용함수(cost function)

2. 데이터 가져오기

  1. 작업환경 설정
  2. 독립적인 환경(isolated environment) 만들기
  3. 필요한 패키지들 설치하기
    • 나의 경우 python3 -m pip install ~~으로 해야 실행됨! (zsh 기준)
  4. 커널을 Jupyter에 등록하고 이름 정하기
  5. Jupyter 실행
    • 나의 경우 python3 -m jupyter notebook으로 해야 실행됨! (zsh 기준)
  6. 데이터 다운로드

3. 데이터로부터 통찰을 얻기 위해 탐색하고 시각화

  1. 데이터 구조 훑어보기
    • .head()
    • .value_counts()
    • .describe()
    • 히스토그램 분석 등
  2. 테스트 데이터셋 만들기 좋은 모델을 만들기 위해선 훈련에 사용되지 않고 모델평가만을 위해서 사용될 “테스트 데이터셋”을 따로 구분하는 것이 필요합니다. 테스트 데이터셋을 별도로 생성할 수도 있지만 프로젝트 초기의 경우 하나의 데이터셋을 훈련, 테스트용으로 분리하는 것이 일반적입니다.
    • 각 샘플의 식별자(identifier)를 사용해서 분할
    • Scikit-Learn에서 기본적으로 제공되는 데이터분할 함수 train_test_split
  3. 계층적 샘플링(stratified sampling)
    • 전체 데이터를 계층(strata)라는 동질의 그룹으로 나누고, 테스트 데이터가 전체 데이터를 잘 대표하도록 각 계층에서 올바른 수의 샘플을 추출
  4. 데이터 이해를 위한 탐색과 시각화
    • 상관관계 관찰하기
    • 위에서 관찰할 수 있는 사실들을 통해 특성 조합들 실험

4. 머신러닝 알고리즘을 위해 데이터를 준비

데이터 준비는 데이터 변환(data transformation)과정으로 볼 수 있습니다.
데이터 수동변환 vs. 자동변환(함수만들기)

데이터 자동변환의 장점들

  • 새로운 데이터에 대한 변환을 손쉽게 재생산(reproduce)할 수 있습니다.
  • 향후에 재사용(reuse)할 수 있는 라이브러리를 구축하게 됩니다.
  • 실제 시스템에서 가공되지 않은 데이터(raw data)를 알고리즘에 쉽게 입력으로 사용할 수 있도록 해줍니다.
  • 여러 데이터 변환 방법을 쉽게 시도해 볼 수 있습니다.
  1. 데이터 정제(Data Cleaning) 누락된 특성(missing features) 다루는 방법들
    • 해당 구역을 제거(행을 제거)
    • 해당 특성을 제거(열을 제거)
    • 어떤 값으로 채움(0, 평균, 중간값 등)
  2. Estimator, Transformer, Predictor
    • 추정기(estimator): 데이터셋을 기반으로 모델 파라미터들을 추정하는 객체를 추정기라고 합니다(예를 들자면 imputer). 추정자체는 fit() method에 의해서 수행되고 하나의 데이터셋을 매개변수로 전달받습니다(지도학습의 경우 label을 담고 있는 데이터셋을 추가적인 매개변수로 전달).
    • 변환기(transformer): (imputer같이) 데이터셋을 변환하는 추정기를 변환기라고 합니다. 변환은 transform() method가 수행합니다. 그리고 변환된 데이터셋을 반환합니다.
    • 예측기(predictor): 일부 추정기는 주어진 새로운 데이터셋에 대해 예측값을 생성할 수 있습니다. 앞에서 사용했던 LinearRegression도 예측기입니다. 예측기의 predict() method는 새로운 데이터셋을 받아 예측값을 반환합니다. 그리고 score() method는 예측값에 대한 평가지표를 반환합니다.
  3. 텍스트와 범주형 특성 다루기 이 표현방식의 문제점?
    • “특성의 값이 비슷할수록 두 개의 샘플이 비슷하다”가 성립할 때 모델학습이 쉬워짐 -> One-hot encoding사용!

  4. 나만의 변환기(Custom Transformers)만들기 Scikit-Learn이 유용한 변환기를 많이 제공하지만 프로젝트를 위해 특별한 데이터 처리 작업을 해야 할 경우가 많습니다. 이 때 나만의 변환기를 만들 수 있습니다.
    반드시 구현해야 할 method들
    • fit()
    • transform() 아래의 custom tranformer는 rooms_per_household, population_per_household 두 개의 새로운 특성을 데이터셋에 추가하며 add_bedrooms_per_room = True로 주어지면 bedrooms_per_room 특성까지 추가합니다. add_bedrooms_per_room은 하이퍼파라미터.

  5. 특성 스케일링(Feature Scaling)
    • Min-max scaling: 0과 1사이의 값이 되도록 조정
    • 표준화(standardization): 평균이 0, 분산이 1이 되도록 만들어 줌(사이킷런의 StandardScaler사용)
  6. 변환 파이프라인(Transformation Pipelines) 여러 개의 변환이 순차적으로 이루어져야 할 경우 Pipeline class를 사용하면 편합니다.

5. 모델을 선택하고 훈련

  • 선형회귀
  • 결정트리
  • 랜덤포레스트 훈련 데이터셋의 RMSE가 이 경우처럼 큰 경우 => 과소적합(under-fitting)
    과소적합이 일어나는 이유?
  • 특성들(features)이 충분한 정보를 제공하지 못함
  • 모델이 충분히 강력하지 못함

모델 평가 방법

  • 테스트 데이터셋을 이용한 검증
  • 훈련 데이터셋의 일부를 검증데이터(validation data)셋으로 분리해서 검증
  • k-겹 교차 검증(k-fold cross-validation)

6. 모델을 상세하게 조정

모델 세부 튜닝(Fine-Tune Your Model) 모델의 종류를 선택한 후에 모델을 세부 튜닝하는 것이 필요합니다. 모델 학습을 위한 최적의 하이퍼파라미터를 찾는 과정이라고 말할 수 있습니다.

그리드 탐색(Grid Search) 수동으로 하이퍼파라미터 조합을 시도하는 대신 GridSearchCV를 사용하는 것이 좋습니다.

랜덤 탐색(Randomized Search) 하이퍼파라미터 조합의 수가 큰 경우에 유리. 지정한 횟수만큼만 평가.


7. 솔루션을 제시

  • 특성 중요도, 에러 분석
  • 테스트 데이터셋으로 최종 평가하기

8. 시스템을 론칭하고 모니터링하고 유지 보수

  • 론칭, 모니터링, 시스템 유지 보수
  • 상용환경에 배포하기 위해서 데이터 전처리와 모델의 예측이 포함된 파이프라인을 만들어 저장하는 것이 좋습니다.

론칭후 시스템 모니터링

  • 시간이 지나면 모델이 낙후되면서 성능이 저하
  • 자동모니터링: 추천시스템의 경우, 추천된 상품의 판매량이 줄어드는지?
  • 수동모니터링: 이미지 분류의 경우, 분류된 이미지들 중 일부를 전문가에게 검토시킴
  • 결과가 나빠진 경우
    • 데이터 입력의 품질이 나빠졌는지? 센서고장?
    • 트렌드의 변화? 계절적 요인?

유지보수

  • 정기적으로 새로운 데이터 수집(레이블)
  • 새로운 데이터를 테스트 데이터로, 현재의 테스트 데이터는 학습데이터로 편입
  • 다시 학습후, 새로운 테스트 데이터에 기반해 현재 모델과 새 모델을 평가, 비교

전체 프로세스에 고르게 시간을 배분해야 합니다!