카테고리 없음

[Python/실습] 선형회귀분석을 이용한 BostonHousing 예측분석

연정양 2023. 1. 3.

데이터 정의

 

[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 - 선형회귀분석 모델생성

 

 

전체 코드

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)))