[Day 29] 머신러닝 - Random Forest

임종우·2022년 10월 26일
0

ai_school_TIL

목록 보기
20/34

22.10.26.
머신러닝 두 번째 날.
오 뭔가 되게 정신없다. 잘 공부해봐야겠다.
정리 시작!


Random Forest

  • RandomForest란, Bagging을 통해 훈련과정을 거쳐 모델을 만들어내는 Ensemble 학습 방법의 일종이다. 훈련 과정에서 구성한 다수의 결정 트리로부터 분류 또는 회귀의 결과를 얻어낸다.
  • 여러 개의 결정 트리를 만들고, 숲을 이룬 결정 트리들의 결과들을 종합해 결과물을 얻어내는 방식이다!

랜덤포레스트란 무엇일까?

  • 위키백과 - 랜덤 포레스트
  • RandomForest는 Decision Tree의 단점을 극복하여 만들어졌다. 일반적인 decision tree의 경우, 그 결과 또는 성능의 변동 폭이 아주 크다. 랜덤성에 따라 생성되는 결정 트리가 매우 다르기 때문에 일반화하여 사용하기도 어렵고, 계층적 방식이어서 중간에 에러가 발생한다면 다음 단계로 에러가 계속 전파되기도 한다.
  • 랜덤 포레스트는 서로 다른 다양한 트리들을 만들어, 각각을 학습시킨 후 그 값들에 대해서 투표를 진행하거나 평균을 내어 최종 예측 결과를 만들어내는 모델이다.

랜덤포레스트는 Bagging이라는 방식으로 동작한다.
Bagging이란, Bootstrap + aggregating을 의미한다.

  • 여기서 Bootstrap이란, 주어진 훈련 데이터에서 중복을 허용하여 샘플을 추출하는 것을 의미한다.
  • 따라서 Bagging은, 부트스트랩을 통해 추출한 샘플 데이터들에 대해 각각 결정 트리를 통해 훈련된 기초분류기(base learner)들을 결합(aggregating)하는 방법을 의미한다. 랜덤 포레스트의 학습 과정은 이 과정대로 진행된다.
  • 이러한 랜덤포레스트는, 결정트리에 비해 분산이 감소되기 때문에 노이즈에 대해 강인하다는 특징이 있다.

랜덤포레스트에도 여러 매개변수(hyperparameter)들이 있다. 특히 중요한 것은, n_estimators로, 몇개의 트리를 생성할 것이냐라는 인자와, 트리의 최대 깊이 max_depth이다.

회귀(regression)

  • 회귀는 수치형 변수에 대한 예측이다.

  • 이번 실습파일에서는, 지난번과 마찬가지로 pima indians diabetes database를 사용하는데, 결측값이 많았던 Insulin을 회귀를 통해 예측하여 결측값 처리를 해줄 것이다.

  • 즉, 데이터의 전처리를 위해 머신러닝을 사용한다.

  • 회귀를 구현하는 모델도 여러가지가 있지만, 우리가 지금 사용하고 있는 RandomForest의 Regressor를 사용할 것이다. RandomForest역시 CART모델이므로, 분류와 회귀 모두 가능하다.

  • 이번 실습은 인슐린의 결측값(0으로 표시되어있음)을 예측하여야 하는 실습이었기에, test data set은 인슐린이 결측치인 데이터이다.

  • 즉, train set에는 정답이 있지만, test set에는 정답이 없다. 그럼 모델의 검증, 평가를 어떻게 진행해야 할까?

  • 교차 검증을 실시한다.

