머신러닝 - Overfitting
머신러닝 기초를 공부하다가
오퍼피팅, 언더피팅에 대한 용어를 들었다.
여러 사이트를 읽어보다가
이해가 되는 시점에서
복습차원에서
정리해보고자 한다.
1. 오버피팅 - 과적합
과적합은 모델이 특정 데이터 세트에서 너무 잘 훈련되어
너무 전문화되어 새 데이터에 잘 일반화할 수 없는 머신 러닝의 일반적인 문제이다.
모델이 과적합되면 기능과 대상 변수 간의 기본 패턴과 관계를 학습하는 대신
기본적으로 교육 데이터와 해당 노이즈를 기억한다.
결과적으로 모델이 너무 복잡해지고
새롭거나 보이지 않는 데이터에서 제대로 수행되지 않아
정확도, 정밀도 및 재현율이 떨어진다.
과적합은 지나치게 복잡한 모델, 작은 훈련 데이터 세트
또는 많은 수의 관련 없는 기능을 비롯한 다양한 요인으로 인해 발생할 수 있다.
교차 유효성 검사, 정규화 및 조기 중지와 같은 기술을 사용하여 완화할 수 있습니다.
과적합은 머신러닝 모델이 너무 복잡해지고
기능과 대상 변수 사이의 기본 패턴 및 관계가 아닌
훈련 데이터의 노이즈 및 무작위성을 맞추기 시작할 때 발생합니다.
예를 들어, 사람이 나이와 소득에 따라 제품을 구매할지 여부를 예측하는
러닝머신 모델을 구축한다고 가정해 보자.
연령, 소득 및 제품 구매 여부가 포함된 1000개의 관찰 데이터 세트가 있다.
이 데이터 세트를 학습 세트와 테스트 세트로 분리한다.
결정 트리 알고리즘을 사용하여 훈련 세트에서 모델을 학습한다.
모델은 훈련 데이터의 잡음에 맞는 복잡한 결정 규칙을 생성하여
훈련 세트에서 높은 정확도를 달성할 수 있다.
그러나 테스트 세트에서 모델을 평가할 때 성능이 좋지 않아
훈련 데이터에 과적합되어 새 데이터에 잘 일반화할 수 없음을 나타낸다.
과적합을 방지하기 위해서는
교차 검증, 정규화 및 조기 중지와 같은 기술을 사용할 수 있다.
교차 유효성 검사에는 데이터를 여러 교육 및 테스트 세트로 분할하고
각 세트에서 모델을 교육하여 보다 정확한 성능 추정치를 얻는 작업이 포함된다.
정규화에는 지나치게 복잡한 결정 규칙을 생성하지 못하도록
모델의 비용 함수에 페널티 항을 추가하는 작업이 포함된다.
조기 중지는 유효성 검사 손실을 모니터링하여 모델이 과적합되기 전에 교육 프로세스를 중지하는 것이다.
모델에서 과적합을 설명할 수 있는 코드의 예시이다.
두 개의 특성 'x'와 'y'가 있는 데이터 세트와 포인트가
클래스 0 또는 클래스 1에 속하는지 여부를 나타내는 이진 대상 변수 'z'가 있다고 가정해 보자.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeClassifier
# Generate a synthetic dataset with two features and a binary target variable
np.random.seed(42)
X = np.random.rand(1000, 2)
y = np.zeros(1000)
y[(X[:, 0] < X[:, 1] ** 2) & (X[:, 0] > 0.5)] = 1
# Split the dataset into training and test sets
X_train, y_train = X[:800], y[:800]
X_test, y_test = X[800:], y[800:]
# Fit a decision tree model on the training set
depths = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
train_scores, test_scores = [], []
for depth in depths:
model = DecisionTreeClassifier(max_depth=depth)
model.fit(X_train, y_train)
train_scores.append(model.score(X_train, y_train))
test_scores.append(model.score(X_test, y_test))
# Plot the training and test scores as a function of tree depth
plt.plot(depths, train_scores, label='Training score')
plt.plot(depths, test_scores, label='Test score')
plt.xlabel('Tree depth')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
이 코드에서는 두 가지 기능과 이진 대상 변수가 있는 합성 데이터 세트를 생성하고
데이터 세트를 훈련 및 테스트 세트로 분할하고
결정 트리 모델을 훈련 세트에 맞춘다.
트리의 최대 깊이를 2에서 20으로 변경하고
트리 깊이의 함수로 훈련 및 테스트 점수를 플로팅
이 코드를 실행하면 트리의 깊이가 증가함에 따라 모델의 성능이 어떻게 변하는지 보여주는 플롯을 얻는다.
훈련 정확도가 증가함에 따라 트리 깊이가 증가함에 따라
모델이 더 복잡해지고 훈련 데이터에 과적합되기 시작하는 것을 볼 수 있다.