들어가며

사이킷런의 설계철학을 다루면서 추정기, 변환기, 예측기 등을 설명했습니다. 이번에는 직접 나만의 변환기를 만들어 볼 시간입니다. 설계철학에서 언급하는 변환기의 특징을 준수하면서 3. 데이터 탐색 글에서 언급했던 3.4 새로운 특성 추가에서 수동으로 진행했던 것을 별도의 변환기로 만들어 진행하고 변환 파이프라인을 통해서 지금까지 수동으로 정제했던 과정들을 한번에 실행할 수 있도록 하겠습니다.

수동으로 정제했던 과정들
1. 누락된 데이터 정제
2. 새로운 특성 추가
3. 텍스트와 범주형 특성 다루기

나만의 변환기

사이킷런은 기본적으로 유용한 모듈들을 제공하지만 특별하게 데이터를 정제하거나 특성을 조합하기 위해서는 나만의 변환기를 만들어야 합니다. 사이킷런은 클래스 상속을 사용하지 않고 *duck typing을 지원하므로 변환기 클래스에 해당하는 fit(), transform(), fit_transform() 메서드를 생성하여 나만의 변환기를 만들 수 있습니다.

duck typing : 상속이나 인터페이스 구현이 아니라 객체의 속성이나 메서드가 객체의 유형을 결정하는 것

나만의 변환기를 위해서 sklearn.base의 BaseEstimator와 TransformerMixin 클래스에 대해서 알아보겠습니다.

BaseEstimator : 파이프라인과 그리드 탐색(이는 추후 다른 글에서 설명합니다.)에 필요한 _get_params()과 set_params()메서드를 사용할 수 있도록 지원합니다.

TransformerMixin : 보통 클래스의 이름에 Mixin이라는 이름이 들어가면 이는 상속을 목적으로 만들어진 클래스를 의미합니다. 이 클래스는 fit(),transform()메서드를 나만의 변환기에 생성하였을 경우 마지막 메서드인 fit_transform()를 자동으로 생성합니다.

위 클래스를 활용하여 새로운 특성(rooms_per_household, population_per_household, bedrooms_per_room )을 데이터셋에 삽입하는 변환기를 작성해봅시다.

https://colab.research.google.com/drive/1wWaPMCEb3ewf3CNKIeu262vQaCG36apw#scrollTo=XXazV2sBb2CU&line=16&uniqifier=1

 

Google Colaboratory

 

colab.research.google.com

위 코드에서는 하이퍼파라미터로 add_bedrooms_per_room변수를 사용하였습니다. 확신이 없는 데이터 조합에 대해서 하이퍼파라미터를 설정하여 머신러닝이 알고리즘에 도움이 될지 안 될지 쉽게 확인할 수 있습니다. 이렇게 데이터 준비과정에서 자동화를 할수록 많은 조합을 자동으로 시도할 수 있고 최상의 조합을 찾을 가능성을 높일 수 있습니다.

 

*다음은 데이터의 범위와 분산을 정제하는 특성 스테일링입니다. 변환 파이프라인을 진행하기 위해서 잠시 설명하겠습니다.

특성 스케일링
특성 스케일링이란 각 특성들의 값 범위를 비슷하게 변환하는 작업을 의미합니다.

특성 스케일링은 정규화(normalization, min-max 스케일링)와 표준화(standardization)로 나눌 수 있습니다. 정규화는 기존의 데이터를 최댓값과 최솟값의 차로 나누어 0 ~ 1의 범위로 변환하는 것을 의미하고 표준화는 평균을 0, 분산을 1로 만드는 것을 의미합니다. 머신러닝 모델을 보통 입력층에서 0~1 사이의 데이터를 받는 것을 기대하므로 보통 정규화를 사용하는 것이 일반적입니다.

그러나 정규화는 이상치에 대한 민감도가 크다는 단점이 있습니다. 만약 1 ~ 15범위의 데이터에 100이라는 이상치가 들어갈 경우 정규화를 진행했을 때 데이터들이 0으로 치우치는 편향이 발생할 수 있습니다. 그러나 표준화는 이에 그리 민감하지 않습니다.

사이킷런은 정규화를 위한 MinMaxScaler 변환기와 표준화를 위한 StandardScaler 변환기를 제공합니다.

변환 파이프라인

위 글에 이어서 이번에는 여러 변환기들을 하나로 잇는 파이프라인에 대해서 다루어 보도록 하겠습니다. 

파이프라인을 사용하기 위해서는 사이킷런에서 제공하는 sklearn.pipeline.Pipeline을 사용하면 됩니다.

 

파이프 라인의 사용법

파이프라인을 사용하는법은 간단합니다. Pipeline을 호출하고 생성자로 이름/추정기(또는 변환기) 쌍을 리스트로 입력하면 됩니다. 여기서 중요한 것은 파이프라인의 마지막은 추정기 또는 변환기를 사용할 수 있지만 나머지는 모두 fit, transform 메서드를 가진 변환기를 사용해야만 합니다.

이후 파이프라인을 실행할 때 변환을 원하는 데이터셋은 인자로 넣으면 여러 변환기를 한 번에 처리할 수 있습니다.

좋습니다. 3가지 과정을 하나의 파이프라인으로 합쳐 간단하게 만들었습니다.

이제 범주형 특성을 처리하는 또 다른 파이프라인을 만들어 봅시다.

 

데이터 프레임 다루기

사이킷런은 데이터 프레임을 직접적으로 다룰 수 없습니다. 따라서 이를 넘파이 배열로 추출할 필요가 있습니다. 이를 위해서 DaraFrameSelector를 만들어봅시다.

사이킷런 0.20.0은 ColumnTransformer를 사용하여 이를 쉽게 처리할 수 있습니다.

이번에는 범주형 데이터를 넘파이 배열로 추출하여 one-hot encoding 시켜 사용해봅시다. 이를 위해서 새로운 cat_pipleline을 제작합니다.

두 개의 파이프라인 합성하기

마지막으로 두 개의 파이프라인을 이어서 사용해봅시다. 이를 위해서는 FeatureUnion을 사용할 수 있습니다. 이를 사용하여 transform 메서드를 실행할 경우 내부의 파이프라인들은 병렬로 실행되고 마지막에 결과를 합쳐서 반환하게 됩니다.

마치며

지금까지 데이터를 탐색하고 정제할 부분은 파악하고

여러 가지 변환기, 추정기와 직접 만든 변환기를 사용해서 데이터를 정제하였으며

마지막으로 이 변환기들을 하나의 파이프라인으로 합쳐서 데이터를 정제하는 일련의 과정을 압축한

full_pipeline.fit_transform() 메서드를 만들어보았습니다.

 

이로써 모델을 학습시키기 위한 데이터 준비는 모두 끝났습니다. 우리는 이제 모델을 학습시키고 결과를 보고 통찰을 얻어 다시 데이터를 정제하는 과정을 반복하면서 모델의 정확성을 상승시키는 과정을 진행할 수 있습니다. 다음 글에서는 본격적으로 모델을 훈련시키고 검증하는 방법들에 대해서 알아보도록 하겠습니다.

+ Recent posts