Menu
CoddyTech

과소적합과 과적합

Coddy Machine Learning 여정의 지도 학습 섹션에 포함된 레슨. 58개 중 32번째.

머신러닝의 가장 큰 함정, 즉 k = 1과 깊은 트리가 데이터를 암기하는 문제를 접했습니다. 이 장에서는 이 문제에 이름을 붙이고 다음과 같은 차트로 마무리합니다.

깊이에 따른 트리의 학습 및 검증 정확도: 학습 정확도는 1.0을 향해 상승하고, 검증 정확도는 깊이 3에서 정점을 찍은 뒤 하락합니다. 점선은 선택한 깊이를, 빨간 별은 테스트 점수 0.82를 표시합니다.

함정: 바질 15그루에 서로 다른 방식으로 물을 주고, 수확량에 세 곡선을 맞췄습니다:

일일 급수량에 따른 훈련용 식물 15그루의 잎 수확량은 회색 점으로, 테스트용 식물 5그루의 잎 수확량은 검은 사각형으로 표시되어 있습니다. 파란 직선은 봉우리를 놓치고, 초록색 3차 곡선은 봉우리를 따라가며, 빨간색 12차 곡선은 점들 사이에서 심하게 요동칩니다

1차는 너무 단순합니다: 과소적합. 12차는 모든 훈련 점을 통과하며 그 사이를 오갑니다: 과적합, 학습하는 것이 아니라 암기하는 것입니다.

np.polyval(coefs, x)는 곡선의 높이를 반환합니다. 훈련 및 테스트 RMSE(그램 단위):

for degree in [1, 3, 12]:
    coefs = np.polyfit(water_train, grams_train, degree)
    train_err = np.sqrt(mean_squared_error(grams_train, np.polyval(coefs, water_train)))
    test_err = np.sqrt(mean_squared_error(grams_test, np.polyval(coefs, water_test)))
    print(degree, round(train_err), round(test_err))

다음과 같이 출력됩니다:

1 156 138
3 15 19
12 9 173

과적합의 징후: 훈련 오차는 작고 테스트 오차는 크다.

challenge icon

챌린지

중급

풍력 발전소는 풍속을 바탕으로 터빈 하나의 출력을 모델링합니다. 시작 코드는 측정값 24개를 분할하고 max_degree를 읽습니다.

  1. 1부터 max_degree까지 각 차수에 대해 학습 데이터로 곡선을 적합하고, 학습 및 테스트 RMSE를 정수 kW 단위로 출력합니다.
  2. 테스트 오차가 학습 오차의 2배를 초과하는 첫 번째 차수를 출력하거나, No overfitting up to degree와 max_degree를 출력합니다.

다른 터빈과 7의 경우:

Degree 1: train 117 kW, test 172 kW
Degree 2: train 115 kW, test 182 kW
Degree 3: train 64 kW, test 85 kW
Degree 4: train 63 kW, test 79 kW
Degree 5: train 47 kW, test 67 kW
Degree 6: train 47 kW, test 65 kW
Degree 7: train 23 kW, test 85 kW
Overfitting starts at degree 7

직접 해보기

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

max_degree = int(input())

# 아래 줄은 변경하지 마세요: 풍력 터빈 한 대의 풍속 (m/s)과 출력 (kW)
speed = np.array([3.8, 4.3, 5.1, 5.6, 5.6, 6.7, 6.8, 7.2, 7.8, 8.5, 8.9, 9.1,
                  10.2, 10.9, 11.4, 11.9, 12.2, 12.4, 12.6, 13.2, 13.9, 14.4, 15.5, 16.5])
power = np.array([0, 85, 179, 22, 17, 126, 255, 273, 419, 545, 612, 665,
                  913, 1120, 1114, 1227, 1299, 1400, 1293, 1329, 1396, 1493, 1461, 1552])
speed_train, speed_test, power_train, power_test = train_test_split(
    speed, power, test_size=0.25, random_state=0)

# 아래에 코드를 작성하세요
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

지도 학습의 모든 레슨

직접 연습해 보세요: 온라인 Python 컴파일러