기록하는삶
[파이썬/python] 머신러닝 데이터 분할(예비법, 교차검증) 본문
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
반응형