과적합 대 과소적합: 모델링 전쟁
소개
기계 학습 모델을 만들 때 과대적합 및 과소적합이 핵심 개념입니다. 과소적합 모델을 사용하면 데이터의 주요 기능을 포착하지 못하고 교육 및 테스트 세트 모두에서 제대로 수행되지 않는 반면, 과적합 모델을 사용하면 교육 데이터에는 좋아 보이지만 테스트 데이터에는 적합하지 않습니다. 좋은 예측을 반환하는 모델을 만들려면 이 둘 사이의 균형을 찾아야 하므로 이러한 개념을 살펴보겠습니다.
몇 가지 예를 제공하기 위해 몇 가지 시각적 개체를 코딩할 것이므로 여기를 따라하고 싶다면 내가 사용하고 있는 라이브러리와 데이터가 있습니다.
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
데이터를 생성하기 위해 2차 공식을 사용하여 임의의 점을 생성한 다음 실제 데이터를 (점으로) 복제하는 데 도움이 되도록 데이터에 약간의 노이즈를 생성할 것입니다.
np.random.seed(14)
x = np.random.uniform(0, 11, 20)
x = np.sort(x)
y = (-x+4) * (x-9) + np.random.normal(0, 3,20)
언더피팅
이제 우리가 보는 것을 살펴볼 수 있도록 시각적 언더피팅을 만들어 보겠습니다. 이를 위해 데이터를 교육 및 테스트 세트로 분할한 다음 선형 모델을 데이터에 맞출 것입니다.
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.40, random_state=14)
reg = LinearRegression().fit(X_train.reshape(-1, 1), y_train)
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.scatter(X_train, y_train, color='blue',label='Train Data')
plt.plot(X_train.reshape(-1, 1), reg.predict(X_train.reshape(-1, 1)),label='Underfit Model')
plt.legend(loc=[0.17, 0.1])
plt.subplot(1, 2, 2)
plt.scatter(X_test, y_test, color='green',label='Test Data')
plt.plot(X_train.reshape(-1, 1), reg.predict(X_train.reshape(-1, 1)),label='Underfit Model')
plt.legend(loc=[0.17, 0.1]);
이제 위의 시각적 개체가 있으므로 모델이 실제로 x와 y 간의 관계 또는 일반적인 경우 데이터의 기능 간의 관계를 선택하지 않는다는 것을 알 수 있습니다. 과소적합의 좋은 점은 일반적으로 훈련 데이터의 성능 저하에서 볼 수 있다는 것입니다. 이는 모델이 데이터에 대해 충분히 복잡하지 않거나(여기의 경우와 유사) 기능이 너무 많기 때문에 발생할 수 있습니다. 과소적합을 설명하는 데 일반적으로 사용되는 또 다른 용어는 모델에 높은 편향이 있다는 것입니다. 저는 사람들이 자신의 관점과 일치하지 않는 데이터를 무시하는 것으로 생각하고 싶습니다.
과적합
이제 과적합을 보여주기 위해 2차 데이터 세트에 8차 다항식을 피팅해 보겠습니다.
poly = PolynomialFeatures(8)
x_fin = poly.fit_transform(X_train.reshape(-1, 1))
reg_poly = LinearRegression().fit(x_fin, y_train)
X_linspace = np.linspace(0, 11, 30)
X_linspace_fin = poly.fit_transform(X_linspace.reshape(-1,1))
y_poly_pred = reg_poly.predict(X_linspace_fin)
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.scatter(X_train, y_train, color='blue',label='Train Data')
plt.plot(X_linspace, y_poly_pred,label='Overfit Model')
plt.ylim(bottom=-50,top=20)
plt.legend(loc=[0.17, 0.1])
plt.subplot(1, 2, 2)
plt.scatter(X_test, y_test, color='green',label='Test Data')
plt.plot(X_linspace, y_poly_pred,label='Overfit Model')
plt.ylim(bottom=-50,top=20)
plt.legend(loc=[0.17, 0.1]);
과대적합은 위의 그래픽에서 볼 수 있듯이 조금 까다롭습니다. 훈련 세트(왼쪽)에서 데이터를 매우 잘 모델링하는 동안 테스트 세트에서는 포인트가 완전히 누락되었습니다. 이는 알고리즘이 높은 분산을 갖는 것으로 알려진 의도된 출력이 아닌 훈련 세트의 노이즈를 모델링하기 때문입니다. 과적합의 원인은 일반적으로 데이터 세트에 너무 복잡한 모델이 있는 것으로 추적할 수 있습니다. 이 경우에는 2차를 기반으로 하는 데이터 세트의 8차 다항식, 데이터에 이상치/오류가 있거나 그렇지 않음 충분한 데이터를 가지고 있습니다.
결론
최종 이미지를 위해 2차 다항식을 연결하여 모델이 어떻게 보여야 하는지 살펴보겠습니다.
poly = PolynomialFeatures(2)
x_fin = poly.fit_transform(x.reshape(-1, 1))
reg_poly = LinearRegression().fit(x_fin, y)
X_linspace = np.linspace(0, 11, 30)
X_linspace_fin = poly.fit_transform(X_linspace.reshape(-1,1))
y_poly_pred = reg_poly.predict(X_linspace_fin)
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.scatter(X_train, y_train, color='blue',label='Train Data')
plt.plot(X_linspace, y_poly_pred,label='Ideal Model')
plt.legend(loc=[0.17, 0.1])
plt.subplot(1, 2, 2)
plt.scatter(X_test, y_test, color='green',label='Test Data')
plt.plot(X_linspace, y_poly_pred,label='Ideal Model')
plt.legend(loc=[0.17, 0.1]);
이제 모델이 무작위 노이즈로 인해 교육 또는 테스트 세트에 데이터를 완벽하게 맞추지 못하는 동안 두 데이터 세트에 매우 잘 맞는 것을 볼 수 있습니다. 상반되는 문제의 원인을 살펴보고 있었다면 그것들이 정반대라는 것을 알아차렸을 것입니다. 모델의 복잡성을 증가시키는 동안 더 높은 분산을 갖게 되고 이를 낮추면 더 높은 편향을 갖게 됩니다. 이를 편향-분산 트레이드오프라고 하며 잘 수행된 기계 학습 모델을 생성하는 열쇠는 그 사이 어딘가에 있습니다.
Reference
이 문제에 관하여(과적합 대 과소적합: 모델링 전쟁), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/trossii/overfit-vs-underfit-the-modeling-war-1flc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)