관리 메뉴

꿈 많은 사람의 이야기

파이썬 StratifiedKFold와 axis = 0 , axis = 1 정리 본문

python

파이썬 StratifiedKFold와 axis = 0 , axis = 1 정리

이수진의 블로그 이수진의 블로그 2019. 1. 26. 14:31


최근에 캐글을 하면서 가장 많이 헷갈렸던 부분이

바로 StratifiedKFold와 pandas에서 axis=0, 1의 대한 개념이었다.


아무것도 모르는 상태도 아니었고 개념적으로는 알고 있었는데

막상 코드를 필사하면서 보니까 정말 헷갈렸었다

그래서 정리를 간단하게 해보려고 한다.



먼저 간단하게 데이터셋을 만들어본다.

pd.DataFrame을 통해서 만든다



자, 처음으로는 StratifiedKFold를 해본다.

from sklearn.model_selection import StratifiedKFold를 통해 라이브러리를 가져온다.

사용법은 정말 간단하다. StratifiedKFold를 선언하고 splits 개수와 shuffle 여부, random_state 등을 설정해준다.

그리고 저 상태에서 바로 .split(x, y) 이런 식으로 해도 되지만 여기서는 for문을 돌면서 split을 해본다.

for idx, (train_idx, test_idx) in enumerate(kfold.split(X, y)을 선언하게 되면 처음에는 train에 대한 index가 나오고, 그 다음에는 test에 대한 index가 나오게 된다.

그래서 위 사진을 보면 알겠지만 1번 loop을 돌 때 마다 index가 train과 test가 겹치지 않게 나온다.


그리고 stratifiedKFold의 또 다른 중요한 특징!

3번의 루프가 돈다. test는 3번의 루프 중 데이터가 겹치지 않는다.

첫 번째 test idx는 2, 3, 6, 9, 10으로 나오고 두 번째는 1, 5, 8이 나오고 등

다 합치면 0, 1,2,3,4,~ 10까지 나온다. 중간에 숫자가 겹치지는 않는다!


이제 axis = 0과 axis=1일 때에 상황에 대해서 알아보자



먼저 df2를 df.copy를 통해서 복사한다.

그리고 일반적인 Series 데이터를 넣게 되면 어떻게 되는지 알아보자



0을 넣게 되면 0은 '행'으로 값이 들어간다.

그래서 밑에 행으로 값이 추가된 것을 볼 수 있다. 

근데 '열' 값인 0은 왜 생겼나?? pd.Series를 넣는데 이거에 대한 컬럼 값이 없기에 저렇게 들어간다. 

아마 pd.concat((df, t_Series.rename('X')) 이런 식으로 컬럼을 지정해서 들어갈 수도 있을거고 아니면 컬럼명을 바꿀 수도 있을 것이다.



axis = 1이면 '행'을 통해서 들어간다고 생각하면 된다.

그래서 0이라는 행이 새로 생기고 거기에 처음부터 값이 들어가게 된다.

pandas Series의 길이가 dataframe과 맞지 않기 때문에 길이가 맞지 않는 부분은 NaN 값이 들어간다



그리고 만약 index를 초기화 해서 들여보내고 싶다면

ignore_index 옵션을 True로 붙이면 된다.

그러면 index를 무시하고 새롭게 들어가게 된다.

위 사진에서 보면 아까는 0, 1, 2 였던 부분이 11, 12 이렇게 바뀌었다.



만약에 p = pd.Series(y == 1) 이런 식으로 p 값을 뽑아냈다 하자.

그러면 1인 부분은 True 값이 될 것이다

그 이후에 pd.concat([df, df2.loc[p], axis = 0) 값을 이렇게 넣어주면 새롭게 컬럼이 추가가 되지 않고

y가 1인 부분에 대한 index 애들만 추려서 값이 들어가게 된다. 위 사진의 결과처럼!



결론적으로 axis = 1은 주로 컬럼 추가, 컬럼 제거에 많이 사용한다. 

데이터 분석하는데 있어 특성 공학(feature engineering)을 하면 새로운 특성이 추가되기도 하고, 없애버리기도 하는데

이럴 떄 axis = 1을 많이 사용한다.

그리고 axis = 0은 데이터를 새롭게 넣을 때 많이 사용한다.




 이렇게 말이다!


6 Comments
댓글쓰기 폼