59doit
[ python ] R과 python을 활용한 데이터 분석 시각화 #3 (2) 본문
반응형
< 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이 나왔으므로 다중회귀보다 랜덤포레스트가 정확성도 높고 오차율이 적어 훨씬 적합한 분석기법이라는 것을 알 수 있다.
반응형
'portfolio' 카테고리의 다른 글
[ R ] R과 python을 활용한 데이터 분석 시각화 #5 (0) | 2023.01.01 |
---|---|
[ R ] R과 python을 활용한 데이터 분석 시각화 #4 (0) | 2022.12.31 |
[ R ] R과 python을 활용한 데이터 분석 시각화 #3 (1) (0) | 2022.12.30 |
[ python ] R과 python을 활용한 데이터 분석 시각화 #2 (2) (0) | 2022.12.29 |
[ R ] R과 python을 활용한 데이터 분석 시각화 #2 (1) (0) | 2022.12.29 |
Comments