상세 컨텐츠

본문 제목

[머신러닝]주택분석을 통한 선형회귀를 학습해보자:: 우주를놀라게하자

프로그래밍/머신러닝

by 우주를놀라게하자 2019. 9. 2. 23:29

본문

728x90
반응형
SMALL

개요

이 장에서는 부동산의 가격을 예측하는 머신러닝 모델을 직접 만들어 볼 것이다. 핸즈온 머신러닝 2장에 해당한다.

진행할 순서는 다음과 같다


1. 큰 그림을 본다

2. 데이터를 구한다

3. 데이터로부터 통찰을 얻기 위해 탐색하고 시각화한다.

4. 머신러닝 알고리즘을 위해 데이터를 준비한다.

5. 모델을 선택하고 훈련시킨다.

6. 모델을 상세하게 조정한다.

7. 솔루션을 제시한다

8. 시스템을 론칭하고 모니터링하고 유지 보수한다.


이 장에서는 StatLib 저장소에 있는 캘리포니아 주택 가격 데이터를 사용한다. 그 외 인기 있는 자료들을 구하는 곳은 


1. 캐글(Kaggel)

2. 아마존 AWS 데이터셋

3. UC 얼바인 머신러닝 저장소


이렇게 3군데가 가장 유명하다.


시작하기


[1번~3번 큰그림을 본다]


jupyter notebook을 열어서 해당 데이터의 구조를 확인해본다.

longitudelatitudehousing_median_agetotal_roomstotal_bedroomspopulationhouseholdsmedian_incomemedian_house_valueocean_proximity
0-122.2337.8841.0880.0129.0322.0126.08.3252452600.0NEAR BAY
1-122.2237.8621.07099.01106.02401.01138.08.3014358500.0NEAR BAY
2-122.2437.8552.01467.0190.0496.0177.07.2574352100.0NEAR BAY
3-122.2537.8552.01274.0235.0558.0219.05.6431341300.0NEAR BAY
4-122.2537.8552.01627.0280.0565.0259.03.8462342200.0NEAR BAY


확인해 보면 캘리포니아 주택 가격의 데이터 구성은 위도, 경도, 주택의 연식?, 전체 방 갯수, 침실갯수, 인구, 등등을 담고 있다는 것을 확인해본다.(주의할점은 ocean_proximity를 제외한 모든 데이터는 숫자인데 ocean_proximity는 문자형 데이터라는 것이다)


자 여기서 우리는 우리의 목표를 다시 확인할 필요가 있다. 데이터를 확인하고 첫번째로 되짚어야 할 문제는 그래서 이러한 데이터를 가지고 무엇을 예측할 것인가다. 이 사항이 나와야 어떤식으로 데이터를 가공할 것이며, 어떤 모델을 사용할 지가 나오기 때문이다.

 우리의 목표는 위도 경도, 뭐 특정 데이터들을 넣었을때 가격을 예측하는 모델을 만들것이다. 잊지말고 이를 상기시켜서 다시 가보자


그럼 데이터의 구조는 확인했으니 데이터의 분포를 확인해보자


위 데이터는 캘리포니아 데이터를 표로 나눈것이다. 캘리포니아 데이터에는 각각 모든 카테고리별로 20640개의 데이터가 담겨있다.(total_bedroom을 제외하고 total_bedroom에는 20433개의 데이터가 담겨있다.)


여기서 의문이 들것이다. 아니 왜 항목은 10개인데 왜 9개만 그래프가 나왔지? 라고 이것때문에 앞서 ocean_proximity를 언급하면서 문자열 데이터라고 했던것이다. 문자로 이뤄져있기때문에 숫자형 데이터만 그릴수 있는 차트를 그릴수 없어서 제외된 것이다.


 일단 이해가 됬으리라 믿고, 위의 데이터의 상태를 확인하여 각각의 데이터들이 어디에 많이 분포가 되어있다~뭐 들쑥날쑥하네 이정도만 이해하고 넘어가자


[4번 머신러닝 알고리즘을 위해 데이터를 준비한다]


 이제 본격해서 훈련을 시킬 준비를 해보자, 이 과정에서는 기존에 있는 20640개의 데이터를 훈련용 데이터와 테스트용 데이터로 나눌것이다. 왜냐? 훈련을 시키고 성능을 확인하기 위함이다. 때문에 기존의 데이터에서 일정 부분을 활용하여 70%는 훈련에 사용하고 30%는 테스트에 활용한다.


