• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    해결됨

[질문] 파이썬 머신러닝 완벽 가이드 교차검증-2 강의내용

23.02.24 18:50 작성 조회수 261

1

for train_index, test_index in kfold.split(features):

# kfold.split( )으로 반환된 인덱스를 이용하여 학습용, 검증용 테스트 데이터 추출

X_train, X_test = features[train_index], features[test_index]

y_train, y_test = label[train_index], label[test_index]

 

제가 이 코드를 이해한 순서대로 써보겠습니다.

  1. kfold.split(features)를 하게 되면 feature값을 k개의 fold로 split 해줌

  2. for문에 의해 train_index, test_index가 그 fold를 순회하면서 인덱스를 받음(?)

이정도까지 이해했는데 제가 이해한바로는 150개의 feature를 5개의 fold로 나누고 f f f f f

그 나눠진 f 하나마다 70% train, 30% test로 다시 나눠지는 걸로 이해했는데 for문을 저렇게쓰면 어떻게 인덱스가 매겨지는지 도무지 이해가 잘 안됩니다...

첫번째 fold에서 21개의 train(0~19), test(20~29) 이렇게 나눠지고

두번째 fold에서 21개의 train(30~49), test(50~59) 이런식으로 된다는건지...

파이썬에 대한 이해부족인 것 같아서 For문에서 변수2개인 상황을 검색해봤는데 그거랑 이거랑은 Kfold 때문에 매치가 잘안되는상황입니다.

답변부탁드립니다!

답변 1

답변을 작성해보세요.

1

안녕하십니까,

먼저 아래 코드에서

for train_index, test_index in kfold.split(features):

# kfold.split( )으로 반환된 인덱스를 이용하여 학습용, 검증용 테스트 데이터 추출

X_train, X_test = features[train_index], features[test_index]

y_train, y_test = label[train_index], label[test_index]

  1. kfold.split(features)를 하게 되면 feature값을 k개의 fold로 split 해줌

    =>for train_index, test_index in kfold.split(features) 하게 되면 feature 값을 k개의 fold로 split을 한다기 보다는, features 데이터 세트의 index값을 학습과 검증 데이터 세트를 접근할 수 있는 index 값들을 train_index, test_index로 나누어서 분할해 줍니다.

     

    그러니까 features 데이터 세트가 150개의 데이터(레코드)가 있다고 하겠습니다.

    이를 배열로 접근하려면 0번 index부터 149번 index까지 150개의 index가 있으면 배열로 접근 할 수 있습니다. 이 접근 할 수 있는 index를 train_index, test_index로 나누어 주는데, 5 fold라고 한다면 train_index에 0, 1, 2, 3, 4, .......... 119 index까지 해서 120개의 index를 반환해 주고, test_index에 120, 121, 122,..... 149 index까지 해서 30개의 index를 반환해 줍니다.

     

    이렇게 반환된 index를 기반으로 아래와 같이 feature 데이터세트를 학습과 검증 데이터 세트로 나눌 수 있습니다.

    X_train, X_test = features[train_index], features[test_index]

     

    train_index가 120개의 index값을 가지고 있으므로 features[train_index]는 해당 index위치에 있는 120개의 features 데이터를 가져 올 수 있습니다. 마찬가지로 features[test_index]는 해당 index 위치에 있는 30개의 features 데이터를 가져 올 수 있습니다. 이 부분이 이해가 안되시면,

    초반 강의의 넘파이 ndarray 인덱싱(Indexing) 이해 부분을 참조 부탁드립니다.

     

  2. for문에 의해 train_index, test_index가 그 fold를 순회하면서 인덱스를 받음(?)

    => 1에서 언급한 방식을 K fold로 지정된 횟수만큼 반복하면서 train_index와 test_index값을 번갈아 받으면서 5번 동안 서로 다른 train과 test 데이터 세트를 추출하게 됩니다.

혹 이해가 안되시는 부분이 있으면 다시 글 부탁드립니다.

 

감사합니다.

 

image<사진1>

답변 주신 거 토대로 매치해봤습니다. 120,30 확인했습니다.

image<사진2>

image<사진3>

 

 


저는 <사진2>처럼 인덱스가 교차로 생겨야하는 줄 알았는데 한번에 0~119, 120~149 로 자동으로 나눠지나보네요? 헷갈린 이유가 <사진3> 처럼 for문에 변수가 2개이면 하나는 인덱스, 하나는 값으로 매칭이 돼야 하는데

지금의 코드인
for train_index, test_index in kfold.split(features): 는 뭔가 형태가 둘다 인덱스로 들어가버리니까 자료구조형태가 매치가 안돼서 이해가 안되는 상황이었거든요. 이 부분에 대해서만 해결이 되면 이해가 될 것 같은데 한번 더 설명해주실 수 있을까요?

  1. 저는 <사진2>처럼 인덱스가 교차로 생겨야하는 줄 알았는데 한번에 0~119, 120~149 로 자동으로 나눠지나보네요?

=> 네, 사진2는 교차에 대한 설명을 쉽게 하기 위해서 예시를 든 것이고, 사진2와 같이 순차적으로 교차되지 않을 수 있습니다. 분명한건 교차적으로 데이터를 만들 수 있습니다.

  1. 헷갈린 이유가 <사진3> 처럼 for문에 변수가 2개이면 하나는 인덱스, 하나는 값으로 매칭이 돼야 하는데 지금의 코드인
    for train_index, test_index in kfold.split(features): 는 뭔가 형태가 둘다 인덱스로 들어가버리니까 자료구조형태가 매치가 안돼서 이해가 안되는 상황이었거든요.

=> 사진3에서는 enumerate() 구문을 사용하셨는데, 이건 kfold.split()과 동작하는 방식이 다릅니다. enumerate(데이터세트)를 for loop로 적용하면 데이터 index와 데이터 값이 출력이 되지만 kfold.split()는 학습과 검증용 index 세트를 반환하게 됩니다.

 

답변 감사합니다 >.<