My Data Story
[개요] 머신러닝 프로젝트 절차(5) - 모델 훈련 및 검증 본문
◈ '머신러닝 프로젝트 절차' 목차 ◈
2. 머신러닝 프로젝트절차(2) - 데이터 샘플링 및 훈련/테스트 세트 만들기
3. 머신러닝 프로젝트 절차(3) - 데이터 이해를 위한 탐색
4. 머신러닝 프로젝트 절차(4) - 머신러닝 알고리즘을 위한 데이터 준비
5. 머신러닝 프로젝트 절차(5) - 모델 훈련 및 검증
훈련 세트에서 다양한 모델에 대해 훈련하고 검증하여 괜찮은 모델 하나를 선정한다.
1. 훈련 시 랜덤한 샘플의 필요성
학습 알고리즘은 훈련 샘플의 순서에 민감해서 비슷한 샘플이 연이어 나타나면 성능이 나빠진다.
학습하기 전에 랜덤하게 데이터 셋을 섞으면 이러한 문제를 방지할 수 있다.
SGD가 샘플을 섞는 대표적인 경우이다.
SGDClassifier 와 SGDRegressor는 기본적으로 epoch 마다 훈련 데이터를 다시 섞는다.
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', version=1)
print(mnist.key())
2. 훈련 세트에서 훈련하고 평가하기
모델 훈련을 한다는 것은 모델이 훈련 세트에 가장 잘 맞도록 모델 파라미터를 설정하는 것이다.
모델이 어떻게 작동하는 지 잘 이해하고 있으면 적절한 모델, 올바른 훈련 알고리즘, 작업에 맞는 좋은 하이퍼파라미터를 빠르게 찾을 수 있다.
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
#모델생성
tree_reg = DecisionTreeRegressor()
#모델훈련
tree_reg.fit(df_train, df_labels)
#모델예측
df_predict = tree_reg.predict(df_train)
#모델평가
tree_mes = mean_sqaured_error(df_labels, df_predict)
tree_rmse = np.sqrt(tree_mes)
확신이 드는 모델을 론칭하기 전까지는 테스트 세트는 사용하지 않는다! 대신, 훈련 세트의 일부를 모델 검증에 사용한다!
3. 교차 검증
훈련 세트를 더 작은 훈련 세트와 검증 세트로 나누고
더 작은 훈련 세트로 모델 훈련 시키고 검증 세트로 모델 검증 진행한다.
- K-겹 교차 검증 (K-Fold Cross Validation)
step1
훈련 세트를 fold 라 불리는 n개의 서브셋으로 무작위로 분할한다.
step2
선정한 모델을 n번 훈련하고 평가 진행한다.
step3
매버 다른 fold 선정하여 평가에 사용하고, 나머지 fold로 훈련한다.
#교차검증을 활용한 검증 세트에 대한 성능 측정
from sklearn.model_selection import cross_val_score
scores = cross_val_score(tree_reg,
df_train,
df_labels,
scoring='neg_mean_sqaured_error',
cv=10)
#사이킷런의 교차 검증 기능은 비용함수가 아닌 효용함수를 기대하기에, 마이너스를 붙인다.
tree_reg_scores = np.sqrt(-scores)
#교차검증 통해서 모델의 성능 뿐만 아니라, 이 추정이 얼마나 정확한 지도 측정 가능하다.
scores.mean()
scores.std()
훈련 세트에 대한 점수 tree_rmse 와 검증 세트에 대한 점수 tree_reg_scores 비교할 때
훈련 세트에 대한 점수가 더 높으면 모델이 훈련 세트에 과대 적합 된 것이다.
앙상블 학습 전에 하이퍼파라미터 조정에 너무 많은 시간을 쏟지 않으면서 다양한 모델을 시도하고 저장해둬야 한다.
왜냐하면 모델 선택 이후에 모델 세부 튜닝 진행할 것이기 때문이다.
Tip!
실험한 모델을 모두 저장해두면 필요할 때 쉽게 모델을 복원할 수 있다.
교차 검증 점수와 실제 예측값은 물론 하이퍼파라미터와 훈련된 모델의 파라미터까지 모두 저장해야 한다.
import joblib
#모델 저장
joblib.dump(my_model, 'my_model.pkl')
#저장된 모델 로딩
my_model_loaded = joblib.load('my_model.pkl')
4. 검증 유의점
4.1 과소 적합 vs 과대 적합
- 과소 적합 (Underfitting) : 단순 모델로 학습하거나 충분하지 않은 데이터 패턴 학습으로 높은 편향을 갖음
- 과대 적합 (Overfitting) : 복잡한 모델로 학습하거나 학습 데이터 패턴에만 효과있어 높은 분산을 갖음
발생 이유
- 독립 변수 갯수에 비해 추정해야 하는 모델의 파라미터/모수의 수가 너무 큰 경우
- 독립 변수가 서로 독립이 아닌 경우
문제 이유
- 학습에 사용되지 않은 새로운 독립 변수 값을 입력하면 오차가 커짐 (Cross-validation 오차)
- 샘플 데이터가 조금만 변화해도 추정되는 파라미터/모수의 값이 크게 달라짐 (추정의 불안정성/부정확성)
4.2 편향-분산 상충관계
훈련한 모델로 데이터를 예측할 때 실제값과 예측값 사이의 에러(Error)에는 편향과 분산 정보가 존재한다.
- 편향(Bias) : 점 추정
- 예측값과 실제값의 차이
- 모델의 단순화로 미처 반영하지 못한 복잡성을 의미
. 편향이 작다면 Training 데이터 패턴(복잡성)을 최대 반영
. 편향이 크다면 Training 데이터 패턴(복잡성)을 최소 반영 - 분산(Variance) : 구간 추정
- 학습한 모델의 예측값이 평균으로부터 퍼진 정도 (변동성/분산)
- 다른 데이터(Testing)를 사용했을 때 발생할 변화를 의미
. 분산이 작다면 다른 데이터로 예측시 적은 변동 예상
. 분산이 크다면 다른 데이터로 예측시 많은 변동 예상 - 모델의 복잡도가 낮으면 Bias가 증가하고 Variance는 감소한다. (Underfitting)
- 구간 추정 범위는 좁으나 점추정 정확도가 낮다.
- Training, Testing 모두 예측력이 낮다. - 모델의 복잡도가 높으면 Bias가 감소하고 Variance가 증가한다. (Overfitting)
- 점추정 정확성은 높으나 구간 추정 범위가 넓다.
- Training만 예측력 높고 Testing은 예측력이 낮다.
결국 Bias와 Variance가 최소화되는 수준에서 모델의 복잡도를 선택해야 한다.
훈련 데이터 상에서의 Error가 크다면 이는 Bias가 큰 과소 적합된 모델이므로 더 복잡한 모델을 구현하거나, 더 많은 특성을 수집하거나, 모델에 적용된 규제를 완화하도록 한다.
반면 훈련 데이터 상에서의 Error는 괜찮은데, 검증 데이터 상에서의 Error가 크다면 이는 Variance가 큰 과대 적합된 모델이므로 좀 더 단순한 모델을 구현하거나, 더 많은 데이터를 추가 수집하거나 모델에 적용된 특성을 줄이거나 모델에 더 많은 규제를 가하도록 한다.
'Machine Learning > 1. 머신러닝 프로젝트 절차' 카테고리의 다른 글
[개요] 머신러닝 프로젝트 절차(7) - 시스템 론칭 (0) | 2021.08.12 |
---|---|
[개요] 머신러닝 프로젝트 절차(6) - 모델 세부 튜닝 (0) | 2021.08.12 |
[개요] 머신러닝 프로젝트 절차(4) - 머신러닝 알고리즘을 위한 데이터 준비 (0) | 2021.08.12 |
[개요] 머신러닝 프로젝트 절차(3) - 데이터 이해를 위한 탐색 ... 수정중 (0) | 2021.08.12 |
[개요] 머신러닝 프로젝트 절차 (2) - 데이터 샘플링 및 훈련/테스트 세트 만들기 (0) | 2021.08.12 |