(테스트와 훈련용 데이터를 나누는것은 본인의 재량이지만 통상적으로 훈련용(70):테스트용(30) 아니면 훈련용(80):테스트용(20) 이런식으로 맞춰주기 때문에...뭐...맞춰주도록하자) 


데이터를 확인해봤을때 median_house_value의 값을 확인해보면 10000~20000사이의 값이 많이 분포되 있음을 확인할 수 있다. 

그러나 통계에서 주의할 점은 모든 데이터를 비율에 맞게 고르게 훈련시켜야 한다는 점이다.

 왜 그럴까? 만약 1000명에 대해서 설문조사를 했는데 여성이 600명이고 남성이 400명이다 그렇다면 남성과 여성에 관한 통계를 냈을때 옳바른 통계가 나오겠는가?  그렇지 않을것이다. 때문에 여성의 비율과 남성의 비율에 맞게 다시 조정을 해서 평균? 값을 내는것이 일반적이다.


위의 데이터도 동일하다 물론 대부분은 10000~20000사이에 데이터가 분포하지만 일부는 500000에 많이 분포되어있기때문에 이를 고루 써주어야한다. 이를 계층적 샘플링이라한다.(사이킷런에선 이를 해결하기 위해 StratifiedShuffleSplit이란 함수를 제공한다.)


이제 각 데이터 별로 상관관계가 짙은 특성들은 찾아보자. 과연 집값에 영향을 주는 요소들은 무엇무엇인지 확인해보면 어떤데이터가 필수적이고 또 어떤 데이터는 그다지...필요하지 않음을 알수 있다.





위의 그림을 보면 median_house_value(제일왼쪽 상단)에서부터 하나하나 보면 median_house_value와 median_income은 x축이 커질수록 y축도 증가한다.(제일왼쪽상단항목과 2번째줄 맨아래 항목 median_income) 즉, median_income이 증가할 수록 median_house_value도 증가함을 알수 있다 그렇다면 반면에 여기저기 분포된 데이터는 무슨 뜻일까? 

 그렇다 서로 아무런 상관관계가 없다는 뜻이다 데이터가 중구난방이란 뜻은 뭐 그런경우도~있고~ 아닌경우도 있고~이런 데이터들의 집합이기 때문에 두 상관관계는 없다고 할 수 있다.


이렇게 우리는 데이터간의 상관관계도 얻었기 때문에 머신러닝에 데이터를 주입하기전에 어떤 데이터간의 행렬로 묶어서 사용해야 더 효율적인지 알았다


자 실제로 데이터를 주입하기 전에 우리가 할일이 남아있다


1. 자료형 데이터를 숫자형으로 만들어주어야한다.ocean_proximity

=>각 카테고리의 위치별로 정숫값으로 변경해주는 판다스의 factorize함수를 사용하여 내부에 있는 데이터를 숫자로 바꿔준다. 예를 들어 'Near Ocean'이란 데이터는 1로 이런식으로 숫자로 다 바꿔준다.


2. total_bedroom에는 20433개의 데이터(이런 문제가 있었다 그렇기 때문에 우리는 데이터의 갯수를 동일하게 맞춰주는 작업을 할 것이다.) => 이런경우 우리는 평균값이 아닌!! 중간값으로 값을 채워준다. 평균과 중간의 차이는 모든 수를 다~~더해 전체의 수로 나눈것이 평균이고 중간은 모든 수 중 가운데에 분포한 값이다. 평균에 대한 오류가 존재하기 때문에 중간값을 채택한 것이다.


이제 모든 준비가 완료되었다.


본서에서는 DecisionTreeRegressor로 훈련시켰다(결정트리라고한다.)


훈련을 시킨후 실제 모델이 얼마나 정확도를 갖는지를 확인하는 과정을 거친다. 이를 교차검증이라한다.


교차검증까지 완료하면 마지막으로 남겨두었던 테스트 세트로 모델을 테스트 해보면 이 장이 완료가 된다.



사실 본서는 설명하다가 이것 저것 삼천포로 빠지는 느낌이 있어서 공부하다가 좀 헷갈리는 있었다. 그런 분들이 있을까봐 그런 부분은 제외하고 큰 구조만을 설명했고 코드는 생략했다. 






728x90
반응형
LIST

관련글 더보기