세조목

머신러닝 - 데이터 분리(feat. 과적합)(24.02.01) 본문

데이터 분석 공부/머신러닝

머신러닝 - 데이터 분리(feat. 과적합)(24.02.01)

세조목 2024. 2. 1. 21:27

1.  과(대)적합

과대적합이란
데이터를 너무 과도하게 학습한 나머지 해당 문제만 잘 맞추고
새로운 데이터를 제대로 예측 혹은 분류하지 못하는 현상
을 의미한다.

위 이미지의 첫번째 경우가 과(대)적합의 예시인데
주어진 데이터를 너무 과도하게 학습한 결과
위 예시와 같은 경우의 문제는 잘 맞추지만
나머지 문제들은 예측(or 분류)할 수 없게된다.
 
과(대)적합이 있다면 과(소)적합도 있을텐데
위 이미지의 가장 오른쪽 예시가 과(소)적합에 해당한다.
과(대)적합이 주어진 데이터를 너무 과도하게 학습한 결과라면
과(소)적합은 반대로 주어진 데이터를 충분히 학습하지 못함에 따른 결과다.
데이터가 충분하지 않거나, 모형이 지나치게 단수할 때 이런 과(소)적합이 발생한다.
 
 

2. 데이터 분할

어떻게 이 문제를 해결할 수 있을까?
답은 바로 데이터를 나누어서 학습시키는 것이다.
 

 
Train data를 가지고 우선 학습을 진행하고,
그 모델을 가지고서 Test Data를 평가하는 것이다.
 
Train, Test 데이터셋을 만드는데 사용되는 함수, 파라미터, 그리고 반환 값은 아래와 같다.

함수
sklearn.model_selection.train_test_split-
파라미터
test_size테스트 데이터 세트 크기
train_size학습 데이터 세트 크기
shuffle데이터 분리 시 섞기
random_state호출할 때마다 동일한 학습/테스트 데이터를 생성하기 위한 난수 값으로 수행할 때마다 동일한 데이터 세트로 분리하기 위해 숫자를 고정시킬 필요가 있음
반환값
X_train-
X_test-
y_train-
y_test-

머신러닝에서의 파라미터'알아서 정해지는 값' 의 의미로
python에서의 파라미터(매개변수)와는 다른 의미다.
 
데이터 분리 예시는 아래와 같다.
이 예시에서 train data set에서의
x변수(독립변수)는 'Fare', 'Sex'이고,
y변수(종속변수)는 'Survived'다.
 

from sklearn.model_selection import train_test_split

우선 데이터 분리에 필요한 'sklearn.model_selection' 라이브러리를 불러온다.

X_train, X_test, y_train, y_test = train_test_split(titanic_df[['Fare', 'Sex']], titanic_df[['Survived']], test_size = 0.3, shuffle=True, random_state = 42, stratify=titanic_df[['Survived']])
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
>>> (623, 2) (268, 2) (623, 1) (268, 1)

그런 다음 위와같이 코드를 입력해주면
전체 891개였던 데이터가 623개, 268개로 나눠진 것을 확인할 수 있다.
여기서 test_size에 0.3을 넣어주는건 원데이터를 7:3으로 나누겠다는 의미이고
random_state에 42를 넣는 이유는 일반적으로 42를 넣기때문이다.