함께하는 데이터 분석

[Scikit Learn] Random Forest 본문

데이터분석 공부/ML | DL

[Scikit Learn] Random Forest

JEONGHEON 2022. 8. 28. 19:19

랜덤 포레스트(Random Forest)

  • 배깅 방식을 적용한 의사결정 나무(Decision Tree)의 앙상블
  • 따라서 사이킷런의 BaggingClassifier에 DecisionTreeClassifier를 넣어 만들거나 RandomForestClassifier를 사용

 

사이킷런

from sklearn.model_selection import train_test_split
from sklearn.datasets import make_moons

X, y = make_moons(n_samples=500, noise=0.3, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

사이킷런의 moons 데이터를 훈련 세트와 테스트 세트로 분리

 

from sklearn.ensemble import RandomForestClassifier

rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42)
rnd_clf.fit(X_train, y_train)

y_pred_rf = rnd_clf.predict(X_test)

500개의 트리로 이루어진 랜덤 포레스트 분류기를 모든 CPU 코어를 사용해 학습한 코드

 

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

bag_clf = BaggingClassifier(
    DecisionTreeClassifier(splitter="random", max_leaf_nodes=16, random_state=42),
    n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1, random_state=42)
bag_clf.fit(X_train, y_train)

y_pred = bag_clf.predict(X_test)

Decision Tree의 배깅을 사용하여 랜덤 포레스트를 구현한 코드

 

np.sum(y_pred == y_pred_rf) / len(y_pred)

>>> 0.976

RandomForestClassifier를 사용한 것과 BaggingClassifier를 사용한 결과가 매우 유사한 것을 확인 가능

 

하지만 랜덤 포레스트 알고리즘은 트리의 노드를 분할할 때 전체 특성 중

 

최선의 특성을 찾는 대신 무작위로 선택한 특성 후보 중 최적의 특성을 찾는 식으로 무작위성을 더 주입

 

결국 트리를 더욱 다양하게 만들고 편향을 손해 보는 대신 분산을 낮추어 전체적으로 더 훌륭한 모델을 만들어 냄

 

 

특성 중요도

랜덤 포레스트의 장점은 특성의 상대적 중요도를 측정하기 쉬움

 

사이킷런은 어떤 특성을 사용한 노드가 평균적으로 불순도를 얼마나 감소시키는지 확인하여 특성의 중요도를 측정

 

또 훈련이 끝난 뒤 특성마다 자동으로 점수를 계산하고 중요도의 전체 합이 1이 되도록 결괏값을 정규화

from sklearn.datasets import load_iris

iris = load_iris()

rnd_clf = RandomForestClassifier(n_estimators=500, n_jobs=-1, random_state=42)
rnd_clf.fit(iris["data"], iris["target"])

for name, score in zip(iris["feature_names"], rnd_clf.feature_importances_):
    print(name, score)
    
>>> sepal length (cm) 0.11249225099876375
    sepal width (cm) 0.02311928828251033
    petal length (cm) 0.4410304643639577
    petal width (cm) 0.4233579963547682

이 값은 feature_importances_ 변수에 저장되어 있음

 

앞서 본 iris 데이터셋에서 랜덤 포레스트를 훈련시키고 각 특성의 중요도를 확인하면

 

꽃받침의 길이, 꽃받침의 너비, 꽃잎의 길이, 꽃잎의 너비는 각각 11%, 2%, 44%, 42%로

 

꽃받침에 관한 특성의 중요도가 매우 떨어지는 것을 확인 가능


https://www.hanbit.co.kr/store/books/look.php?p_code=B9267655530 

 

핸즈온 머신러닝

최근의 눈부신 혁신들로 딥러닝은 머신러닝 분야 전체를 뒤흔들고 있습니다. 이제 이 기술을 거의 모르는 프로그래머도 데이터로부터 학습하는 프로그램을 어렵지 않게 작성할 수 있습니다. 이

www.hanbit.co.kr

'데이터분석 공부 > ML | DL' 카테고리의 다른 글

[Python] 파이토치(Pytorch) 설치하기  (0) 2022.09.07
[Scikit Learn] PCA  (0) 2022.08.28
[Python] 시각화 / graphviz  (0) 2022.08.21
[Ensemble] 머신러닝 앙상블 기법  (0) 2022.08.19
[Scikit Learn] One-Hot Encoding  (0) 2022.05.13