Python 튜토리얼

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

2021.07.29 11:57 4,726 Views

이번 시간에는 교차검증 실습을 진행하겠습니다.


지난 시간에는 교차 검증의 정의와, 반복문으로 train-valid로 나누는 방법을 알아보았습니다.

이번 시간에는 그 실습을 진행하겠습니다.


이번 시간의 내용을 위의 이미지와 함께 정리하면 다음과 같습니다.


  1. K-Fold를 이용해서 Train과 Valid Data를 나눈다.
  2. Model을 이용해서 train 데이터를 학습한다.
  3. Model을 이용해서 valid 데이터를 예측해 성능을 확인한다.
  4. Model을 이용해서 test 데이터를 예측한다.
  5. n_splits를 5로 설정한다면, 5개의 결과값들에 대한 “최빈값”을 이용해 가장 등장할 가능성이 높은 결과값으로 결정한다.
  6. 결과를 제출한다.


코드로 가시죠.

--------------------------------------------------------------------------------------------------------------------------

# "X"라는 변수에 train의 "index"와 "quality"를 제외하고 지정해 주세요

# "y"라는 변수에는 "quality"를 지정해 주세요

X = train.drop(columns = ['index','quality'])

y = train['quality']


# "kf"라는 변수에 KFold를 지정해 줍시다.

# n_splits는 5, shuffle은 True, random_state는 0으로 설정해주세요

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


# "model"이라는 변수에 RandomForestClassifier를 지정해 줍시다.

# valid_scores라는 빈 리스트를 하나 만들어줍시다.

# test_predictions라는 빈 리스트를 하나 만들어 줍시다.

model = RandomForestClassifier(random_state = 0)

valid_scores = []

test_predictions = []


# 지난 시간에 다루었던 kf.split()을 활용해, 반복문으로 X_tr, y_tr, X_val, y_val을 설정해봅시다.

for train_idx, valid_idx in kf.split(X,y) : 

 X_tr = X.iloc[train_idx]

 y_tr = y.iloc[train_idx]

 X_val = X.iloc[valid_idx]

 y_val = y.iloc[valid_idx]


# 앞의 문제에 이어서 반복문 속에서 model.fit(X_tr, y_tr)을 활용해 모델을 학습해봅시다

for train_idx, valid_idx in kf.split(X,y) : 

  X_tr = X.iloc[train_idx]

  y_tr = y.iloc[train_idx]

  X_val = X.iloc[valid_idx]

  y_val = y.iloc[valid_idx]

  model.fit(X_tr, y_tr)


# 앞의 문제에 이어서 반복문 속에서 "valid_prediction"이라는 변수에 model.predict(X_val)의 결과를 저장해 봅시다. 

for train_idx, valid_idx in kf.split(X,y) : 

  X_tr = X.iloc[train_idx]

  y_tr = y.iloc[train_idx]

  X_val = X.iloc[valid_idx]

  y_val = y.iloc[valid_idx]

  model.fit(X_tr, y_tr)

  valid_prediction = model.predict(X_val)


# 앞의 문제에 이어서 반복문 속에서 accuracy_score를 이용해, 모델이 어느정도의 예측 성능이 나올지 확인해봅시다.

# 그리고 "valid_prediction"의 점수를 scores에 저장 해봅시다. 

# 반복문에서 빠져나온 후에 np.mean()을 활용해 평균 점수를 예측해봅시다.

for train_idx, valid_idx in kf.split(X,y) : 

  X_tr = X.iloc[train_idx]

  y_tr = y.iloc[train_idx]

  X_val = X.iloc[valid_idx]

  y_val = y.iloc[valid_idx]

  model.fit(X_tr, y_tr)

  valid_prediction = model.predict(X_val)

  score = accuracy_score(y_val, valid_prediction)

  valid_scores.append(score)

  print(score)

print('평균 점수 : ', np.mean(valid_scores))


# 이제 어느정도의 성능이 나올지 알게 되었으니, 반복문 속에서 test를 예측해 "test_prediction"이라는 변수에 지정해봅시다.

# test_prediction을 지정했다면, "test_precitions"라는 빈 리스트에 넣어줍시다.

for train_idx, valid_idx in kf.split(X,y) : 

  X_tr = X.iloc[train_idx]

  y_tr = y.iloc[train_idx]

  X_val = X.iloc[valid_idx]

  y_val = y.iloc[valid_idx]

  model.fit(X_tr, y_tr)

  test_prediction = model.predict(test.drop(columns = ['index']))

  test_predictions.append(test_prediction)


# 이제 결과 값을 만들어 보겠습니다.

# "test_precitions"를 Data Frame으로 만들어주세요

test_predictions = pd.DataFrame(test_predictions)


# DF.mode()를 활용해 열별 최빈값을 확인하고, "test_prediction"이라는 변수에 지정해봅시다.

