# 예제 데이터
subset = ['AdjSalePrice', 'SqFtTotLiving', 'SqFtLot', 'Bathrooms',
'Bedrooms', 'BldgGrade']
print(house[subset].head())
from sklearn.linear_model import LinearRegression
predictors = [ 'SqFtTotLiving', 'SqFtLot', 'Bathrooms',
'Bedrooms', 'BldgGrade']
outcome = 'AdjSalePrice'
house_lm = LinearRegression()
house_lm.fit(house[predictors], house[outcome])
print(f'Intercept: {house_lm.intercept_:.3f}') # 절편
print('Coefficients:') # 계수
for name, coef in zip(predictors, house_lm.coef_):
print(f'{name}:{coef}')
>>>
Intercept: -521871.368
Coefficients:
SqFtTotLiving:228.83060360240796
SqFtLot:-0.06046682065307607
Bathrooms:-19442.840398321056
Bedrooms:-47769.95518521438
BldgGrade:106106.96307898083
from sklearn.metrics import r2_score, mean_squared_error
import numpy as np
fitted = house_lm.predict(house[predictors])
RMSE = np.sqrt(mean_squared_error(house[outcome], fitted))
r2 = r2_score(house[outcome], fitted)
print(f'RMSE: {RMSE:.0f}')
print(f'r2:{r2:.4f}')
>>>
RMSE: 261220
r2:0.5406
import statsmodels.api as sm
model = sm.OLS(house[outcome], house[predictors].assign(const=1)) # assign 메서드는 값이 1인 상수 열을 예측변수에 추가한다.(절편을 모델링하기 위해 필요)
results = model.fit()
results.summary()
여기서 사용된 assign 메서드는 값이 1인 상수 열을 예측번수에 추가한다. 절편을 모델링하기 위함이다.
유용한 지표는 결정계수라고도 부르는 R제곱 통계량이다. R제곱의 범위는 0에서 1까지이며 모델 데이터의 변동률을 측정한다(분산으로). 모델이 데이터에 얼마나 적합한지를 평가할 때, 회귀분석을 설명하기 위한 용도로 활용된다.
R제곱의 값이 1에 가까울수록 예측 정확도가 높은것이며, 수식은 다음과 같다. = (예측값 variance)/ (실제값 variance)
자유도를 고려한 수정 R제곱(adjusted R-squared)값 또한 보여준다. 이것은 모델에 더 많은 예측변수를 추가하는 것에 대해 효과적으로 페널티를 가한다.
또한 계수의 표준오차(SE)와 t통계량을 함께 출력한다.
t통계량, 그리고 늘 함께 따라다니는 p값은 계수가 통계적으로 유의미한 정도로서, 예측변수와 목표변수를 랜덤하게 재배치하였을 때 우연히 얻을 수 있는 범위를 어느 정도 벗어났는지를 측정한다.