python/실습(project)

[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.tree import DecisionTreeRegressor 
from sklearn.tree import export_graphviz
import matplotlib.pyplot as plt
import graphviz
from sklearn.metrics import mean_squared_error

from sklearn.tree import plot_tree

 

2) 데이터 전처리

boston_raw = load_boston()
def sklearn_to_df(sklearn_dataset):
    df = pd.DataFrame(sklearn_dataset.data, columns=sklearn_dataset.feature_names)
    df['target'] = pd.Series(sklearn_dataset.target)
    return df
df_boston = sklearn_to_df(boston_raw)
df_boston = df_boston.rename({"target": "MEDV"}, axis='columns')
y_target = df_boston['MEDV']
X_data = df_boston.drop(['MEDV'], 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 = 295)

 훈련 데이터와 실습 데이터를 7:3의 비율로 분류하였다.

 

3) 모형 생성

tree_model = DecisionTreeRegressor(max_depth=3 )
tree = tree_model.fit(x_train, y_train)

훈련 데이터로 모형을 구축하였으며, 과적합 방지를 위해 최대 깊이는 3로 설정하였다.

 

4) 예측 및 모형 설명력 검증

pred = tree.predict(x_test)
print('정확도 : ', tree.score(x_train, y_train))

실습 데이터로 모형 설명력을 검증하였으며 설명력은 0.82가량으로 확인되었다.

 

5) 모델 평가(RMSE)

RMSE = mean_squared_error(y_test, pred) ** 0.5
RMSE

RMSE 도출 결과 4.524 가량으로 나왔다. 

난수 값에 따라 차이가 있겠으나 R로 구현했던 의사결정나무의 RMSE 값 5.053688와 차이가 있다. 

*예측모델을 평가하기 위해서는 RMSE를 꼭 계산해야 한다. 

 

6) 의사결정나무 시각화

fig = plt.figure(figsize=(12,5))
explt_vars = boston_raw.feature_names
decisiontree = plot_tree(tree_model,feature_names = explt_vars,filled=True)

의사결정나무 시각화

시각화 결과 MEDV 변수에 가장 영향을 많이 주는 변수로는 RM, LSTAT, DIS, CRIM, NOX 등으로 확인된다.

 

7) 전체 코드

#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.tree import DecisionTreeRegressor
from sklearn.tree import export_graphviz


#의사결정나무----------------------------------------------------------------------------------
#데이터 가져오기
boston_raw = load_boston()
def sklearn_to_df(sklearn_dataset):
    df = pd.DataFrame(sklearn_dataset.data, columns=sklearn_dataset.feature_names)
    df['target'] = pd.Series(sklearn_dataset.target)
    return df
df_boston = sklearn_to_df(boston_raw)
df_boston = df_boston.rename({"target": "MEDV"}, axis='columns')
print(df_boston.head(3))

# 종속변수 및 독립변수 데이터 셋으로 분리
y_target = df_boston['MEDV']
X_data = df_boston.drop(['MEDV'], 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 = 295)

tree_model = DecisionTreeRegressor(max_depth=3 )
tree = tree_model.fit(x_train, y_train)
# Predict
pred = tree.predict(x_test)
pred

print('정확도 : ', tree.score(x_train, y_train))
RMSE = mean_squared_error(y_test, pred)**0.5
RMSE

#fig = plt.figure(figsize=(10,8))
explt_vars = boston_raw.feature_names
decisiontree = plot_tree(tree_model,feature_names = explt_vars,filled=True)

***

의사결정나무는 시각화하기도 편하지만 시각화 결과로 쉽게 결과를 확인할 수 있어서 편한 것 같다.

예를 들면 독립변수 중 RM 값이 7이라면, 맨 위의 RM <= 6.797 조건에서 FALSE 이므로 오른쪽 가지로 향하고, 

또 두 번째 RM <= 7.437 은 TRUE 이므로 왼쪽으로 향한다. 

댓글