데이터 정의
[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 이므로 왼쪽으로 향한다.
'python > 실습(project)' 카테고리의 다른 글
[Python/딥러닝/실습] Keras를 이용한 다중 분류 분석(인공신경망) (0) | 2023.01.12 |
---|---|
[Python/딥러닝/실습] 로지스틱 회귀 분석 (0) | 2023.01.12 |
[Python/딥러닝/실습] 단순 선형회귀 분석 (0) | 2023.01.05 |
[Python/실습] 랜덤포레스트 모델을 이용한 위스콘신 유방암 데이터 분류분석 (0) | 2023.01.02 |
[python/실습] xgboost를 이용한 위스콘신 유방암 데이터 분류분석 (0) | 2022.12.20 |
댓글