# "test_prediction"의 첫 행을 최종 결과값으로 사용합시다.

test_prediction = test_predictions.mode()

test_prediction = test_predictions.values[0]


# data의 sample_submission 파일을 불러와 "quality"라는 변수에 "test_precition"을 저장해줍시다.

# 그 이후에는, "data/submission_KFOLD.csv"에 저장하고, 제출해봅시다.

sample_submission = pd.read_csv('data/sample_submission.csv')

sample_submission['quality'] = test_prediction

sample_submission.to_csv('data/submission_KFOLD.csv', index=False)

--------------------------------------------------------------------------------------------------------------------------



[Colab 실습 링크]


↩️ 오늘의 파이썬 리스트

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



로그인이 필요합니다
0 / 1000
그린티
2021.09.08 20:48

done

세라자데
2021.09.09 14:57

done

DSJY
2021.09.13 18:05

phu
2021.09.14 21:55

# "test_prediction"의 첫 행을 최종 결과값으로 사용합시다.
test_prediction = test_predictions.mode()
test_prediction = test_predictions.values[0]

이 부분에서 아래 부분이 test_prediction.values[0]이 되어야 하지 않나요?
설명에 나온 대로 변수를 바꿨더니 정확도가 올랐습니다. 0.675 - > 0.694

Dozi
2022.07.24 01:59

맞네요 s를 붙이면 5개의 모델 중 1번째 모델이 예측한 결과만 반환하는 것과 같아서 교차검증을 하는 의미가 사라집니다.
앞에서도 중요하게 틀리는 포인트들이 종종 있는데 이정도면 긴장감을 주려고 일부러 해두신 느낌..

폴밴
2022.09.05 16:21

그냥 지나칠뻔 했는데 맞네요...

매미인턴
2021.09.16 09:32

다욤
2021.09.19 14:54

찬찬이
2021.09.25 12:02

Holte
2021.09.30 21:19

changhyeon
2021.10.09 18:05

done

왼쪽눈썹왁싱
2021.10.31 10:27

yulia.
2021.12.04 18:31

sotanfdl
2021.12.21 21:28

moran
2021.12.27 17:39

도톤
2021.12.27 20:11

hijihyo
2022.01.23 16:23

호랭이띠
2022.01.29 19:34

done

하랴랴
2022.03.02 17:14

done

ChimChim
2022.03.07 03:37

acebed
2022.03.10 18:00

done

kimgugu
2022.03.27 11:21

비회원
2022.04.05 21:24

Kdata
2022.04.19 10:17

khloee
2022.05.26 15:23

Y2J
2022.07.08 19:46

MINKYU
2022.07.22 02:02



skanehfud279
2022.09.28 11:04

엿장수
2022.10.12 23:19

gnt0000
2022.10.31 18:13

done

sk100
2022.11.03 14:30

done

히히로켓발사
2022.12.29 05:08

카르루알룰
2023.01.06 10:55

done!

abcd123
2023.01.10 16:13

kfold도 앙상블의 종류라고 볼수 있나요?

이대권
2023.01.10 17:27

제가 이해한 바로는 Kfold는 검증법입니다.

NN_is_all_you_need
2023.01.10 17:51

K-fold는 검증 방법 중의 하나입니다.
가장 무난한 방법은 학습 데이터에서 일부를 검증 데이터로 분할해서 테스트 데이터와 같이 모델 학습에도 사용하지 않고, 실제 테스트 데이터의 환경과 동일하게 취급해서 분할한 검증 데이터로부터 모델 성능을 측정하는 방법이 있는데요,
이는 학습 데이터 중 일부를 분할하고 검증에만 사용하기 때문에 학습 데이터의 손실이 따른다는 단점이 있습니다.
여러 이유가 있겠지만, 위와 같은 이유로도 k-fold 검증을 많이 사용하기도 합니다.
왜냐하면 결국 k-fold 검증을 사용하면 k개의 학습된 모델을 얻을 수 있는데, 이 k개의 모델들을 앙상블을 하면 전체 학습 데이터셋을 사용한 것과 같기 때문입니다.
때문에 k-fold 검증 이후 필연적으로 앙상블을 해야 한다고 생각이 들 수도 있고, 질문 주신 것과 같이 k-fold가 앙상블 종류 중에 하나인가? 라는 생각이 들 수도 있겠지만, 본질적으로 k-fold는 검증 방법의 하나입니다.

이대권
2023.01.10 17:58

감사합니다. 저는 이해가 되었습니다.

abcd123
2023.01.13 09:38

앙상블 공부하고있었는데 비슷한거같아서 질문했던거였는데 두분다 정말 감사합니다!

highllight
2023.01.16 17:10

김시옷
2023.05.29 01:31

done+