일반화, 과대/과소적합에 대한 내용을 정리한 페이지입니다.
하나의 관측치에만 과하게 학습하여 다른 데이터가 들어왔을 때 부정확한 값을 내뱉는 것
train GOOD / test(new data) BAD
즉, “train 에 대해서 너무 과하게 학습되어 train 데이터에만 잘 동작하고 test 에서는 예측 성능이 저하되는 현상”
→ 지양해야 하는 학습법!
너무 간단하게 학습 시켜버림!
train BAD / test(new data) BAD
즉, “train 데이터를 충분히 반영하지 못해 train, test 데이터 모두 예측 성능이 저하되는 현상 (학습을 제대로 하지 못한 것)”
→ 지양해양 하는 학습법!
train 데이터로 학습한 모델이 test 데이터에 대해서도 정확히 예측하는 현상
→ 지향해야 하는 학습법! 우리의 목표!
목표: “일반화 성능이 최대화 되는 모델을 찾는 것”

train_test_split(X, y, **stratify=y**) y의 비율을 맞춰 줌으로써 클래스 불균형 해결 한쪽 클래스가 너무 쏠려있는 경우, 해당 클래스에 대해서만 과대적합됨!# train, test 정확도 담을 list
train_list = []
test_list = []
n_set = range(1,51) # 1~50 까지 1씩 증가하는 수
# 학습~평가 반복
for k in n_set:
# model 객체 생성
knn_tmp = KNeighborsClassifier(n_neighbors=k)
# model 학습
knn_tmp.fit(X_train, y_train)
# model 예측 및 평가
accu_train = knn_tmp.score(X_train,y_train)
accu_test = knn_tmp.score(X_test,y_test)
# 정확도 저장
train_list.append(accu_train)
test_list.append(accu_test)
import matplotlib.pyplot as plt
plt.figure(figsize=(8,3)) # 캔버스 크기 결정 -> 가장 상단에 작성
plt.plot(n_set, train_list, label='train accu')
plt.plot(n_set, test_list, label='test accu')
plt.legend() # 범례 표시
plt.xlabel('n_neighbors') # X축 이름
plt.ylabel('accuracy') # Y축 이름
plt.xlim((1,10))
plt.ylim((0.96,1))
plt.grid() # 눈금 표시 -> 모눈종이 형태로 출력
plt.show() # print 역할
