[zerobase_데이터 취업스쿨_스터디노트] 38. 데이터나누기2 - 데이터분리

김소희·2024년 1월 22일
0

study_note

목록 보기
39/50

데이터 분리

과적합 여부를 판정해보는 방법 .. 데이터를 분리해서 사용하는 것 !

전체데이터에서 훈련데이터셋/테스트데이터셋 을 나누는 것이 최소이고,
그러나 , 테스트를 하기전 훈련데이터를 다시 나누어서 일부를 Validation 용으로 (검증용) 으로 사용한다.
이것은 내가 가진 데이터를 가지고 과적합을 막을 수 있고 일반화된 성능을 확보하기 위해 나누어서 사용하는 이유이다.

그럼 이번에는 데이터를 나눈 후 훈련/검증/테스트 까지 시켜보는 과정을 해보겠다.

from sklearn.datasets import load_iris
import pandas as pd

iris = load_iris()
from sklearn.model_selection import train_test_split

features = iris.data[:, 2:] # petal length and width (평면에 그리려고 2개만 사용)
labels = iris.target

X_train.shape, X_test.shape

데이터셋이 잘 나뉘어진 것을 확인 했다. 항상 이 과정에서 확인해주어야 하는 것이 바로 unique 검사이다.

import numpy as np 

np.unique(y_test, return_counts=True) # 0, 1, 2가 각각 10개씩 있음

(array([0, 1, 2]), array([ 9, 8, 13], dtype=int64))

비율이 1:1:1 이 아닌 0.9:0.8:1.3 이 들어갔다. 이게 문제는 아니지만 일반적으로 1:1:1 로 맞춰주는 것이 좋긴하다.

그럴 때 쓸 수 있는 것이 stratify 옵션 이다.

X_train, X_test, y_train, y_test = train_test_split(features, labels,
                                                    test_size=0.2, 
                                                    stratify=labels, # 레이블의 비율을 맞춰줌
                                                    random_state=13)

stratify 옵션을 추가하고 다시 확인해보니 테스트셋에 iris 3종이 10개씩 들어간 것을 확인할 수 있다.
(클래스별 분포를 맞춰주었다.)

max_depth

max_depth 가 높을수록 트리의 깊이가 깊어지는건데 이 또한 과적합의 원인이 될 수 있기 때문에 조절을 잘 해줘야 한다.

from sklearn.tree import DecisionTreeClassifier

iris_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
iris_tree.fit(X_train, y_train) # 학습

학습을 다시 시켜준다.

테스트를 진행하기 전, 모델의 모양을 다시 살펴보자.

from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 7))
plot_tree(iris_tree);

이제 정확도를 계산해보자

from sklearn.metrics import accuracy_score

y_pred_tr = iris_tree.predict(X_train)
accuracy_score(y_train, y_pred_tr) # 0.95

결정경계 확인

from mlxtend.plotting import plot_decision_regions

plt.figure(figsize=(14,8))
plot_decision_regions(X=X_train, y=y_train, clf=iris_tree, legend=2)
plt.show() # 결정경계를 그림

전보다 결정경계가 깔끔하다. 물론 틀린 부분이 있긴하지만 과적합이 되는 것 보다는 낫다.

테스트

y_pred_test = iris_tree.predict(X_test)
accuracy_score(y_test, y_pred_test) # 0.9666666666666667

train 데이터보다 test 데이터의 accuracy 가 더 높아지는 경우는 거의 드물지만 이 경우는 iris 데이터기 때문에 그렇다.
accuracy 값에 너무 좌지우지 되지 말자.
그러나 여기서 중요한 부분은 trian 데이터의 accuracy 근처로 test 데이터도 나왔으니 내 데이터에서는 과적합이 나지 않았다고 판단해 볼 수도 있다.

테스트 데이터 결정경계

from mlxtend.plotting import plot_decision_regions

plt.figure(figsize=(14,8))
plot_decision_regions(X=X_test, y=y_test, clf=iris_tree, legend=2)
plt.show() # 결정경계를 그림

하나 틀린 것은 중요하지 않다.
과적합이 보이지 않는다는 것이 중요하다.

테스트 데이터 그리기

scatter_highlight_kwargs = {'s': 150, 'label':'Test data', 'alpha':0.9} # 테스트 데이터를 표시하기 위한 옵션
scatter_kwargs = {'s': 120 ,'edgecolor': None, 'alpha':0.9}


plt.figure(figsize=(14,8))
plot_decision_regions(X=features, y=labels,
                      X_highlight=X_test,
                      clf=iris_tree,
                      legend=2,
                      scatter_highlight_kwargs=scatter_highlight_kwargs,
                      scatter_kwargs=scatter_kwargs,
                      contourf_kwargs={'alpha': 0.2}
                      ) # 등고선의 투명도)
                       

profile
AI 개발자로 가는 길 두렵지 않아요

0개의 댓글