본문 바로가기

cs,코딩,알고리즘/<파이썬 머신러닝 완벽 가이드>스터디

사이킷런 Linear Regression_보스턴 주택 가격 예측

728x90

Linear Regression 클래스

:오차제곱합을 최소화해 OLS추정방식으로 구현한 클래스

fit()메서드로 x,y배열 입력 받으면 w(회귀계수)를 coef_속성에 저장

선형 회귀의 다중 공선성 문제

일반적으로 선형회귀는 입력피처의 독립성에 많은 영향을 받는다

피처 간의 상관관계가 매우 높은 경우 분산이 매우 커져서 오류에 민감해져

=> 상관관계가 높은 피처가 많은 경우 독립적인 중요한 피처만 남긴다

 

회귀 평가지표

평가는 실제값와 예측값의 차이를 기반으로

실제값이랑 예측값을 그냥 빼버리면 상쇄가 된다->절대값 평균이나, 제곱, 제곱에 루트씌운 평균값을 구한다

  • MAE : Mean Absolute Error. 실제 값과 예측값의 차이를 절댓값으로 반환해 평균한것
  • MSE(=RSS) : Mean Squared Error. 실제 값과 예측값의 차이를 제곱해 평균한것
  • MSLE : MSE에 로그를 적용한것. 결정값이 클수록 오류값도 커지기 때문에 일부 큰 오류값들로 인해 전체 오류값이 커지는 것을 막아줌
  • RMSE : MSE 값은 오류의 제곱을 구하므로 실제 오류 평균보다 더 커지는 특성이 있으므로 MSE에 루트를 씌운것
  • RMSLE : RMSE에 로그를 적용한것
  • R^2 : 분산 기반으로 예측 성능을 평가. 실제 값의 분산 대비 예측값의 분산 비율을 지표로 하며, 1에 가까울수록 예측 정확도가 높음

-> 값이 작을 수록 성능이 좋은 것. 그래서 지표값에 -1을 곱해서 음수로 만들어

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

1. 데이터셋 가져오기

사이킷런에 내재되어있는 데이터셋이라서

load_boston()으로 로드한다

 

2. 피처설명

  • CRIM : 지역별 범죄 발생률
  • ZN : 25,000평방피트를 초과하는 거주 지역 비율
  • INDUS : 비상업 지역 넓이 비율
  • CHAS : 찰스강에 대한 더미변수(강의 경계에 위치한 경우 1, 아니면 0)
  • NOX : 일산화질소 농도
  • RM : 거주할 수 있는 방 개수
  • AGE : 5개 주요 고용센터까지의 가중 거리
  • RAD : 고속도로 접근 용이도
  • TAX : 10,000 달러 당 재산세율
  • PTRATIO : 지역의 교사와 학생 수 비율
  • B : 지역의 흑인 거주 비율
  • LSTAT : 하위 계층의 비율
  • MEDV : 본인 소유의 주택 가격(중앙값)

3. EDA(탐색적 분석방법)

:['RM', 'ZN', 'INDUS', 'NOX', 'AGE', 'PTRATIO', 'LSTAT', 'RAD'] 피쳐를 이용해 TARGET 피쳐인 PRICE와의 상관관계를 시각적으로 확인

seaborn의 regplot() API는 X, Y축 값의 산점도와 함께 선형 회귀 직선을 그려줍니다. matplotlib.subplots()를 이용해 각 ax마다 칼럼과 PRICE의 관계를 표현

RM(방 개수)는 양의 선형성-> 방의 크기가 클수록 가격이 증가

LSTAT(하위 계층의 비율)은 음의 선형성-> 하위계층의 비율이 적을수록 price가 증가

 

4. 주택가격의 회귀모델 만들기

:회귀 모델을 만든다는 것은 각 feature에 대한 최적의 가중치 값을 구하는 것

MSE는 (실제값-예측값)^2의 합의 평균

RMSE는 MSE에 루트 씌운 것

5. 절편과 회귀계수

intercept_는 y절편값(딱히 여기서는 별 의미 없음...)

lr_model.coef_ 는 최종으로 구하는 가중치 w값으로 13개가 나옴(506x14 행렬에서 price를 뺀 나머지 13개의 feature에 ㄷ관한 회귀계수이기 때문)

위 회귀계수를 통해 각각의 피쳐에 대한 회귀계수를 확인할 수 있다.

위 회귀계수를 살펴보면 양의 값으로는 RM 피처가 가장 높고(3.4), NOX 피처의 음수 값이 다른 피처에 비해 너무 큰것을 확인할 수 있다.

 

6, 교차검증

아래에서 cross_val_score를 통해 학습데이터 셋을 5 폴드로 나누어 교차검증을 진행

여기서 중요한 점은 sklearn의 scoring 함수는 score 값이 클수록 좋은 평가 결과로 평가한다는 점이다

 

하지만 선형 회귀 모델의 평가지표는 값이 낮을수록 우수한 모델

->scoring = "neg_mean_squared_error"을 반환하면 음수값이니까, -1곱해준다