일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 선형회귀 #정규방정식 #계산복잡도 #LinearRegression #Python #ML
- 확률적경사하강법 #경사하강법 #머신러닝 #선형회귀 #ML #Chap4
- python #dataframe #파생변수 #map #lambda #mapping
- Chap4 #다항회귀 #PolynomialRegression #ML #머신러닝
- ML #핸즈온머신러닝 #학습곡선 #편향분산트레이드오프
- 객체의종류 #리스트 #튜플 #딕셔너리 #집합 #Python #파이썬 #list #tuple #dictionary #set
- 핸즈온머신러닝 #handson
- 파이썬 #Python #가상환경 #anaconda #python설치 #python가상환경
- Chap4 #핸즈온머신러닝 #머신러닝 #핸즈온머신러닝연습문제
- 라쏘회귀 #엘라스틱넷 #조기종료
- 경사하강법 #핸즈온머신러닝 #머신러닝 #ML
- Chap4 #ML #배치경사하강법 #경사하강법 #핸즈온머신러닝 #핸즈온
- 키워드추출 #그래프기반순위알고리즘 #RandomSurferModel #MarcovChain #TextRank #TopicRank #EmbedRank
- Chap4 #릿지회귀 #정규방정식 #확률적경사하강법 #SGD #규제가있는선형모델
- 인덱싱 #슬라이싱 #python #파이썬 #수정및삭제 #원소의수정 #객체의함수 #keys#values#items#get#len#append#sort#sorted
- 티스토리 #수학수식 #수학수식입력 #티스토리블로그 #수식입력
- python #파이썬 #pandas #dataframe #dataframe생성 #valueerror
- IDE #spyder
- Chap4 #ML #미니배치경사하강법 #경사하강법 #머신러닝 #핸즈온머신러닝
- adp #데이터분석전문가 #데이터분석자격증 #adp후기 #adp필기
- 티스토리블로그 #티스토리 #PDF #블로그PDF저장
- Chap4
- Today
- Total
StudyStudyStudyEveryday
성능 측정 - 학습 곡선 본문
과대 적합과 과소 적합
고차 다항 회귀의 경우 차수가 낮은 선 회귀에 비해 훨씬 더 훈련 데이터에 잘 맞는다.
위 그래프를 참고해보자. 차수가 2인 회귀 모델에 비해 차수가 300인 모델은 심각하게 훈련 데이터에 과대적합되었다. 반면, 차수가 1인 선형 모델은 과소적합이 되어보인다.
이렇듯 모델을 만들고 난 후, 모델의 일반화 성능을 추정해볼 필요가 있다. 측정 방법에는 교차 검증 방법과 학습 곡선을 살펴보는 방법이 있다. 이번 포스팅에서는 학습 곡선에 대해 알아보고, 추후에 교차 검증과 관련된 포스팅을 해보도록 하겠다.
학습 곡선을 이용한 성능 측정 (과소 적합된 경우)
학습 곡선 그래프는 훈련 세트와 검증 세트의 모델 성능을 훈련 세트 크기(or 훈련 반복)의 함수로 나타낸다. 이 그래프를 생성하기 위해선 훈련 세트에 크기가 다른 서브 세트를 만들어 모델을 여러 번 훈련시키면 된다.
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
# 주어진 훈련 데이터에서 모델의 학습 곡선을 그리는 함수 정의
def plot_learning_curves(model, X, y):
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=10)
train_errors, val_errors = [], []
for m in range(1, len(X_train) + 1):
model.fit(X_train[:m], y_train[:m])
y_train_predict = model.predict(X_train[:m])
y_val_predict = model.predict(X_val)
train_errors.append(mean_squared_error(y_train[:m], y_train_predict))
val_errors.append(mean_squared_error(y_val, y_val_predict))
plt.plot(np.sqrt(train_errors), "r-+", linewidth=2, label="train")
plt.plot(np.sqrt(val_errors), "b-", linewidth=3, label="val")
plt.legend(loc="upper right", fontsize=14)
plt.xlabel("Training set size", fontsize=14)
plt.ylabel("RMSE", fontsize=14)
# 단순 선형 회귀 모델의 학습 곡선 그리기
lin_reg = LinearRegression()
plot_learning_curves(lin_reg, X, y)
plt.axis([0, 80, 0, 3])
plt.show()
위 코드에 사용된 데이터는 이전에 작성했던 '다항회귀 포스트'를 참고하면 된다.
이 모델은 과소 적합 모델의 전형적인 모습이다. 두 곡선이 수펴앟ㄴ 구간을 만들고 꽤 높은 오차에서 매우 가까이 근접해 있다.
훈련 데이터 성능 확인
- 훈련 세트 내 샘플이 적은 경우 (1~2개) : 그래프가 0에서 시작 되므로 모델이 완벽하게 적용됨을 알 수 있다.
- 훈련 세트 내 샘플이 그 이상 있는 경우 : 잡음도 있고 비선형이기 때문에 RMSE가 어느정도 평편해질 때까지 증가한다.
검증 데이터 성능 확인
- 모델이 적은 수의 훈련 샘플로 훈련된 경우 : 제대로 일반화 불가능하여 검증 오차가 초기에 매우 크다.
- 모델이 충분한 수의 훈련 샘플로 훈련된 경우 : 학습이 되고 검증 오차가 천천히 감소한다. 하지만 선형 회귀의 경우 데이터를 잘 모델링하지 못해 오차의 감소가 완만해져 훈련 세트의 그래프와 가까워진다.
결과부터 말하자면, 모델이 훈련 데이터에 과소적합되어 있다면 훈련 샘플을 더 추가해서 효과가 없다. 더 복잡한 모델을 사용하거나 더 나은 특성을 선택해야한다.
학습 곡선을 이용한 성능 측정 (과대 적합된 경우)
위와 같은 데이터에서 10차 다항 회귀 모델의 학습 곡선을 그려보겠다.
from sklearn.pipeline import Pipeline
polynomial_regression = Pipeline([
("poly_features", PolynomialFeatures(degree=10, include_bias=False)),
("lin_reg", LinearRegression()),
])
plot_learning_curves(polynomial_regression, X, y)
plt.axis([0, 80, 0, 3])
plt.show()
위 학습곡선과 과소적합된 학습곡선과의 차이점은 다음과 같다.
- 훈련 데이터의 오차가 선형 회귀 모델보다 훨씬 낮다.
- 두 곡선 사이에 공간이 있다. 즉, 훈련 데이터에서의 모델 성능 > 검증 데이터에서의 모델 성능
이는 과대적합 모델의 특징이다. 과대적합 모델을 개선하려면 검증오차가 훈련오차에 근접할 때까지 더 많은 훈련 데이터를 추가하는 것이다.
편향/분산 트레이드오프
모델의 일반화 오차는 세 가지 다른 오차의 합으로 나타낼 수 있다.
- 편향 (bias) : 잘못된 가정으로 인한 일반화 오차. 편향이 큰 모델은 훈련 데이터에 과소적합되기 쉽다.
- 분산 (variance) : 훈련 데이터에 있는 작은 변동에 모델이 과도하게 민감해 나타난다. 자유도가 높은 모델이 높은 분산을 가지기 쉬워, 훈련 데이터에 과대적합되는 경향이 있다.
- 줄일 수 없는 오차 (irreducible error) : 데이터 자체에 있는 잡음 때문에 발생. 이 오차를 줄일 수 있는 방법은 데이터에서 잡음을 제거하는 것이다. (이상치 제거 등)
여기서 편향/분산 트레이드오프란?
- 모델의 복잡도가 커지면 통상적으로 분산이 커지고 편향은 줄어든다.
- 모델의 복잡도가 작아지면 통상적으로 분산이 작아지고 편향은 커진다.
'DataScience > 핸즈온 머신러닝 Hands-on ML' 카테고리의 다른 글
[파이썬머신러닝] 로지스틱 회귀 (Logistic Regression) (0) | 2022.03.31 |
---|---|
[파이썬머신러닝] 규제가 있는 선형 모델 - 릿지 회귀 / 라쏘 회귀 / 엘라스틱 넷 (0) | 2022.03.26 |
머신러닝 모델 - 다항 회귀 (Polynomial Regression) (0) | 2022.03.24 |
머신러닝 모델 훈련 - 미니배치 경사 하강법 (Mini-Batch Gradient Descent) | 세 가지 경사 하강법 비교 (0) | 2022.03.24 |
머신러닝 모델 훈련 - 확률적 경사 하강법 (Stochastic Gradient Descent, SGD) (0) | 2022.03.24 |