인프런 커뮤니티 질문&답변

인공지능님의 프로필 이미지
인공지능

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

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

해결된 질문

작성

·

353

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 세트를 반환하게 됩니다.

 

인공지능님의 프로필 이미지
인공지능
질문자

답변 감사합니다 >.<

인공지능님의 프로필 이미지
인공지능

작성한 질문수

질문하기