
일반적으로 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번 하면 되는거~)
'자기계발 > Python' 카테고리의 다른 글
| [빅데이터분석기사] 10 하이퍼파라미터(Grid Search, Random Search) (0) | 2022.06.19 |
|---|---|
| [빅데이터분석기사] 09 데이터 정규화 (0) | 2022.06.19 |
| [빅데이터분석기사] 07 범주변수의 변환(원핫인코딩) (0) | 2022.06.17 |
| [빅데이터분석기사] 06 회귀문제 (0) | 2022.06.16 |
| [빅데이터분석기사] 05 분류문제 (0) | 2022.06.16 |