교차 검증(Cross-validation)

  • 교차 검증이란, 종속변수에 대한 예측이 얼마나 잘 작용하는지를 train set만을 통해 검증하는 방법이다.

  • hold-out validation은 train set을 train set과 하나의 valid set으로 나누어, train set에 대해 학습을 진행하고, valid set으로 검증을 하는 방식이다. 이 방식은 신뢰도는 좀 떨어지지만, 빠르게 결과를 추출해볼 수 있다는 장점이 있다.

  • k-fold 교차검증은, train set을 k개로 나누어, k개 fold 각각이 모두 valid set이 되도록 train set에 k번의 검증을 거치는 방법이다. 이 방법을 통해서는 총 k개의 모형, k개의 교차검증 성능이 나오겠고, 이를 평균내어 최종 성능을 계산한다.

  • sklearn의 cross_val_predict 등을 사용하여 구현할 수 있다.

  • r2_score
    교차검증의 정확도를 측정하는 방법 중 하나. 분류에서 처럼 accuracy를 구하면, 분류처럼 딱딱 나누어떨어지는 것이 아니므로 0이 나오곤 한다. 따라서 회귀선의 기울기를 의미하는 r2_score를 평가 지표로 이용하곤 한다. 1에 가까울 수록 좋다.

실습 과정

실습 내용

  1. RandomForestClassifier를 이용하여 당뇨인지 아닌지를 결정하는 분류모델 제작.
  2. RandomForestRegressor를 이용하여 결측치인 Insulin의 값들을 예측하는 회귀모델 제작.

실습 과정

  • Random Forest classifier 불러오기
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(random_state = 42, n_estimators = 900,n_jobs = -1,  max_depth = 10)
model

n_estimators의 기본값은 100이다. n_jobs는 모델에서 사용할 컴퓨터의 코어 수를 의미한다. -1을 값으로 주면 모든 코어를 사용한다.

  • 틀린 값만 찾아보기
test['accuracy'] = (y_test == y_predict)
test[test['accuracy'] == False]

모델의 예측 결과 중 틀린 값만 봐야 할때 이렇게 사용하면 되겠다.

  • test set과 train set 나누기
train = df[df[label_name] > 0]
test = df[df[label_name] == 0]

비율로 따지면 거의 5대 5수준. 보통 train set의 개수를 많이 하는 것이 좋지만, 정답이 있는 것은 아니다! 여기서 나눌 수 있는 최선의 방법으로 나눈다.

  • display 잘 활용하기
y_test = test[label_name]
display(y_test.head(2))
y_test.shape

중간에 display()구문을 사용하면, 값을 확인할 수 있으므로 잘 써먹으면서 진행해야 한다! 값을 중간중간 잘 확인하며 진행해줘야 실수와 오류를 막을 수 있다.

  • 회귀 알고리즘 가져오기
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(random_state= 42, n_jobs = -1, n_estimators = 100)

model.fit(X_train, y_train)
  • cross validation
from sklearn.model_selection import cross_val_predict

y_predict = cross_val_predict(model, X_train, y_train, cv = 5, n_jobs = -1, verbose = 2)

y_predict에는 교차검증을 통해 예측된 값이 들어간다. cv는 나눌 세트의 값(k)이고, verbose는 문구를 몇개나 출력할지에 대한 인자이다.

  • r2_score
from sklearn.metrics import r2_score

r2_score(y_train, y_predict)

자잘자잘

  • Decision Tree 모델 같은 경우, 간단하며 빠르고, 동작을 파악하기 좋아 어떤 feature가 중요한 feature 인지 파악해보는 용도의 baseline model로도 많이 사용한다고 한다.

  • DecisionTree와 달리, RandomForest는 사이킷런을 통해 시각화할 수 없다. 그러나 TreeInterpreter와 같은 도구를 사용한다면, 랜덤포레스트를 통해 만들어진 결과물을 시각화할 수 있다.

  • DecisionTree의 경우, export_text를 통해 결과물을 text로 볼 수 있다. 코드는 다음과 같다.

from sklearn.tree import export_text

print(export_text(model, feature_names = feature_names))

위 내용은 멋쟁이사자처럼 AI School 오늘코드 박조은 강사님의 수업을 듣고 공부한 내용으로, 자료를 일부 인용했습니다!


더 공부해볼 것

  • cross_val_predict, cross_val_score
  • r2 score의 정확한 의미
  • 정신차리기~!
profile
ai school 기간 동안의 TIL!

0개의 댓글