ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 회귀 - 2
    Python Machine Learning/회귀 2020. 8. 15. 20:12

    지금까지 설명했던 단순 선형 회귀를 사이킷런에서 구현한 클래스인 LinearRegression을 이용해 보스턴 주택 가격 예측 회귀를 구현해보겠습니다. 그 전에 LinearRegression 클래스에 대해 살펴보겠습니다.

     

    LinearRegression

    - LinearRegression 클래스는 예측값과 실제 값의 RSS를 최소화해 OLS( ordinary least squares ) 추정 방식으로 구현한

      클래스이며, fit( )메서드로 x, y배열을 입력 받으면 회귀 계수인 W를 coef_ 속성에 저장합니다.

    - 입력 파라미터  1. fit_intercept : 불린 값으로 디폴트는 True. intercept( 절편 )값을 계산할 것인지 말지를 결정

                          2. normalize : 불린 값으로 디폴트는 False. True이면 회귀를 수행하기 전에 입력 데이터 세트를 정규화

                                             1이 False인 경우 2는 무시.

    - OLS 기반의 회귀 계수 계산은 입력 피어츼 독립성에 많은 영향을 받으며 피처간의 상관관계가 매우 높은 경우 분산이

      매우 커져서 오류에 민감해지는데 이러한 현상을 다중공선성문제라 합니다.

    - 상관관계가 높은 피처가 많은 경우 독립적인 중요한 피처만 남기고 제거하거나 규제를 적용합니다. 또한 매우 많은

      다중 공선성 문제를 가지고 있다면 PCA를 통해 차원 축소를 수행하는 것도 고려해 볼 수 있습니다. 이렇게 예측된

      회귀 모델을 평가하는 방법은 여러가지가 있습니다.

     

    회귀 평가 지표

    - 회귀의 평가를 위한 지표는 실제 값과 회귀 예측값의 차이 값을 기반으로 한 지표가 중심이지만, 이 두 값의 차이를 

      단순하게 더하면 +와- 가 섞여서 오류가 상쇄됩니다. 이 때문에 오류의 절대값 평균이나 제곱, 또는 제곱한 뒤 다시 

      루트를 씌운 평균값을 구합니다.

     

    회귀 평가 지표

    1.  MAE : 실제값과 예측값의 차이를 절댓값으로 변환해 평균

    2.  MSE : 실제값과 예측값의 차이를 제곱해 평균 ( 실제 오류 평균보다 더 커지는 특성이 존재 )

    3.  RMSE : MSE의 루트를 씌운 것 ( 사이킷런에서는 제공 X )

    4. R^2 : 분산 기반으로 예측 성능을 평가. 실제 값의 분산 대비 예측값의 분산 비율. 1에 가까울수록 정확도가 높음

               예측값 분산/ 실제값 분산

     

    사이킷런의 API 와 scoring 파라미터의 적용 값( cross_val_score, GridSearchCV에서 평가 시 적용 )

    1. MAE : metrics.mean_absolute_error , 'neg_mean_absolte_error'

    2. MSE : metrics.mean_squared_error, 'neg_mean_squared_error'

    3. R^2 : metrics.r2_score, 'r2'

     

    ※ scoring 파라미터에 'neg'라는 접두어는  음수 값을 가진다는 의미입니다. 이러한 이유는 사이킷런에서는 Scoring 함수가 score값이 클수록 좋은 평가 결과로 자동 평가되기 때문에 실제 값과 예측값의 오류 차이를 기반으로 하는 회귀 평가 지표의 경우 값이 커지면 오히려 나쁜 모델이라는 의미이므로 이를 사이킷런의 Scoring 함수에 일반적으로 반영하기위해 보정을 해야합니다. 

     'neg_mean_absolte_error'가 의미하는 것은 -1 * metrics.mean_absolute_error 이니 주의가 필요합니다.

     

     

    다음 예제는 사이킷런애 내장된 데이터 세트인 보스턴 주택 가격 데이터와 LinearRegression 클래스를 이용해

    선형 회귀 모델을 만들어 보는 예제입니다.

    해당 피처에 대한 설명은 다음과 같습니다.

    보스턴 주택 가격 데이터 세트 로딩

    --> target.array는 주택가격이며 이를 데이터프레임에 추가

     

    각 컬럼별로 주택가격에 미치는 영향도를 조사

    --> 시본의 regplot( ) API는 X,Y축 값의 산점도와 함께 선형 회귀 직선을 그려주며, matplotlib.subplots( )를 이용해 

         각 ax마다 칼럼과 PRICE의 관계를 표현합니다.  ( subplot( )은 여러 그래프를 한번에 표현하기 위해 사용. )

     

    ==> 시각화 결과 RM과 LSTAT의 PRICE영향도가 가장 두드러집니다. 

           RM은 양 (+)방향의 선형성이 크며 즉, 방의 크기가 클수록 가격이 증가하는 모습을 보여주며

           LSTAT는 음(-) 방향의 선형성이 큽니다.

     

    학습과 테스트 데이터 세트로 분리하고 LinerRegression 클래스를 이용해 학습/예측/평가 수행하고 MSE와 R2 Score를 측정
    LinerRegression으로 생성한 주택가격 모델의 intercept( 절편 )과 coefficients( 회귀 계수 )값 확인 ( 절편은 intercept_ 속성에, 회귀계수는 coef_ 속성에 각각 저장 되어있음

    --> coef_ 속성은 회귀 계수 값만 가지고 있으므로 피처별 회귀 계수 값으로 구분해주는 것이 좋습니다.

     

    피처별 회귀 게수 값으로 매핑하고 높은 순으로 출력.

    ==> RM이 양의 값으로 회귀 계수가 가장 크며, NOX 피처의 회귀 게수 - 값이 너무 커보이며 차츰 최적화를 수행하면서 피처 coefficients의 변화를 살펴보겠습니다.

     

    cross_val_score( )를 이용해 교차 검증으로 MSE, RMSE를 측정

    --> cross_val_score( )은 RMSE를 제공하지 않아 MSE 수치 결과를 변환 해야하며, (scoring="neg_mean_squared_error")

    로 반환된 값은 모두 음수입니다.

    --> 계산된 MSE값에 넘파이의 sqrt( )함수를 적용해 RMSE를 구할 수 있습니다.

     

    ==> 5개 폴드 세트에 대해서 교차 검증을 수행한 결과, 평균 RMSE는 약 5.836이 나왔고 cross_val_score

    (scoring="neg_mean_squared_error")로 반환된 값을 확인해 보면 모두 음수입니다.

     

     

Designed by Tistory.