LinearRegression은 예측값과 실제 값의 RSS를 최소하해서 OLS(Ordinary Least Squares)추정 방식으로 구현한 클래스입니다.
* OLS(Ordinary Least Squares)는 잔차제곱합(RSS, Residual Sum of Squares)를 최소화하는 가중치 벡터를 행렬 미분으로 구하는 방법입니다.
입력 파라미터 | fit_intercept: 디폴트 값은 True입니다. Intercept 값의 계산 여부를 설정합니다. 만약 False로 설정하게 되면 Intercept가 사용되지 않고 0으로 설정됩니다. normalize: 디폴트 값은 False입니다. 만약 True로 설정하면 회귀를 수행하기 전에 입력 데이터 세트를 정규화 하여 줍니다. |
속성 | coef(): fit() 메서드를 수행하였을때 회귀 계수가 배열 형태로 저장하는 속성을 의미합니다. intercept_: intercept 값 |
ORS기반의 회귀 계수 계산은 입력 피처의 독립성에 많은 영향을 받게 됩니다. 피처간의 상관관계가 매우 높은 경우 분산이 매우 커져서 오류에 민감해 지는데 이러한 현상을 공선성 문제라고 합니다.
주택 가격 예측 실습
사용 데이터는 사이킷런 내장 데이터 입니다.
필요한 모듈을 불러와 줍니다.
import numpy as np import matplotlib.pyplot as plt import pandas as pd import seaborn as sns from scipy import stats from sklearn.datasets import load_boston %matplotlib inline
데이터를 읽어오고 target 배열을 PRICE라는 칼럼으로 추가하여 줍니다.
boston = load_boston() bostonDF = pd.DataFrame(boston.data, columns = boston.feature_names) bostonDF['PRICE'] = boston.target bostonDF.head()
각 변수들의 의미는 다음과 같습니다.
- CRIM: 지역별 범죄 발생률
- ZN: 25,000을 초과하는 거주 지역의 비율
- INDUS: 비상업 지역의 넓이 비율
- CHAS: 찰스강에 대한 더미 변수(강의 경계에 위치 여부에 따라 맞으면1, 아니면 0)
- NOX: 일산화질소의 농도
- RM: 거주할 수 있는 방의 개수
- AGE: 1940년 이전에 건축된 소유 주택의 비율
- DIS: 5개 주요 고용센터까지의 가중 거리
- RAD: 고속도로 접근 용이도
- TAX: 10,000달러당 재산세율
- PTRATIO: 지역의 교사와 학생수의 비율
- B: 지역의 흑인 거주 비율
- LSTAT: 하위 계층의 비율
- MEDV: 본인 소유의 주택 가격(중앙값)
bostonDF.info()
데이터의 형태를 살펴봤을때 NULL값을 없으며 모두 float형태로 이루어져 있습니다.
다음은 각 칼럼들이 회귀 결과에 미치는 영향을 알아보도록 하겠습니다.
# 4*2= 8개의 그래프를 그리도록 함. fig, axs = plt.subplots(figsize=(16,8), ncols=4, nrows=2) lm_features = ['RM','ZN','INDUS','NOX','AGE','PTRATIO','LSTAT','RAD'] for i, feature in enumerate(lm_features): row = int(i/4) col = i%4 sns.regplot(x=feature, y='PRICE',data=bostonDF, ax=axs[row][col])
그래프를 봤을때 RM과 LSTAT의 변수가 PRICE와 영향이 있는것을 알 수 있습니다. RM은 양의 선형성을 보이고 LSTAT는 음의 선형성을 보입니다. 다시 말해 방의 크기가 클수록 LSTAT(하위 계층의 비율)이 적을수록 PRICE가 증가하게 됩니다.
이제 LinearRegression 클래스를 사용해서 주택 가격의 회귀 모델을 만들어보겠습니다.
먼저 학습 데이터와 테스트 데이터를 분리하여 예측을 수행하여 줍니다.
from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression y_target = bostonDF['PRICE'] X_data = bostonDF.drop(['PRICE'],axis=1, inplace=False) X_train, X_test, y_train, y_test = train_test_split(X_data, y_target, test_size=0.3, random_state=156) lr = LinearRegression() lr.fit(X_train, y_train) y_pred = lr.predict(X_test)
다음으로 측정을 위하여 mean_squared_error()와 r2_score()를 이용하여 MSE와 R2 score를 측정하도록 하겠습니다.
from sklearn.metrics import mean_squared_error, r2_score MSE = mean_squared_error(y_test, y_pred) RMSE = np.sqrt(MSE) print('MSE: {0:.3F}, RMSE:{1:.3F}'.format(MSE,RMSE)) print('Variance Score: {0:.3f}'.format(r2_score(y_test,y_pred)))
주택 가격 모델의 intercept값은 LinearRegression객체의 intercept_속성, 회귀 계수는 codf_속성에 저장되어 있습니다.
한번 확인을 해보도록 하겠습니다.
print('절편 값:',lr.intercept_) print('회귀 계수 값:', np.round(lr.coef_,1))
coef_ 의 회귀계수 값을 매핑하여 높은 값 순으로 출력해 보도록 하겠습니다.
coeff = pd.Series(data=np.round(lr.coef_,1), index = X_data.columns) coeff.sort_values(ascending=False)
RM이 양의 값으로 회귀 계수가 가장 크게 나타났습니다. 하지만 NOX 변수의 회귀 계수의 -값은 좀 크게 나타났습니다.
Reference
'Machine Learning' 카테고리의 다른 글
로지스틱 회귀 (2) | 2020.05.27 |
---|---|
규제 선형 모델 (0) | 2020.05.27 |
회귀란? (0) | 2020.05.26 |
ML 평가 지표 (0) | 2020.05.09 |
의사결정 나무 실습 (0) | 2020.05.07 |