본문 바로가기
Python/Python DataAnalysis

[Python Data Analysis] 14. pandas 데이터 전처리 - 학습/검증 데이터 특성치 분류

by Rosmary 2021. 12. 23.
728x90
반응형

 

 

 

필자가 앞서 작성한 데이터 분석 과정에 대해 간략하게 작성한 포스팅을 보면, 분석에 필요한 데이터 중 일부는 학습 데이터와 검증 데이터로 나누는 과정이 있다. 학습데이터는 말 그대로 분석 모델 생성 후, 해당 모델의 학습에 사용하는 데이터이고, 검증 데이터는 생성한 학습 모델이 학습한 내용에 따라 얼마나 정확한 결과가 나오는지 테스트하는 데이터라고 보면 된다.

 

예를 들어, 소득, 성별과 비만의 상관관계 조사를 위해 데이터를 수집하고, 해당 상관관계에 대해 학습하는 모델을 생성한다고 해보자. 그럼, 수집한 데이터의 일부를 모델 학습에 사용하고(학습데이터), 나머지 일부는 모델에 적용하여 수집한 데이터와 유사한 결과가 나오는지 확인하는데 사용한다(검증 데이터).

 

그런데, 데이터를 학습/검증용으로 나누기가 생각만큼 쉽지 않다. 수집한 데이터가 100개 일 때 상위 70개는 학습에 사용하고, 하위 30개는 검증에 사용한다고 해보자. 그런데 우연치않게도, 학습 데이터에 저소득자, 남성에 대한 데이터만 가득하다면, 생성한 모델로 학습을 시킨다 하더라도 검증 데이터에 고소득/여성의 데이터에 대해 정확한 분석이 진행되지 않게 된다. 따라서, 학습/검증용 데이터를 분류할 때 단순히 데이터를 분류하는 것이 아니라, 데이터의 특성치 값을 적절히 분배하는 것도 고려해야 한다. 

 

하지만 수집하는 데이터가 한 두 건도 아니고, 이들 데이터를 일일이 확인해서 수동으로 분류작업을 진행하기는 매우 어렵다. 다행히 scikit learn에서는 특성치(X) + 레이블(Y) 수집 데이터를 적절하게 학습/검증 데이터로 분류하는 기능을 가지는 클래스가 존재한다. sklearn.model_selection 클래스의 매서드인 train_test_split이다.

 

 

이제 앞선 포스팅에서 사용했던 기업 직원 정보 데이터를 사용하여 특성치를 학습/검증 데이터로 분류하는 작업을 실제로 진행해보려 한다. 먼저, 필자는 직원 정보 데이터 중, 성별과 근속년수, 연봉 데이터를 별도로 추출하여 새로운 DataFrame을 생성했다.

 

 

이 데이터 중 성별과 근속연수는 특성치 X, 연봉정보는 레이블 Y가 된다. 특성치 데이터에는 범주형 척도가 존재하기 때문에 이를 먼저 One Hot Encoding 작업을 거쳐 더미 변수를 생성함과 동시에, 이 데이터들을 분석할 수 있는 형태로 재생성해야 한다.

 

 

분석에 사용할 데이터는 df_new2라는 변수에 할당해주었다.

 

 

새로 생성한 DataFrame을 특성치 X와 레이블 Y로 구분하기 위해 아래와 같이 변수 X, Y에 할당하였다.

 

 

이제 특성치 X 100개를 학습 데이터와 검증 데이터로 분류하려 한다. 보통 학습 데이터 70%, 검증 데이터 30%로 분류하나, 분석 상황에 따라 비율은 변화할 수 있다. 

 

 

인자를 단순히 특성치 X만 설정할 경우, 위와같이 테스트 데이터 75%, 검증 데이터 25%를 기본으로 나누게 된다. 이 비율을 변화시키는 인자가 train_test_split() 매서드에 존재한다.

 

 

train_test_split() 매서드는 인자로 train_size, test_size를 가지는데, 이 인자의 값은 0~1 사이로 지정할 수 있다. 만약 train_size 값을 1로 두면, 전체 특성치를 모두 학습 데이터로 사용하겠다는 의미이며, 0.5로 설정하면 특성치 데이터의 절반은 학습 데이터로 사용하겠다는 의미다.

 

또한 학습/검증 데이터 분류 과정이 무작위로 이루어지기 때문에 새로 train_test_split을 사용할 경우, 새로운 학습/검증 데이터 셋이 결과로 반환된다. 만약 train_test_split()의 결과를 동일하게 반환받고 싶다면, random_state 인자를 사용하면 된다. random_state 인자는 정수값을 지정하는데, 특정 값을 지정함으로써 학습/검증 데이터를 일정하게 반환하는 역할을 한다.

 

 

train_test_split으로 반환되는 DataFrame, 즉 학습/검증 데이터는 변수 두 개를 지정하여 할당해주면 된다. 아래와 같이.

 

 

참고로, 특성치 데이터를 학습데이터와 검증데이터로 나누기 전에, 범주형 변수에 대한 One Hot Encoding을 먼저 진행해주는 것이 좋다. 학습/검증 데이터로 나누고 각 데이터에 대해 One Hot Encoding을 진행하면, 만에 하나라도 학습/검증 데이터에 없는 범주형 값이 존재할 경우 One Hot Encoding 결과가 다르게 나타날 수 있기 때문이다.

 


 

다음 포스팅에서는 전처리가 끝난 데이터를 사용하여 모델 선정 및 분석하는 절차에 대해 알아보려 한다.

 

 

 

Fin.

 

반응형

댓글