59doit

[ python ] R과 python을 활용한 데이터 분석 시각화 #3 (2) 본문

portfolio

[ python ] R과 python을 활용한 데이터 분석 시각화 #3 (2)

yul_S2 2022. 12. 30. 16:15
반응형

< Python >

#1 필요한 모듈 임포트

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import matplotlib.pylab as plt
from sklearn.linear_model import LinearRegression
import statsmodels.api as sm
import scipy.stats as stats
import sklearn
import statsmodels.api as sm
from sklearn.datasets import load_boston
from sklearn import datasets

 

#2 데이터 셋 로드

boston = load_boston()
boston

dfX = pd.DataFrame(boston.data, columns=boston.feature_names)
dfy = pd.DataFrame(boston.target, columns=["MEDV"])
df_house = pd.concat([dfX, dfy], axis=1)
df_house.tail(10)


columns = ["ZN", "NOX", "RM", "MEDV"]
sns.pairplot(df_house[columns])
plt.show()

▲변수간 시각화

 

 

#3 데이터 나누기

x_data = df_house.iloc[:,0:-1]
y_data = df_house.iloc[:,-1]

 

 

#4 train, test 데이터 분할

train_x,test_x,train_y,test_y = sklearn.model_selection.train_test_split(x_data,y_data, test_size = 0.3 )

 

 

 

#### 다중회귀분석 ####

#1 회귀분석 모델 생성

m_reg = LinearRegression(fit_intercept = True) 
m_reg.fit(train_x, train_y)
  • LinearRegression 모델 생성

 

#2 예측

y_pred = m_reg.predict(test_x)
print(m_reg.score(test_x, test_y))

# 예측정확도 0.731394668561791

 

 

#3 MSE 구하기

Y_pred = m_reg.predict(test_x)
mse = sklearn.metrics.mean_squared_error(test_y, Y_pred)
print(mse)

# 21.96354347047765

 

 

#4 예측값과 실제값에 대한 Scatter plot 그리기

#4-1)

plt.scatter(test_y, y_pred)

 

 

#4-2)

line = np.linspace(min(test_y), max(test_y), 1000)
plt.plot(line, line, color = 'r')

 

 

#4-3)

plt.xlabel('Test_value')
plt.ylabel('Pred_value')
plt.show()

 

 

 

#### 랜덤포레스트 ####

 

#1 필요한 모듈 임포트

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from SyncRNG import SyncRNG
from sklearn.datasets import load_boston
from sklearn import datasets
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_squared_error
import math

 

 

#2 데이터 로드

boston_rdf = load_boston()
boston_rdf

dfX = pd.DataFrame(boston_rdf.data, columns=boston_rdf.feature_names)
dfy = pd.DataFrame(boston_rdf.target, columns=["MEDV"])
df_house = pd.concat([dfX, dfy], axis=1)
df_house.tail(10)


columns = ["ZN", "NOX", "RM", "MEDV"]
sns.pairplot(df_house[columns])
plt.show()

 

 

#3 데이터 셋  7:3 으로 분할

v=list(range(1,len(df_house)+1))
s=SyncRNG(seed=42)
s.shuffle(v)[:5]
ord=s.shuffle(v)
idx=ord[:round(len(df_house)*0.7)]
idx[:5]

 

 

#4 인덱스 수정-R이랑 같은 데이터 가져오기

for i in range(0,len(idx)):
    idx[i]=idx[i]-1
  • R에서는 데이터프레임이 1부터 시작하기 때문에 python에서 0행과 R에서 1행이 같은 원리로같은 인덱스 번호를 가진다면 -1을 해주어 같은 데이터를 가지고 오게 한다.

 

train=df_house.loc[idx] # 70%
train=train.sort_index(ascending=True)

test=df_house.drop(idx) # 30%

len(train)    #354
len(test)     #152

train_x=train.drop(['MEDV'], axis = 1)
train_y=train['MEDV']
# train_x[:5]
# train_y[:5]

test_x=test.drop(['MEDV'],axis=1)
test_y=test['MEDV']
# test_x[:5]
# test_y[:5]
  • len(train) / len(test) 잘 나누어 졌는지 확인 (R 과 동일하게 나누어짐)

 

 

 

#5 최적 하이퍼 파라미터 & 최적 예측 정확도 구하기

