자기계발/Python

[빅데이터분석기사] 08 데이터셋 분할과 모델검증

호등 2022. 6. 18. 10:07
반응형

일반적으로 train 데이터셋과 test 데이터셋으로 구분하여 분석하지만,

모델 성능을 일반화하기 위해 교차검증과 검증데이터(valid data)를 추가로 두기도 한다.

 

1) 특성치(x), 레이블(y) 나누기

import warnings
warnings.filterwarnings("ignore")

import pandas as pd
data=pd.read_csv('Fvote.csv', encoding='utf-8')
data.head()

이전에 원핫인코딩을 했던 Fvote.csv 데이터셋을 불러와 데이터를 확인하는 작업이다.

#특성변수(X) 데이터셋 따로 분리
X=data[data.columns[0:13]]

#레이블(y) 변수 따로 분리
y=data[["vote"]]

특성변수(X)를 편한 방법으로 나눠주고, 레이블(y) 변수도 별도로 분리해준다.

 

2) train_test 데이터셋 나누기

#train-test 데이터셋 나누기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)
#train, test 데이터 비율은 7:3이 디폴트이다. 비율을 변경하고 싶다면
#train_test_split 안에 train_size=0.8 옵션을 추가할 수 있다.

print(X_train.shape)
print(y_train.shape)

train dataset과 test dataset 비율은 7:3으로 구분하는것이 기본 디폴트 값이다.

train_test_split() 옵션 안에 train_size=0.8등 비율을 설정하여 이 비율을 임의적으로 조정하는 것도 가능하다.

 

3) 모델 적용

#모델 적용
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()



#랜덤 없는 교차검증 : cross_val_score
#데이터셋의 순서 있는 그대로 나눔

from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X_train, y_train, cv=5)

print("5개 테스트 셋 정확도:", scores)
print("정확도 평균:", scores.mean())

#랜덤 있는 교차검증 : K-Fold

from sklearn.model_selection import KFold
kfold = KFold(n_splits=5, shuffle=True, random_state=42)
score = cross_val_score(model, X_train, y_train, cv=kfold)

print("5개 폴드의 정확도:", score)

#임의분할 교차검증

from sklearn.model_selection import ShuffleSplit
shuffle_split = ShuffleSplit(test_size = 0.5, train_size = 0.5, random_state=42, n_splits = 5)
score = cross_val_score(model, X_train, y_train, cv=shuffle_split)

print(score.shape)
print("교차검증 정확도:", score)

#train_validity-test 분할과 교차검증
from sklearn.model_selection import train_test_split
X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, random_state=1)
X_train, X_valid, y_train, y_valid = train_test_split(X_train_val,y_train_val,random_state=2)

① 랜덤 없는 교차검증 : cross_val_score

train 데이터를 5개 그룹으로 쪼개고, 한 그룹을 뺀 4개의 그룹만 훈련을 한다. ( 이 과정을 5번 반복 )

교차검증은 'cross_val_score'을 이용하며, cv=5는 5번 교차검증을 한다는 의미이다.

 

② 랜덤 있는 교차검증 : K-Fold

cross_val은 데이터셋의 순서 그대로 그룹을 나눈다.

데이터의 순서에 편향이 존재한다면(예를 들어 연령 순으로 정렬되어 있다던지..) cross_val 사용이 문제가 될 수 있다.

K-Fold는 훈련데이터의 그룹을 나눌 때 랜덤하듯 섞는 방법을 말한다.

(n_splits로 그룹 수 지정)

 

③ 임의분할 교차검증

임의분할 교차검증은 훈련데이터와 테스트 데이터를 구성할 때 다른 교차검증에 사용되었던 데이터도 랜덤으로 선택되게 하는 방법이다. 몽땅 랜덤이기 때문에 한 번도 선택이 안되는 데이터가 있을 수도 있다. (cross_val, K-Fold는 한 번이라도 훈련에 사용된다는 차이가 있음)

 

→ 교재에 나온 임의분할 교차검증 예제 코드 결과로 5개가 나온다고 했는데, 나는 10개 나왔음. 공식 홈페이지에서 이 부분 정정 내용이 있는지, 데이터 자격증 카페에 같은 문제를 겪은 사람이 있는지 찾아보았으나 도통 찾을 수 없었음. 그래서 ShuffleSplit 옵션 안에 n_splits=5 지정해주었고, 교재에 나온 결과랑 수치 다르게 나왔음

 

4) train-validity-test 분할과 교차검증

#train_validity-test 분할과 교차검증
from sklearn.model_selection import train_test_split
X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, random_state=1)
X_train, X_valid, y_train, y_valid = train_test_split(X_train_val,y_train_val,random_state=2)

#모델 훈련
model.fit(X_train, y_train)
scores = cross_val_score(model, X_train, y_train, cv=5)
print("교차검증 정확도:", scores)
print("정확도 평균:", scores.mean())

model.score(X_valid, y_valid)
model.score(X_test, y_test)

valid data를 만드는 것은 정말 간단하다.

기존에 했던 것처럼 train data와 test data를 나눈 다음,

다시 train_test_split하여 train data를 valid data로 쪼개주면 된다. (train_test_split 총 2번 하면 되는거~)

 

반응형