해결된 질문
작성
·
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]
제가 이 코드를 이해한 순서대로 써보겠습니다.
kfold.split(features)를 하게 되면 feature값을 k개의 fold로 split 해줌
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]
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) 이해 부분을 참조 부탁드립니다.
for문에 의해 train_index, test_index가 그 fold를 순회하면서 인덱스를 받음(?)
=> 1에서 언급한 방식을 K fold로 지정된 횟수만큼 반복하면서 train_index와 test_index값을 번갈아 받으면서 5번 동안 서로 다른 train과 test 데이터 세트를 추출하게 됩니다.
혹 이해가 안되시는 부분이 있으면 다시 글 부탁드립니다.
감사합니다.
저는 <사진2>처럼 인덱스가 교차로 생겨야하는 줄 알았는데 한번에 0~119, 120~149 로 자동으로 나눠지나보네요?
=> 네, 사진2는 교차에 대한 설명을 쉽게 하기 위해서 예시를 든 것이고, 사진2와 같이 순차적으로 교차되지 않을 수 있습니다. 분명한건 교차적으로 데이터를 만들 수 있습니다.
헷갈린 이유가 <사진3> 처럼 for문에 변수가 2개이면 하나는 인덱스, 하나는 값으로 매칭이 돼야 하는데 지금의 코드인
for train_index, test_index in kfold.split(features): 는 뭔가 형태가 둘다 인덱스로 들어가버리니까 자료구조형태가 매치가 안돼서 이해가 안되는 상황이었거든요.
=> 사진3에서는 enumerate() 구문을 사용하셨는데, 이건 kfold.split()과 동작하는 방식이 다릅니다. enumerate(데이터세트)를 for loop로 적용하면 데이터 index와 데이터 값이 출력이 되지만 kfold.split()는 학습과 검증용 index 세트를 반환하게 됩니다.
<사진1>
답변 주신 거 토대로 매치해봤습니다. 120,30 확인했습니다.
<사진2>
<사진3>
저는 <사진2>처럼 인덱스가 교차로 생겨야하는 줄 알았는데 한번에 0~119, 120~149 로 자동으로 나눠지나보네요? 헷갈린 이유가 <사진3> 처럼 for문에 변수가 2개이면 하나는 인덱스, 하나는 값으로 매칭이 돼야 하는데
지금의 코드인
for train_index, test_index in kfold.split(features): 는 뭔가 형태가 둘다 인덱스로 들어가버리니까 자료구조형태가 매치가 안돼서 이해가 안되는 상황이었거든요. 이 부분에 대해서만 해결이 되면 이해가 될 것 같은데 한번 더 설명해주실 수 있을까요?