티스토리 뷰

사이킷런의 linear_models 모듈은 매우 다양한 선형 회귀를 클래스로 구현해 제공합니다. 그중 규제가 적용되지 않은 선형 회귀 클래스인 LinearRegression을 이용해 보스턴 주택 가격 예측을 해봅시다.

 

 

 

LinearRegression 클래스에 대해 간단히 알아보겠습니다. 해당 클래스는 RSS를 최소화해 OLS(Ordinary Least Squares) 추정 방식으로 구현한 클래스입니다. fit() 메서드로 X, Y 배열을 입력받으면 회귀 계수를 coef_ 속성에 저장합니다.

 

 

 

 

 

 

 

  • 파라미터
    • fit_intercept : 불린 값으로, 디폴트는 True. 절편을 계산할 것인지 말지를 설정. False이면 절편이 0으로 지정 됨
    • normalize : 불린 값으로, 디폴트는 False. 만약 fit_intercept가 False이면 이 파라미터는 무시된다. True이면 회귀를 수행하기 전에 입력 데이트를 정규화
  • 속성
    • coef_ : fit() 메서드를 수행했을 때 회귀 계수를 배열 형태로 저장하는 속성. Shape는 (Target 값 개수, 피처 개수)
    • intercept : 절편 값

 

 

 

 

 

 

 

Ordinary Least Squres 기반의 회귀 계수 계산을 피처의 독립성에 많은 영향을 받습니다. 피처간의 상관관계가 매우 높은 경우 분산이 커져서 오류에 매우 민감해집니다. 이러한 현상을 다중 공선성(multi-collinearity) 문제라고 합니다. 일반적으로 상관관계가 높은 피처가 많으면 독립적인 중요한 피처만 남기고 다른 피처를 제거하거나 규제를 적용합니다. 만약 매우 많은 피처가 다중 공선성 문제를 가지고 있다면 PCA를 통해 차원 축소를 하는 것도 고려할 수 있습니다.

 

 

 

다음으로 회귀의 평가 지표에 대해 알아보겠습니다. 회귀 평가 지표는 대부분 실제 값과 예측값의 차이값을 기반으로 합니다. 보통 차이값의 절댓값 평균이나 제곱, 제곱의 루트를 씌운 평균값 등이 평가 지표로 쓰입니다.

 

 

 

 

 

 

  • MAE : Mean Absolute Error(MAE)로, 실제값과 예측값의 차이의 절댓값의 평균

 

 

 

  • MSE : Mean Squared Error(MSE)이며, 실제값과 예측값의 차이를 제곱한 값의 평균

 

 

 

  • RMSE : MSE는 제곱 연산 때문에 실제 오류 평균보다 더 커지는 특성이 있으므로 MSE에 루트를 씌운 값

 

 

 

 

  • $R^{2}$ : 분산 기반으로 예측 성능을 평가. 실제 값의 분산 대비 예측값의 분산 비율을 지표로 하며, 1에 가까울수록 예측 정확도가 높음

 

 

 

 

 

 

 

과거의 사이킷런은 RMSE를 계산하는 메서드를 제공하지 않았지만, 0.22 버전부터는 RMSE를 제공합니다. metric.mean_squared_error() 메서드를 그대로 사용하되, squared 파라미터를 False로 지정하면 됩니다.

 

 

 

또한, cross_val_score나 GridSearchCV와 같은 scoring 메서드에 회귀 평가 지표를 적용할 때 한 가지 유의할 점이 있습니다. 예를들어, MAE의 scoring 파라미터 값은 'neg_mean_absolute_error'입니다. 앞에 'neg_'라는 접두사가 붙어있습니다. 그 이유는 사이킷런의 scoring 메서드는 score 값이 클수록 좋은 평가 결과로 인지하기 때문입니다. 그러나 실제값과 예측값의 오류 차이를 기반으로 하는 회귀 평가 지표의 경우 지표값이 커지면 오히려 나쁜 모델이라는 의미입니다. 그렇기에 scoring 메서드에 이를 적용하기 위해 값에 -1을 곱해주는 파라미터를 적용합니다.

 

 

 

