2장: 머신러닝프로젝트 처음부터 끝까지 (p.99)

1. 머신러닝 알고리즘을 위한 데이터 준비


머신러닝 알고리즘을 위해 데이터를 준비할 차례인데 이 작업을 함수로 만들어 자동화한다. (향후 편리함을 위하여)

먼저 원래 훈련세트로 복원(strat_train_set 다시한번 복사). 예측 변수와 타깃 값에 같은 변형을 적용하지 않기 위해 예측 변수와 레이블을 분리한다. (drop()은 복사본을 만들며 strat_train_set에 영향을 주지 않는다.)

 

데이터 정제

누락된 특성을 다루는 함수 몇개 정도 만든다. 앞서 total_bedrooms 특성 207개가 없던 것을 알 수 있다. 이 경우 다룰 수 있는 방법은 3가지다.

1.해당구역 제거

2.전체특성 삭제

3.어떤 값으로 채움 (0, 평균, 중간값 등)

dropna 함수는 Nan 값에 대해 삭제 해버리는 함수다. drop함수는 특정 열 또는 행을 삭제 하는 함수다. fillna는 특정 값으로 대체하는 함수다. 옵션 3을 이용하게 될 경우 훈련세트 중에서 중간 값(평균도 가능)을 계산하여 저장 후 이 값으로 처리해야 한다. Imputer 함수가 결측 값을 해당 값으로 대치해준다.

median을 선택하여 중앙값을 대치값으로 결정했다. 또한 이값을 숫치적 특성에만 해당되기 때문에 앞서 보았던 텍스트 특성인 ocean_proximity를 제외한 데이터를 사용해야 한다.

imputer 함수를 fit을 이용해 각 특성의 중간 값으로 Nan값을 대치시킨다. Nan값이 발견된 건 total_bedrooms 뿐이지만 전체를 해주는 이유는 나중에 서비스될 때 새로운 데이터에서 어떤 값이 누락될지 확실한 수 없으므로 모든 특성에 imputer를 적용한다.

imputer.statistics_는 각 속성의 중앙값을 계산하여 statistics_에 저장해놓는다.

이 결과는 변형된 특성들이 들어있는 numpy 형식 array이다. 이를 다시 pandas dataframe으로 되돌린다.

 

 

텍스트와 범주형 특성 다루기

앞서 범주형 특성 ocean_proximity가 텍스트다.

대부분 머신러닝 알고리즘은 숫자형을 다루기 때문에 이도 마찬가지로 숫자형으로 변환해준다. 이를 위해 각 카테고리를 다른 정숫값으로 mapping 해주는 pandas의 factorize() 매서드를 이용한다.

< 1H OCEAN : 0 , NEAR OCEAN : 1, INLAND : 2>

실제로 1H OCEAN (0)과 ISLAND(4)가 비슷하나 머신러닝은 0과 1처럼 가까이 있는 값이 더 비슷하다고 생각한다. 그래서 binomial하게 만들어서 해결해준다. 한 특징이 1이고 다른 특징이 0이 되게 해당하는 특성마다 그렇게 해주는 변환이 one-hot encoding 이라한다.

fit_transform은 2차원 배열을 넣어줘야 하는데 housing_cat_encoded는 1차원 배열이므로 구조를 reshape 해준다. 희소 행렬로 출력이 되는데 이는 수천 개의 카테고리가 있는 범주형 특성일 경우 매우 효율적이다. 이런 특성을 one_hot encoding 하면 열이 수천 개인 행렬로 변하고 각 행은 1이 하나뿐이고 그외에는 모두 0으로 채워질 것이다. 쓸데 없는 0을 저장하는건 낭비이므로 희소 행렬은 1의 위치만 저장한다. 밀집된 numpy array로 바꾸려면 toarray 메서드를 호출한다.

 

 

나만의 변환기 (파이프라인)

특별한 정제 작업이나 어떤 특성들을 조합하는 등의 작업을 위해 자신만의 변환기를 만들어야 할 때가 있다.

이 경우에는 변환기가 add_bedrooms_per_room 하이퍼파라미터 하나를 가지고 있고 기본 값을 True로 지정한다. add_bedrooms_per_room이라는 변수를 내가 추가해서 머신러닝을 학습할지 안할지를 이 class로 쉽게 구현한다. 일반적으로 100% 확신이 없는 모든 데이터 준비 단계에 대해 하이퍼 파라미터를 추가할 수 있고 자동화할수록 더 많은 조합의 시도가 가능하고 가능성이높아진다.

 

특성 스케일링 Feature Scaling

머신러닝 알고리즘은 입력 숫자 특성들의 스케일이 많이 다르면 잘 작동하지 않는다. 예를들어 전체 방 갯수 범위가 6~39,320 이고 중간 소득의 범위는 0~ 15 이다. 모든 특성의 범위를 같도록 만들어주는 방법으로 min-max (정규화)스케일링, 표준화 가 있다.

정규화 표준화에 대한 이미지 검색결과

(모든 변환기에서 스케일링은 (테스트 세트가 포함된) 전체 데이터가 아니고 훈련 데이터에 대해서만 fit()메서드를 적용해야 한다. 그런 다음 훈련세트와 테스트 세트( 그리고 새로운 데이터)에 대해 transform() 메서드를 사용한다.

 

변환파이프라인

변환단계가 많으며 정확한 순서대로 진행해야 하는데 이를 사이킷런에서 Pipeline 클래스가 도와준다. 다음은 숫자 특성을 처리하는 간단한 파이프라인이다.

pipeline은 연속된 단계를 나타내는 이름/추정기 쌍의 목록을 입력으로 받는다. 마지막 단계에는 변환기와 추정기를 모두 사용할 수 있고 그 외에는 모든 변환기여야 한다.(fit_transform 메서드를 가지고 있어야한다.)  fit() 메서드를 호출하면 모든 변환기의 fit_transform() 메서드를 순서대로 호출하여 한 단계의 출력을 입력으로 전달한다. 마지막 단계에서는 fit() 메서드만 호출.

업데이트 등 바뀐 전체 코드 :


References : Hands-On Machine Learning with Scikit-Learn & Tensorflow

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다