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

개요 :이 장에서는 부동산 회사에 막 고용된 데이터 과학자라고 가정하고 예제 프로젝트의 처음부터 끝까지 진행하는 것이다.  실제 1990년 캘리포니아 인구조사 데이터를 기반으로 하여 캘리포니아 주택 가격 모델을 만드는 것이다.

 

 

1.housing Data의 형태


사용에 편의를 위해 csv file을 pandas로 다루기 쉬운 Dataframe형태로 바꾸었다.

(20640, 10) dataset 즉,  10개의 특성을 가지는 20,640개의 data이다. total_bedrooms 부분이 20,433개를 제외한 나머지 207개는 NULL값(아무것도 아닌 값) 임을 알 수 있다.

첫 다섯행의 data 출력

데이터 특성의 마지막을 보면 ocean_proximity 특성은 다른 숫자형 shape과 다르게 object임을 볼 수 있는데 첫 행의 다섯줄을 보면 NEAR BAY가 반복되는 것을 볼 수 있다. 이 특성은 아마 범주형일 것으로 추측된다.

어떤 범주가 있고 그 범주마다 몇 개가 있는지 value_counts() 메서드로 확인한다.

다른필드도 요약하여 출력해본다.

이와 같은 계산은 아까 전 NULL 값으로 처리된 207개의 total_bedrooms는 포함되지 않는다.

이제 데이터의 형태를 빠르게 검토하기 위해 히스토그램으로 그려본다.

몇 가지 확인 사항으로

  1. median_income이 달러로 표현되어 있지 않은 것 같다.
  2. median_house_value 와 housing_median_age 의 그래프 끝을 보아 심하게 올라가 있는 형태를 띄고 있는데 이것은 최댓값과 최솟값을 한정하여 몰빵? 되어있는 형태일 수 있다. (실제로 이 데이터는 그러함) median_house_value 는 정답label로 사용되기 때문에 학습할 때 문제가 될 수 있다. 만약 이 값이 필요하게 되면 정확한 레이블을 구하거나, 아니면 제거를 한다.
  3. 특성들의 스케일이 서로 많이 다르다.
  4. 몇몇개의 히스토그램 분포를 보면 꼬리쪽에 분포가 되어있는 것을 볼 수 있는데 이는 머신러닝 알고리즘에서 패턴을 찾아내기 어렵게 만든다. >  차후 종모양의 분포가 되도록 변형한다.

 

2.Test Dataset making


간단한 data 섞기

iloc 함수는 2차원배열 index 입력 값을 받아 해당위치 데이터를 보여주는 함수이다.

이런 코드는 반복할때 마다 dataset이 새롭게 shuffle 되므로 반복하면 전체 데이터셋을 보는 셈이므로 이런 상황은 피해야 한다. 계속 똑같은 shuffle 값이 나오게 해야된다는 말인데 난수 초깃값을 (seed value) 설정하거나 처음 shuffle한 값을 저장해서 사용하는 방법이 있다. 하지만 test dataset은 그대로 두고 train dataset을 업데이트하며 학습을 해야 하는데, test dataset이 같이 섞이게 되며 문제가 발생한다. 일반적으로 이를 해결하는 방법은 샘플의 식별자는 고유하기 때문에 이 해시 값을 계산하여 끝자리(마지막 바이트 값은 256을 가질 수 있다) 값이 51 보다 작거나 같은 샘플만 테스트 세트로 보내게 할 수 있다. (51 값이 20% 정도이기 때문) .

http://mwultong.blogspot.com/2006/06/qna-zip-rar-crc32-crc-crc.html

(위 주소는 고유식별자 해시 값을 구하는 방법인 csc32 설명이 잘 된 사이트)

 

하지만 주택 dataset 에는 식별자 컬럼이 없어서 행의 index를 ID로 사용한다. 이렇게 복잡한 함수 구현은 한번으로 족하고 사이킷런에서 이런 함수들을 많이 제공한다.

 

위의 샘플리은 순수한 무작위 샘플링이다. dataset이 충분히 크다면 이는 괜찮지만, 그렇지 않으면 샘플링 편향이 생길 가능성이 커진다. 여기서 계층적 샘플링(stratified sampling)을 사용할 수 있는데 이는 모비율 만큼 표본비율도 같이 해주는 것이다. 예를 들어 인구조사를 할 때 알려진 총 인구 중 여성이 51.3% 남성이 48.7%이라면 1000명을 샘플링하면 여성 513, 남성487명을 뽑는 것이다.

전문가가 중간소득이 예측하는데 아주 중요한 변수로 작용한다고 알려주었다 가정하자. 이 경우 test set이 전체 dataset에 있는 여러 소득 카테고리를 잘 대표해야한다. 중간소득을 discrete하게 만들어주는 작업을 하겠다.

계층별로 dataset에 충분한 샘플 수가 있어야 한다. 그렇지 않으면 계층의 중요도를 추정하는 데 편향이 발생할 것이다. 너무 많은 계층으로 나누면 안되고, 각 계층이 충분히 커야함을 의미, 다음 코드는 중간소득을 1.5로 나눠준다.

ceil 은 반올림함수이고 where은 index 함수이다.

소득 카테고리를 기반으로 계층 샘플링을 할 준비가 되었다.

왼 : 전체 주택 dataset에서 소득 카테고리의 비율

오 : housing[income_cat] 의 value count

 

비교

무작위 샘플링보다 계층 샘플링의 정확도가 더 높은 것을 확인할 수 있다.

다음 포스팅에서 더

 

전체 code :

 


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

답글 남기기

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