이제 LinearRegression 클래스를 이용해 보스톤 주택 가격 회귀 모델을 만들어봅시다. 원래 사이킷런에 보스톤 주택 가격 데이터가 내장되어 있었지만, 윤리적인 문제(B 피처)로 인하여 이 글을 쓰는 현재 시점의 사이킷런 버전의 경우 더 이상 데이터를 제공하지 않습니다. https://ai-times.tistory.com/431에서 데이터를 얻을 수 있습니다. 보스톤 주택 가격 데이터의 각 피처는 아래와 같습니다.

 

 

 

 

 

 

 

 

 [01]  CRIM 자치시(town) 별 1인당 범죄율
 [02]  ZN 25,000 평방피트를 초과하는 거주지역의 비율
 [03]  INDUS 비소매상업지역이 점유하고 있는 토지의 비율
 [04]  CHAS 찰스강에 대한 더미변수(강의 경계에 위치한 경우는 1, 아니면 0)
 [05]  NOX 10ppm 당 농축 일산화질소
 [06]  RM 주택 1가구당 평균 방의 개수
 [07]  AGE 1940년 이전에 건축된 소유주택의 비율
 [08]  DIS 5개의 보스턴 직업센터까지의 접근성 지수
 [09]  RAD 방사형 도로까지의 접근성 지수
 [10]  TAX 10,000 달러 당 재산세율
 [11]  PTRATIO 자치시(town)별 학생/교사 비율
 [12]  B 1000(Bk-0.63)^2, 여기서 Bk는 자치시별 흑인의 비율을 말함.
 [13]  LSTAT 모집단의 하위계층의 비율(%)
 [14]  MEDV 본인 소유의 주택가격(중앙값) (단위: $1,000)

 

 

 

 

 

 

 

 

데이터 세트를 다운받은 후, DataFrame 객체로 만들어줍시다. "CAT. MEDV" 피처는 책에서의 데이터에 없는 피처이므로 드랍해줍시다. 또한 "MEDV" 피처가 바로 예측해야 할 값입니다. 책에선 해당 피처의 이름이 "PRICE"이므로, rename 메서드를 통해 피처의 이름을 바꿔줬습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

506개의 레코드가 있으며, 결손값은 없는 것을 확인했습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

다음으로, 각 피처가 우리가 예측하고자 하는 주택 가격에 미치는 영향을 시각화해보겠습니다. Im_features 리스트에 들어있는 피처에 대해서만 시각화를 진행해봅시다. seaborn 패키지의 regplot() 메서드는 X, Y 축 값의 산점도와 함께 선형 회귀 직선을 그려줍니다. matplotlib.subplots()를 이용해 각 ax마다 피처와 PRICE의 관계를 표현합니다.

 

 

 

subplots() 메서드는 여러 개의 그래프를 한 번에 표현하기 위해 자주 사용됩니다. ncols인자는 열 방향으로 위치할 그래프의 개수이며, nrows는 행 방향으로 위치할 그래프의 개수입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

RM(방 개수)와 LSTAT(하위 계층의 비율) 피처의 영향이 매우 큰 것을 확인할 수 있습니다. 즉, 방의 개수가 많을수록 주택의 가격이 증가하며, 하위 계층의 비율이 높을수록 주택의 가격이 하락하는 경향이 강합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

LinearRegression 클래스를 이용해 회귀 모델을 바로 만들었습니다. 모델 예측 성능을 위한 평가 지표로는 MSE와 R2 Score를 사용했습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

만들어진 회귀 모델의 절편과 회귀 계수 값을 확인합시다. coef_ 속성은 회귀 계수의 값만을 가지고 있으므로, 각 피처에 해당하는 회귀 계수를 한 눈에 보기 위해 Series 객체로 만든 뒤 내림차순 정렬을 해줍시다. "RM" 피처의 회귀 계수가 가장 크며, "NOX" 피처의 회귀 계수는 너무 작은 값을 가집니다. 최적화를 수행하면서 각 피처의 회귀 계수의 변화도 함께 살펴봅시다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이번에는 cross_val_score() 메서드를 이용하여 5개의 폴드 세트에 대해 교차 검증을 수행하며 MSE와 RMSE를 구해보겠습니다. "neg_"가 붙은 평가 지표를 사용하므로, cross_val_score()가 반환하는 score는 음수입니다. 그러므로 여기에 다시 -1을 곱해줘야 원래 MSE 값입니다. 평균 RMSE는 약 5.829가 나왔습니다.

 

 

 

 

 

 

 

 

«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30