반응형

[23편]에서 다룬 1978년 미국 보스턴 외곽 지역의 주택 정보 중 몇가지 특성에 대한 히트맵을 다시 불러오겠습니다.



위 히트맵에서 방의 개수(RM)와 주택가격(MEDV)의 상관관계를 보면 피어슨 상관계수의 값이 0.7이므로 매우 강한 양의 상관관계를 가지고 있다는 것을 알 수 있습니다. 이는 방의 개수가 많으면 주택가격이 비싸지는 경향이 있다는 것이지요.


이번 포스팅에서는 RM-MEDV의 데이터 분포에 가장 일치하는 회귀직선을 구하는 것을 파이썬으로 구현해봅니다.


데이터 분포와 가장 일치하는 회귀 모델을 구하는 방법 중 하나가 최소제곱법(Ordinary Least Square; OLS)을 이용하는 것인데, 회귀 모델에 의해 예측되는 반응값 y^와 실제 반응값 y와 차의 제곱의 합이 최소가 되는 회귀 모델을 구하는 것입니다. 이는 곧 바로 앞 포스팅에서 언급한 오프셋의 제곱의 합이 최소가 되는 직선을 구하는 것과 같습니다.


[23편]에서 회귀 모델을 아래와 같이 정의했지요.

 


오프셋은 다음과 같이 정의했습니다.



최소제곱법은 모든 데이터에 대해 오프셋을 제곱하고 모두 더한 값이 최소가 되는 것이므로 아래의 값이 최소가 되는 회귀모델을 구하는 것입니다. (데이터의 개수를 n개라 가정합니다.) 



앗,, 이 수식 어디선가 본듯합니다. 바로 아래의 아달라인 비용함수 J(w)와 비슷합니다.




앞에 곱해진 1/2을 무시하면 위의 두 식은 그냥 똑같습니다. 기억이 가물가물하다면, 아래의 링크를 살포시 눌러서 아달라인에 대해 복습을 하고 옵니다.


☞ 아달라인 복습하러 가기

 


아달라인은 비용함수 J(w)의 값이 최소가 되도록 순입력 함수의 가중치를 업데이트 한다고 했습니다.

그런데,  회귀 모델을 구하는 것도 결국 J(w)의 값이 최소가 되는 회귀 모델의 y절편과 설명변수 x의 계수인 w0w1을 구하는 것이므로 아달라인을 구현한 코드를 그대로 가져와서 조금만 수정하면 될 것 같습니다.


아래의 코드를 봅니다.


lrgd0.py



이 코드는 [7편]에 있는 아달라인을 구현한 adaline.py에서 predict(self,X)의 리턴값만 바꾼겁니다. 아래의 링크를 눌러서 adaline.py 코드를 보고옵니다


☞ 아달라인 구현 코드 보러 가기

 


최소제곱법 기반 회귀 모델의 가중치를 구하는 LinearRegressionGD()는 아달라인의 활성화 함수의 결과값을 -1 또는 1로 변환하는 것만 빼고는 동일한 로직임을 알 수 있습니다.


lrgd0.py 코드의 아랫부분에 아래 코드를 추가합니다.


lrgd1.py 



이 코드는 RM-MEDV의 표준화된 값을 이용하여, 비용함수의 가중치를 업데이트 하는 반복회수를 x축에, LinearRegressionGD에 의해 계산되는 비용함수의 값을 y축에 두고 그래프를 그립니다. 실행 결과는 다음과 같습니다.



그래프를 보면 5회 계산에서 값이 수렴함을 알 수 있습니다. 즉 이 부분에서 회귀 모델이 정해지는 겁니다.


아래 코드를 lrgd1.py 코드 아랫부분에 추가합니다.


lrgd2.py



이 코드는 표준화 된 RM값을 x축에, 표준화 된 MEDV값을 y축으로 해서 RM-MEDV의 분포를 나타내고 위에서 구한 회귀 모델을 그립니다. 코드를 실행하면 아래와 같은 결과가 나옵니다.




회귀 모델을 구했으므로 방이 5개인 주택 가격을 예측해 보도록 하겠습니다. 이 그래프는 표준화된 값으로 되어 있습니다. 따라서 실제 집값으로 환산하려면 표준화된 값을 원래 값으로 변환해 주어야겠지요. 아래의 코드를 lrgd2.py 코드에 추가합니다.


lrgd3.py 


num_rooms는 RM의 값을 지정해주는 곳입니다. 방이 5개인 주택가격을 알아보고자 하는 것이므로 실수형으로 5.0을 대입합니다. 우리가 구한 회귀 모델은 표준화 값에 기반하므로, 방의 개수 5.0을 표준화되 값으로 변환한 후 회귀 모델에 의한 예측값을 구해야 합니다. 이 예측값 역시 표준화된 값이며, 표준화된 값을 원래의 값으로 변환시켜주는 것은 StandardScaler.inverse_transform()을 이용하면 됩니다.


코드를 실행하면 아래와 같은 결과가 나옵니다.


방이 [5]개인 주택가격은 약 [10840]달러입니다.




scikit-learn을 이용하여 회귀 모델 구하기

이 포스팅에서 여태까지 다룬 내용은 최소제곱법 기반으로 회귀직선을 구하는 원리와 구현 코드를 작성해보는 것이었습니다. 그런데, 이 내용을 이해했다면 앞으로 scikit-learn이 제공해주는 API를 이용하는 것이 더 낫습니다.  


scikit-learn의 회귀 분석 API를 사용하면 표준화시키고 표준화시킨 값을 본래값으로 변환시키고 하는 번거로운 작업을 해줄 필요가 없습니다. 이런 번거로운 작업들은 scikit-learn 회귀 분석 API 내부적으로 다 처리해주기 때문이죠. 


아래의 코드를 봅니다.


skl_lrgd.py 


이 코드는 scikit-learn의 LinearRegression()을 이용해 RM-MEDV의 회귀 모델 기울기와 y절편을 구하고, RM-MEDV의 분포와 회귀 모델을 그래프로 그립니다. 데이터를 분석할 때 회귀 모델의 기울기나 y절편의 값이 중요한 의미를 가질때 가 있는데, 이럴 경우 위 코드를 참조하여 회귀 모델의 기울기나 y절편을 구하면 됩니다.


코드를 실행하면 다음과 같은 결과가 화면에 나옵니다.




이제 아래의 코드를 skl_lrgd.py 코드 아랫부분에 추가하고 실행하면 앞에서 예측한 방 5개짜리 주택가격과 동일한 결과가 나오는 것을 볼 수 있습니다.



반응형

+ Recent posts