Python 튜토리얼

Lv3 모델링 3/4 python 파이썬 교차검증

2021.07.28 09:40 5,571 조회

이번 시간에는 "교차검증"에 대해서 이야기해보겠습니다.


교차 검증을 이야기 하기 위해서는, Hold-out 에 대해서 먼저 이야기 해야 합니다.


Hold-out

Hold-out은 단순하게 Train 데이터를 (train, valid)라는 이름의 2개의 데이터로 나누는 작업입니다.

보통 train : valid = 8:2 혹은 7:3의 비율로 데이터를 나눕니다.

데이터를 이렇게 나누는 이유는 무엇일까요?

바로 예측 성능을 가늠해보기 위해서 입니다.

이미지를 통해서 추가 설명드리겠습니다.

Train이 train.csv를 통해서 불러온 데이터라면,

train은 Train의 거대한 데이터를 8:2로 쪼갠 큰 부분입니다.

test(=valid)는 Train의 거대한 데이터를 8:2로 쪼갠 작은 부분입니다.

모델이 80%의 데이터를 통해서 학습하고, 20%의 데이터를 예측한다면, 어느정도의 성능이 나올지 가늠할 수 있겠죠?


다만 Hold-out의 문제점은 데이터의 낭비입니다.

데이터 사이언스에 있어서, 데이터는 소중한 자원입니다.

하지만 단순하게 trian과 test로 분할하게 된다면, 20%의 데이터는 모델이 학습할 기회도 없이, 예측만하고 버려지게 됩니다.

그래서 "모든 데이터를 학습하게 해보자!"라는 생각에서 나온 것이 "교차검증", 즉 K-Fold입니다.


교차검증

K-Fold의 아이디어는 단순합니다.

"모든 데이터를 최소한 한 번씩 다 학습하게 하자!"

그래서 valid 데이터를 겹치지 않게 나누어 N개의 데이터셋을 만들어 냅니다.


만약 데이터셋을 5개로 만든다고 하면, (== valid size가 20%) 겹치지 않게 위와 같은 모양으로 만들 수 있습니다.

그리고 반복문을 통해서 1번부터 5번 데이터들에 들어갔다가 나오면서, 데이터를 모두 최소한 한번씩은 학습할 수 있겠죠?

자 여기까지가 교차검증에 대한 개념이었스니다.


그럼 이제 실습으로 들어가봅시다.

오늘은 교차검증을 불러와서 저장하는 방법까지 다루겠습니다.

==================================================================

# sklearn에 model_selection 부분 속 KFold를 불러와보세요

from sklearn.model_selection import KFold


# KFold에 n_splits = 5, shuffle = True, random_state = 0이라는 인자를 추가해 "kf"라는 변수에 저장해보세요

kf = KFold(n_splits = 5, shuffle = True, random_state = 0)


# 반복문을 통해서 1번부터 5번까지의 데이터에 접근해보세요

for train_idx, valid_idx in kf.split(train) :

  train_data = train.iloc[train_idx]

  valid_data = train.iloc[valid_idx]


# 추가 코드로, 아래의 이미지를 그려볼 수 있는 코드도 있으니, Colab으로 확인해보세요~

==================================================================


[Colab 실습 링크]


↩️ 오늘의 파이썬 리스트

#데이콘_101 #AI #머신러닝 #딥러닝 #파이썬 #파이선  #데이터분석 #데이터사이언티스트 #코랩 #Python  #colab #kaggle #pandas #numpy #sckit-learn # read_csv #hold-out #train_test_split #kfold #shuffle=True

로그인이 필요합니다
0 / 1000
세라자데
2021.09.05 19:07

done

그린티
2021.09.08 16:48

done..
하긴 했지만 뭘하고 있는지 잘 이해가 안되네,,ㅠㅠ

DSJY
2021.09.13 18:05

phu
2021.09.13 22:54

KFold(n_splits=5, shuffle=True, random_state=0)
데이터 5등분, random_state가 0인 난수 값을 사용해서 셔플(random_state 없으면 할 때마다 결과 값 변동)
기존 방식 -> train 80%, test 20%로 사용하면 test 20%는 학습에 사용 불가
KFold -> train 100%(검증 데이터 5번) 사용, test 20%로 예측

화이트퍼그
2022.04.22 22:43

어떻게 해야합니까?

매미인턴
2021.09.16 09:07

다욤
2021.09.19 14:11

찬찬이
2021.09.25 12:02

changhyeon
2021.10.09 11:43

done

왼쪽눈썹왁싱
2021.10.31 10:11

PYB
2021.11.07 12:22

done

yulia.
2021.12.04 00:11

sotanfdl
2021.12.14 23:40

도톤
2021.12.27 19:40

dbnoid
2022.01.18 19:49

hijihyo
2022.01.23 14:03

djffjdEndEkd
2022.01.29 16:17

done

호랭이띠
2022.01.29 19:22

done

들기름
2022.02.09 14:18

하랴랴
2022.03.01 16:23

done

ChimChim
2022.03.06 23:57

acebed
2022.03.10 18:00

done

하얀레몬
2022.03.18 18:22

done

kimgugu
2022.03.27 11:12

비회원
2022.04.05 19:37

구삼이돌격대
2022.04.08 16:38

추가코드에서 KFold 인자 설정할 때 random_state를 설정되어 있어 오류가 발생하네요.
shuffle = False인 경우 random_state가 설정되지 않아야 제대로 결과가 나오는 것 같습니다.

Kdata
2022.04.19 10:02

krooner
2022.05.19 15:41

JCCHOI
2022.06.22 12:38

구삼이돌격대님이 적어두신 것 처럼 기존 코드에서는 오류가 발생합니다.
KFold 에서 shuffle = False 로 하는 경우 random_state를 설정하지 않아야 오류 없이 실행됩니다.

기존 코드 ---------------------------------------------------------------
kf = KFold(n_splits = 5, shuffle = False, random_state = 0)

에러 ---------------------------------------------------------------------
ValueError: Setting a random_state has no effect since shuffle is False. You should leave random_state to its default (None), or set shuffle=True.

변경 코드 ---------------------------------------------------------------
kf = KFold(n_splits = 5, shuffle = False)

양현모든지쓸어버리겠다
2022.07.07 14:19

Y2J
2022.07.08 19:26

MINKYU
2022.07.22 01:41

skanehfud279
2022.09.27 10:36

엿장수
2022.10.12 22:45

gnt0000
2022.10.31 15:41

done

sk100
2022.11.02 11:40

done

savvyall
2022.11.30 16:51

done

카르루알룰
2023.01.06 10:44

done

highllight
2023.01.16 16:39

김시옷
2023.05.29 00:52

done+