기록하는삶

[파이썬/python] 머신러닝 데이터 분할(예비법, 교차검증) 본문

AI/파이썬(Python)

[파이썬/python] 머신러닝 데이터 분할(예비법, 교차검증)

mingchin 2021. 9. 22. 00:49
728x90
반응형

머신러닝을 위한 데이터 정제 과정에서 여러 데이터 분할 방법이 존재하는데, 그 중 두 가지를 정리해보자.

1) 예비법(Hold-out)

> 전체 데이터를 겹치지 않는 두 데이터 집합, 훈련용(training set)과 시험용(testing set)으로 나누는 방법

> 비복원추출

> sklearn.model_selection의 train_test_split 모듈 이용

> parameters

parameters default 의미 / 조건
*arrays   list, nparray, scipy-saprse, pd.DataFrame 가능
test_size None(0.25) 시험용 set의 비율 or 크기
실수(float): 0 ~ 1 (전체 중 시험용 set이 차지하는 비율)
정수(int): 시험용 set의 크기 (n개)
train_size와 함께 None이면 0.25가 default 값
train_size None(0.75) 훈련용 set의 비율 or 크기
실수(float): 0 ~ 1 (전체 중 훈련용 set이 차지하는 비율)
정수(int): 훈련용 set의 크기 (n개)
test_size와 함께 None이면 0.75가 default 값
random_state None 랜덤 추출의 시드. None을 주면 실행 시마다 추출이 새로 바뀌고, 특정 정수로 고정하면 해당 랜덤 추출을 고정하여 기억한다.
ex) random_state = 10
stratify None 특정 array의 class로 계층화하여 추출(Stratified KFold처럼)
ex) stratify = iris_df['label']
shuffle True 분할 전 데이터를 섞을 지 여부.
shuffle = False를 입력하려면 stratify = None 이어야한다.
import pandas as pd
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

# 데이터 로드 후 데이터프레임에 넣기
iris = load_iris()
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_df['label'] = iris.target
iris_df.head()

# 독립변수와 종속변수 구분
X = iris_df.iloc[:, :4]
y = iris_df['label']

# 학습용 데이터와 테스트용 데이터로 나눔
X_train, X_test, y_train, y_test = train_test_split(X, y)

# 각 학습용, 훈련용 데이터의 비율 확인
len(X_train) / len(iris_df), len(X_test) / len(iris_df)

2) 교차검증(Cross Validation)

> 예비법을 여러 번 반복 수행하며 모델의 정확성, 효율성 등을 비교 검증

> 예비법과 달리 k-fold CV 등을 이용, 데이터 셋을 훈련용과 시험용으로 구분하는 방법이 랜덤하지 않고 규칙적(k-fold: 순서대로 k등분, stratified k-fold: 계층적으로 k 등분 -> iris 데이터처럼 class가 존재하는 경우 이 방법이 더 좋다)

> 데이터의 분포에 따라 k 값에 유의하거나, stratify 하는 것을 고려해야 한다.

> sklearn.model_selection의 cross_validate 모듈 이용

> parameters

parameters default 의미 / 조건
estimator   어떤 모델을 사용해 fit(학습)할 것인가
ex) DecisionTreeClassifier(random_state=10)
X   학습(fit) 시킬 데이터
list, nparray, pd.DataFrame 등 가능
y None 예측하고자 하는 target variable
지도학습의 경우 넣어준다
scoring None 원하는 평가 지표(scoring parameter) 설정.
여러 개를 원하면 리스트 형태로 넣어줄 수 있다.
None이면 estimator의 score method가 사용된다.
ex) 분류시 'accuracy', 'balanced_accuracy', 'f1' 등
return_train_score False 반환되는 결과(return)에 train_score를 포함할지 여부
과적합/부적합 여부 파악에 도움이 될 수 있으나
계산이 오래 걸릴 수 있고, 필수적이지는 않다.
return_estimator False 반환되는 결과(return)에 어떤 estimator를
사용했는지를 포함할지 여부
import pandas as pd
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

# 데이터 로드 후 데이터프레임에 넣기
iris = load_iris()
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_df['label'] = iris.target
iris_df.head()

# 독립변수와 종속변수 구분
X = iris_df.iloc[:, :4]
y = iris_df['label']

from sklearn.model_selection import cross_validate
model = DecisionTreeClassifier(random_state=10)

# cv는 몇 번 fold 할지를 결정한다. model이 분류에 사용되는 경우 StratifiedKFold, 예측에 사용되는 경우 KFold를 한다.
scores = cross_validate(model, X, y, cv=3, return_train_score = True, return_estimator=True)
sorted(scores.keys())

# scores['test_score'] 를 이용해 test_score만 확인하거나
# scores['estimator'][0] 를 통해 어떤 estimator를 사용했는지 확인 가능

scores

 

728x90
반응형