# from sklearn.ensemble import RandomForestRegressor
# from sklearn.model_selection import GridSearchCV

rfr = RandomForestRegressor()
rfr.fit(train_x, train_y)

params = {
        'n_estimators': (100, 200),
        'max_depth': (5, 8),
        'min_samples_leaf': (8, 18),
        'min_samples_split': (8, 16)
}

rf_run = RandomForestRegressor(random_state=0, n_jobs=-1)
grid_cv = GridSearchCV(rf_run, param_grid=params, cv=2, n_jobs=-1)
grid_cv.fit(train_x, train_y)

print('최적 하이퍼 파라미터:', grid_cv.best_params_)
print('최적 예측 정확도: {0:.4f}'.format(grid_cv.best_score_))
최적 하이퍼 파라미터: {'max_depth': 8, 'min_samples_leaf': 8, 'min_samples_split': 8, 'n_estimators': 200}
최적 예측 정확도: 0.7044

랜덤 포레스트는 예측률이 높으려면 파라미터와 중요 변수를 가져와 써야한다.

파라미터 튜닝은 결정 트리 갯수는 100~200 노드 분할을 위한 최소 샘플데이터 수는 8~16 리프노드가 되기 위한 필요한 최소한의 샘플 데이터 수는 8~16 최대 깊이는 5~8 을 주었다

 

 

#6 모델 학습

rf_run = RandomForestRegressor(random_state=0, max_depth=5, 
                               min_samples_leaf=8, min_samples_split=8,
                               n_estimators=200)
rf_run.fit(train_x, train_y)
  • 최적 하이퍼 파라미터 값으로 모델 학습

 

 

#7 모델 성능 측정 (RMSE) 

# from sklearn.metrics import mean_squared_error
# import math

train_predict = rf_run.predict(train_x)
print("RMSE : {}".format(math.sqrt(mean_squared_error(train_predict, train_y))))

# RMSE : 3.154198891928784
  •  rmse를 제공하고 있지 않다. 하지만 rmse는 mse에 루트를 씌어 계산할 수 있다.

 

 

 

#8 변수 중요도 시각화

# import matplotlib.pyplot as plt # 득점모델 변수 중요도
# import seaborn as sns

ftr_importances_values = rf_run.feature_importances_
# array([3.43197688e-02, 1.17402004e-04, 1.85029200e-03, 0.00000000e+00,
#        4.23708094e-03, 5.74832073e-01, 8.81556177e-03, 1.71396086e-02,
#        3.34605773e-03, 4.93660366e-03, 9.67628789e-03, 1.49377776e-03,
#        3.39235485e-01])
  • ftr_importances_values : 

 

 

ftr_importances = pd.Series(ftr_importances_values, index=train_x.columns)
# CRIM       0.034320
# ZN         0.000117
# INDUS      0.001850
# CHAS       0.000000
# NOX        0.004237
# RM         0.574832
# AGE        0.008816
# DIS        0.017140
# RAD        0.003346
# TAX        0.004937
# PTRATIO    0.009676
# B          0.001494
# LSTAT      0.339235
# dtype: float64
  • ftr_importances : pd.Series 로 변경(?)

 

ftr_top = ftr_importances.sort_values(ascending=False)[:20]
ftr_top
# RM         0.574832
# LSTAT      0.339235
# CRIM       0.034320
# DIS        0.017140
# PTRATIO    0.009676
# AGE        0.008816
# TAX        0.004937
# NOX        0.004237
# RAD        0.003346
# INDUS      0.001850
# B          0.001494
# ZN         0.000117
# CHAS       0.000000
# dtype: float64

 

 

 

#9 득점 모델 변수간 중요도 시각화

plt.figure(figsize=(8,6))
sns.barplot(x=ftr_top, y=ftr_top.index)
plt.show()

 

 

 

 

  [ 결론 ]  

두 기법 모두 86~95% 정도의 정확성을 가지고 있다.

다중회귀분석의 예측 평가는 __% rmse 4.872263 랜덤포레스트는 94% rems 3.302658이 나왔으므로 다중회귀보다 랜덤포레스트가 정확성도 높고 오차율이 적어 훨씬 적합한 분석기법이라는 것을 알 수 있다.

반응형
Comments