본문 바로가기
Python 과 머신러닝/III. 머신러닝 모델

[Python 머신러닝] 7장. 앙상블 (Ensemble) - (2) RandomForest

by JoyfulS 2019. 10. 25.

 

앙상블이 무엇인지, 배깅이 무엇인지 궁금하다면

Click ☞ https://joyfuls.tistory.com/61

 

 


Random Forest 알고리즘

- 여러 개의 결정 트리를 임의적으로 학습하는 앙상블배깅 유형

- 분류, 회귀 분석 모두 가능 (분류, 회귀 등에서 가장 많이 사용)

- 별도 튜닝(스케일 조정) 과정 없음

- 장점 : 단일 트리 모델 단점 보완(성능, 과대적합)

- 단점 : 대용량 데이터 셋으로 처리시간 증가

- 멀티코어 프로세스 이용 병렬처리 가능

- 배깅과의 차이점 : 배깅은 샘플 복원 추출 시 모든 설명변수 사용 but 랜덤포레스트는 a개의 설명변수만 복원 추출

- 랜덤포레스트는 일반적으로 배깅보다 성능이 우수

  (설명변수가 많을 경우, 대체로 변수간 상관성이 높은 변수가 섞일 확률이 높은데 그 가능성을 제거하기 때문)

 

가장 적절한 트리(Tree) 개수와 설명변수 개수?

1) bootstrap의 수 m은 어느 정도로 커야할까?

     : m이 100 이상이면 충분하지만 검정오차가 안정화될 만큼 큰 값을 사용 (400개 이상)

2) 랜덤포레스트의 설명변수 개수 a는 얼마가 적당할까?

     : 전체 변수 개수가 p라면, 회귀트리는 1/3p, 분류트리는 p의 제곱급 = sqrt(p)

      이는 주로 사용되는 개수일뿐, 실제로는 이 값의 주변 값을 확인해 볼 필요가 있다.

      변수간 상관성에 따라 최적의 a값이 다를 수 있기 때문이다.

 

 


< 실습한 내용>

1. RandomForest Classifier

2. RandomForest Regressor

 

 

1. RandomForest 분류기 (분류 예측 모델)

"""
RandomForest Classifier
""" 

from sklearn.ensemble import RandomForestClassifier #분류트리(모델) 
from sklearn.model_selection import train_test_split # train/test
from sklearn.datasets import load_wine # dataset 
from sklearn.metrics import accuracy_score, confusion_matrix # 평가 : 분류정확도 
from sklearn.metrics import classification_report # 평가 : 정확률, 재현율, f1_score


# 1. dataset loading
X, y = load_wine(return_X_y = True)
X.shape # (178, 13)
y.shape # (178,)
y # 0, 1, 2 세개의 도메인 가지고 있음

 


# 2. train/test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)


# 3. RF model 생성 
model = RandomForestClassifier() # 분류 트리(default) 객체 생성
model.fit(X=X_train, y=y_train)


# 4. model 평가 
y_pred = model.predict(X = X_test)
y_true = y_test

acc = accuracy_score(y_true, y_pred)

print('분류정확도 =', acc) 
# 분류정확도 = 0.9814814814814815 


con_mat = confusion_matrix(y_true, y_pred)

con_mat

report = classification_report(y_true, y_pred)
report



###########################
### RF model tuning
###########################
help(RandomForestClassifier)
'''
n_estimators=10 : raw sampling 수 
min_samples_split=2 : 설명변수 개수 
'''
from math import sqrt 
sqrt(13) # # 3.605551275463989  # 3 ~ 4 => 설명변수 개수

model = RandomForestClassifier(n_estimators=400, min_samples_split=3)
# 파라미터를 조절함으로써 좀 더 개선된 모델 생성이 가능하다
model.fit(X=X_train, y=y_train) 

 

y_pred = model.predict(X = X_test) 
y_true = y_test 

acc = accuracy_score(y_true, y_pred) 

print('분류정확도 =', acc) 
# 분류정확도 = 1.0



2. RandomForest 회귀예측기 (값 예측 모델)

"""
RandomForest Regressor
"""
from sklearn.ensemble import RandomForestRegressor # 회귀트리(모델)
from sklearn.model_selection import train_test_split # train/test
from sklearn.datasets import fetch_california_housing, load_boston # dataset 
from sklearn.metrics import mean_squared_error # 평균제곱오차


# 1. dataset loading
X, y = fetch_california_housing(return_X_y=True)
X.shape # (20640, 8)
y.shape # (20640,)

# 관측치 10개 확인 
X[:10, :] # x변수 정규화 
y[:10]
# [4.526, 3.585, 3.521, 3.413, 3.422, 2.697, 2.992, 2.414, 2.267, 2.611]


# 2. 정규화 
import numpy as np
y = np.log(y)
y[:10]
# [1.50983855, 1.27675847, 1.25874504, 1.22759167, 1.23022518, 0.99214004, 1.09594206, 0.88128512, 0.81845737, 0.95973329]
y[:100]


# 3. model 생성
model = RandomForestRegressor()

model.fit(X = X, y = y)

y_pred = model.predict(X)
y_true = y

# 4. model 평가 : 평균제곱오차 - 작을수록 정확
mse = mean_squared_error(y_true, y_pred)
print('mse=', mse)
# mse= 0.010559916306010872

y_true[:10]
y_pred[:10]

# 상관관계 - 높을수록 정확
import pandas as pd
df = pd.DataFrame({'y_true':y_true, 'y_pred':y_pred})
cor = df['y_true'].corr(df['y_pred'])
cor # 0.984192504413277


######################
###  load_boston
######################

# 1. dataset load
X, y = load_boston(return_X_y=True)
X.shape # (506, 13)

boston = load_boston()
X = boston.data 
y = boston.target
colnames = boston.feature_names # 13개 칼럼 이름 가져올때
colnames
# ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']


# 2. train/test split
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
x_train.shape # (354, 13)


# 3. model
model = RandomForestRegressor(n_estimators=400, min_samples_split=3)
model.fit(X = x_train, y = y_train)


# 4. model의 중요변수
imp = model.feature_importances_
imp
# [0.03380536, 0.00116905, 0.00627223, 0.00086973, 0.02241953, 0.2999559 , 0.01390804, 0.05426967, 0.0035352 , 0.01679749, 0.01656497, 0.01210188, 0.51833097]
len(imp) # 13 => 13개 칼럼들
colnames

import matplotlib.pyplot as plt
plt.barh(range(13), imp) # (x, y) # 중요도 (y에 얼마나 영향을 미치는지)
plt.yticks(range(13), colnames) # 축 이름

 

 


Example

exam01_RF.py
0.00MB
diabetes.csv
0.05MB

댓글