데이터 정의
[R/실습] 의사결정나무를 이용한 BostonHousing 예측분석
데이터 정의 사용 데이터: R의 melbench 패키지 내 Bostonhousing dataset 변수명 의미 CRIM 자치시(town) 별 1인당 범죄율 ZN 25,000 평방피트를 초과하는 거주지역의 비율 INDUS 비소매상업지역이 점유하고 있...
robinlovesyeon.tistory.com
선형회귀분석 모델생성
1) Import packages
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LinearRegression
import statsmodels.api as sm
import random
import matplotlib.pyplot as plt
2) 데이터 불러오기 및 전처리
data = load_boston()
3) 변수 선택 (후진 제거법)
x = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.DataFrame(data.target, columns=['MEDV'])
df = pd.concat([x, y], axis=1)
df.head(10)
# linear regressive analysis
x = df.drop(['MEDV'], axis=1)
y = df[['MEDV']]
var = x.columns.tolist()
var
selected = var
sl_remove = 0.05
sv_per_step = []
adjusted_r_squared = []
steps = []
step = 0
while len(selected) > 0:
X = sm.add_constant(df[selected])
p_vals = sm.OLS(y, X).fit().pvalues[1:]
max_pval = p_vals.max()
if max_pval >= sl_remove:
remove_variable = p_vals.idxmax()
selected.remove(remove_variable)
step += 1
steps.append(step)
adj_r_squared = sm.OLS(y, sm.add_constant(df[selected])).fit().rsquared_adj
adjusted_r_squared.append(adj_r_squared)
sv_per_step.append(selected.copy())
else:
break
selected
후진 제거법을 통한 변수 선택으로 ‘INDUS’, ‘AGE’ 변수는 분석에서 제외하고 'CRIM', 'ZN', 'CHAS', 'NOX', 'RM', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT'로 회귀분석을 진행했다.
4) 모형 생성 및 변수별 상관계수 추출
x = df.drop(["INDUS","AGE","MEDV"], axis=1)
xtrain, xtest, ytrain, ytest = train_test_split(x, y, train_size=0.7, test_size=0.3,random_state=295)
mlr = LinearRegression()
mlr.fit(xtrain, ytrain)
pred = mlr.predict(xtest)
print(mlr.coef_)
| 상관관계 계수 | |
| crim | -1.62308538e-01 |
| zn | 3.72267658e-02 |
| chas1 | 3.11801825e+00 |
| nox | -1.63477388e+01 |
| rm | 3.48532239e+00 |
| dis | -1.39776781e+00 |
| Rad | 3.30832663e-01 |
| Tax | -1.10820251e-02 |
| Ptratio | -8.84128015e-01 |
| B | 7.74157735e-03 |
| Lstat | 5.82155589e-01 |
가장 높은 상관성을 가지는 변수는 높은 순으로 RM, NOX, TAX, DIS 등이 있음을 알 수 있었다.
5) RMSE 계산
RMSE = mean_squared_error(ytest, pred) ** 0.5
RMSE
Out[7]: 4.126928466190503
6) 결정 계수 확인 및 시각화
mlr.fit(pred.reshape(-1, 1), ytest)
print(mlr.score(pred, ytest))
plt.rc('font', family='Malgun Gothic')
plt.plot(pred, ytest, 'o')
plt.xlabel('예측 값')
plt.ylabel('실제 값')
plt.plot(pred, mlr.predict(pred.reshape(-1, 1)))
예측값과 실제 데이터 간의 상관도는 0.82가량으로 확인되었으며, 예측값과 실제 데이터를 축으로 산점도 및 회귀선을 시각화 하였다.
![[Python/실습] 선형회귀분석을 이용한 BostonHousing 예측분석 - undefined - 선형회귀분석 모델생성 [Python/실습] 선형회귀분석을 이용한 BostonHousing 예측분석 - undefined - 선형회귀분석 모델생성](http://t1.daumcdn.net/tistory_admin/static/images/xBoxReplace_250.png)
전체 코드
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LinearRegression
import statsmodels.api as sm
import random
import matplotlib.pyplot as plt
data = load_boston()
data
x = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.DataFrame(data.target, columns=['MEDV'])
df = pd.concat([x, y], axis=1)
df.head(10)
# linear regressive analysis
x = df.drop(['MEDV'], axis=1)
y = df[['MEDV']]
var = x.columns.tolist()
var
selected = var
sl_remove = 0.05
sv_per_step = []
adjusted_r_squared = []
steps = []
step = 0
while len(selected) > 0:
X = sm.add_constant(df[selected])
p_vals = sm.OLS(y, X).fit().pvalues[1:]
max_pval = p_vals.max()
if max_pval >= sl_remove:
remove_variable = p_vals.idxmax()
selected.remove(remove_variable)
step += 1
steps.append(step)
adj_r_squared = sm.OLS(y, sm.add_constant(df[selected])).fit().rsquared_adj
adjusted_r_squared.append(adj_r_squared)
sv_per_step.append(selected.copy())
else:
break
selected
x = df.drop(["INDUS","AGE","MEDV"], axis=1)
xtrain, xtest, ytrain, ytest = train_test_split(x, y, train_size=0.7, test_size=0.3,random_state=295)
mlr = LinearRegression()
mlr.fit(xtrain, ytrain)
pred = mlr.predict(xtest)
pred
RMSE = mean_squared_error(ytest, pred) ** 0.5
RMSE
print(mlr.coef_) # 변수 계수
mlr.fit(pred.reshape(-1, 1), ytest)
print(mlr.score(pred, ytest))
plt.rc('font', family='Malgun Gothic')
plt.plot(pred, ytest, 'o')
plt.xlabel('예측 값')
plt.ylabel('실제 값')
plt.plot(pred, mlr.predict(pred.reshape(-1, 1)))
댓글