Immersion In Data

AI

[AI] Random Forest

sungjunminn 2022. 8. 19. 15:37

1. Random Forest

의사결정나무(Decision Tree) 모델을 여러 개 훈련시켜 그 결과를 종합해 예측하는 앙상블(Ansible) 알고리즘이다. 각 의사결정나무 모델을 훈련시킬 때 배깅(Bagging) 방식을 사용한다. 배깅은 전체 Tranin dataset에서 중복을 허용해 샘플링한 Dataset으로 개별 의사결정나무 모델을 훈련하는 방식이다. 이렇게 여러 모델을 통해 예측한 값은 평균을 취하여 최정적인 예측 값을 산출한다. 이러한 배깅 방식은 예측 모델의 일반화 성능을 향상하는 데에 도움이 된다. 

 

- 랜덤 포레스트의 장점

1. 일반화 및 성능 우수

2. 파라미터 조정 용이

3. 데이터 scale 변환 불필요

4. Overfitting이 잘 되지 않음

 

- 랜덤 포레스트의 단점

1. 개별 트리 분석이 어렵고 트리 분리가 복잡해 지는 경향 존재

2. 차원이 크고 희소한 데이터는 성능 미흡

3. 훈련 시 메모리 소모가 큼

4. Train data를 추가해도 모델 성능 개선 어려움

 

Bagging

2. 배깅(Bagging)

학습 데이터 세트에 총 1000개의 행이 있다고 가정해보면 임의로 100개씩 행을 선택해서 의사결정 트리를 만드는 게  배깅(Bagging)이다. 이런 식으로 트를 만들면 모두 다르겠지만 학습 데이터의 일부를 기반으로 중복을 허용하여 생성했다는 것이 중요하다. 

트리를 만들 때 사용될 속성(feature)들을 제한함으로써 각 나무들에 다양성을 줘야 한다. 원래는 트리를 만들 때 모든 속성들을 살펴보고 정보 획득량이 가장 많은 속성을 선택해서 그걸 기준으로 데이터를 분할했다. 하지만 이제는 각 분할에서 전체 속성들 중 일부만 고려하여 트리를 작성하도록 하는 전략을 택한다. 

속성은 전체 속성 개수의 제곱근만큼 선택한다. 

 

3. 파라미터

1. n_estimators : 랜덤 포레스트 안의 결정 트리 갯수

- n_estimators는 클수록 좋음

- 결정 트리가 많을수록 더 좋은 Decision Boundary가 나옴(메모리와 훈련시간 증가)

- Default = 10

 

2. max_features : 무작위로 선택할 feature의 갯수

- max_features=n_features라면 30개의 feature 중 30개의 feature 모두를 선택해 결정 트리를 만듬

- bootstrap=True라면 30개의 feature에서 복원 추출로 30개를 뽑음

- max_features 값이 크면 랜덤 포레스트의 트리들이 매우 비슷해지고, 가장 두드러진 특성에 맞게 예측

- max_features 값이 작다면 랜덤 포레스트의 트리들이 서로 매우 달라짐 → 오버피팅이 줄어듬

- max-features는 일반적으로 Default 값을 씀

 

3. max_depth : 트리의 깊이

 

4. min_samples_leaf : 리프노드가 되기 위한 최소한의 샘플 데이터 수

 

5. min_samples_split : 노드를 분할하기 위한 최소한의 데이터 수

 

6. max_leaf_nodes : 리프노드의 최대 갯수

 

  #분류 코드
  from sklearn.ensemble import RandomForestClassifier
  from sklearn.metrics import accuracy_score

  classifier = RandomForestClassifier(n_estimators = 100)

  classifier.fit(X_train, y_train)

  y_pred = classifier.predict(X_test)

  print("정확도 : {}".format(accuracy_score(y_test, y_pred)))
  
  
  #회귀 코드
  from sklearn.ensemble import RandomForestRegressor
  from sklearn.metrics import mean_squared_error

  regressor = RandomForestRegressor()

  regressor.fit(X_train, y_train)

  y_pred = regressor.predict(X_test)

  mse = np.sqrt(mean_squared_error(y_pred, y_test))

  print('평균제곱근오차 : ', mse)
  
  
  #GridSearchCV를 통한 랜덤포레스트분류의 하이퍼 파라미터 튜닝
  from sklearn.model_selection import GridSearchCV

  grid = {
      'n_estimators' : [100,200],
      'max_depth' : [6,8,10,12],
      'min_samples_leaf' : [3,5,7,10],
      'min_samples_split' : [2,3,5,10]
  }

  classifier_grid = GridSearchCV(classifier, param_grid = grid, scoring="accuracy", n_jobs=-1, verbose =1)

  classifier_grid.fit(X_train, y_train)

  print("최고 평균 정확도 : {}".format(classifier_grid.best_score_))
  print("최고의 파라미터 :", classifier_grid.best_params_)
  
  
  #파라미터 중요도 시각화
  import matplotlib.pyplot as plt
  import seaborn as sns
  %matplotlib inline

  feature_importances = model.feature_importances_

  ft_importances = pd.Series(feature_importances, index = X_train.columns)
  ft_importances = ft_importances.sort_values(ascending=False)

  plt.figure(fig.size(12,10))
  sns.barplot(x=ft_importances, y= X_train.columns)
  plt.show()

 

'AI' 카테고리의 다른 글

[AI] Association Mining  (0) 2022.09.01
[AI] Decision Tree  (0) 2022.08.18
[AI] K-NN(K-Nearest Neighbor)  (0) 2022.08.18
[AI] Logistic Regression  (0) 2022.08.17
[AI] RBM(Restricted Boltzmann Machine)  (0) 2022.08.17