랜덤 포레스트 (Random Forest)

yiseonline·2023년 9월 2일
0

datascience

목록 보기
24/28
post-thumbnail

2.1 결정 트리와 앙상블

결정트리는 이상적인 머신 러닝 모델이 되기 힘든 한 가지 특징이 있는데 바로 부정확성이다

이렇게 성능이 안 좋은 결정 트리가 그럼 왜 중요할까 ?
-> 응용하면 성능이 좋은 다른 모델들을 만들 수 있기 때문 !

앙상블이라는 기법을 사용해서

앙상블
: 하나의 모델을 쓰는 대신, 수많은 모델들을 사용해 종합적인 판단을 하는 것

ex) 타이타닉 탑승자가 사망했는지, 생존했는지를 예측하는 프로그램을 만든다면

학습데이터를 이용해 100개의 모델을 만듦
-> 이 각 모델들의 예측값을 투표를 통해서 결정 -> 생존 70, 사망 30 으로 투표 결과가 나왔다면 생존으로 예측 or 생존 40, 사망 60 이면 사망으로 예측

즉, 수많은 모델들을 만들고 이 모델들의 예측을 합쳐서 종합적인 예측을 하는 기법 !!


2.2 랜덤 포레스트 I : Bagging

랜덤 포레스트
: 트리 모델들을 임의로 많이 만들어서 다수결 투표로 결과를 종합하는 알고리즘

bootstrapping
: 갖고 있는 데이터 셋으로 다른 데이터 셋을 만들어내는 방법

ex) 질병 데이터 셋

원래 데이터 셋에서 임의로 하나의 데이터를 고름
-> 이걸 그냥 새 데이터 셋에 추가시켜줌
-> 반복

막 어떤 행은 두번 추가 되고 어떤 행은 안 추가 되기도 함 ( 원래 데이터로 같은 크기의 새 데이터 셋을 만들고 싶었던 것이기 때문에 ㄱㅊ다 )

ㄴ 이걸 Bootstrap 데이터 셋 이라고 부름

Bootstrapping
: 모든 모델을 정확히 똑같은 데이터 셋으로 학습시키면 결과 다양성이 떨어질 수 있음 -> 이걸 예방하기 위해, 각 모델을 임의로 만들어준 bootstrap 데이터 셋으로 학습시켜준다

bootstrap 데이터 셋을 만들어내고, 모델들의 결정을 합친다(aggregating) = bagging


2.3 랜덤 포레스트 II : 임의로 결정 트리 만들기


랜덤 포레스트를 만들 때는 bootstrap 데이터 셋에서 임의로 속성 두 개를 선택함

두개만 비교해서 노드를 만든다

또 두개 비교해서 노드 만듦

= 트리를 임의로 만들기 때문에 다양한 트리가 만들어질 수 있다

결정 트리 임의로 만들기

  • bootstrapping을 사용해서 임의로 데이터 셋을 만든다
  • 결정 트리를 만들 때 속성을 임의로 고르면서 만든다
    ㄴ 이걸 여러 번 반복한다 !!
    백번 하면 서로 다른 백개의 트리들을 만들 수 있음

랜덤 포레스트를 사용해서 예측할 때는 만들어 놓은 트리들의 예측을 다수결 투표로 종합해서 결정함

ex) 데이터를 100개의 트리에 각각 넣음 -> 독감을 예측하는 트리의 수 : 40, 일반 감기를 예측하는 트리의 수 : 60 -> 둘 중 많은 일반 감기로 예측 값을 리턴함


2.4 scikit-learn으로 랜덤 포레스트 쉽게 사용하기

모듈 임포트 !!

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt
import numpy as np

import pandas as pd

붓꽃 데이터 변수 저장하고 입력변수, 목표변수를 데이터 프레임으로 만들어서 변수 저장 !!

iris_data = load_iris()

X = pd.DataFrame(iris_data.data, columns = iris_data.feature_names)
y = pd.DataFrame(iris_data.target, columns = ['class'])

training set이랑 test set 나누기

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 5)
y_train = y_train.values.ravel()

랜덤포레스트 분류하기

여기서 n_estimators = random forest 모델이 몇개의 결정트리를 만들어서 예측을 할건지 정해주는 변수다 !

model = RandomForestClassifier(n_estimators = 100, max_depth = 4)

training set 학습시키자

model.fit(X_train, y_train)

output

예측값 numpy 배열로 배출

model.predict(X_test)

output

array([1, 1, 2, 0, 2, 1, 0, 2, 0, 1, 1, 1, 2, 2, 0, 0, 2, 2, 0, 0, 1, 2,
       0, 1, 1, 2, 1, 1, 1, 2])

모델 성능 평가

model.score(X_test, y_test)

output

0.9

속성 중요도 계산하깅

importances = model.feature_importances_ 

시각화 !!

indices_sorted = np.argsort(importances)

plt.figure()
plt.title('Feature importances')
plt.bar(range(len(importances)), importances[indices_sorted])
plt.xticks(range(len(importances)), X.columns[indices_sorted], rotation = 90)
plt.show()

output


2.5 랜덤 포레스트로 악성/양성 유방암 분류하기

이번 과제에서는 sklearn 랜덤 포레스트 모델을 직접 사용해 볼게요. 데이터는 저번 챕터 과제에서 본 유방암 데이터를 사용하겠습니다. 준비 코드는 전 챕터 유방암 데이터 준비 과제에서 그대로 가지고 오셔도 되고, 이번에 직접 다시 작성하셔도 됩니다.

해야 하는 일

  • 지난 챕터에서 준비했던 유방암 데이터 셋을 사용한다.

  • 랜덤 포레스트 모델(RandomForestClassifier)을 만든다. (옵셔널 파라미터: n_estimators=10, max_depth=4, random_state=42)

  • training set 데이터를 가지고 모델을 학습시킨다.

  • 학습시킨 모델에 testing set 데이터를 넣어서 예측한다. (결과는 predictions 변수에 저장)

  • testing set 데이터를 사용해서 학습시킨 모델의 성능을 평가한다. (결과는 score 변수에 저장)
    조건

  • predictions, score 변수를 출력하여 채점한다.

code

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

import pandas as pd

# 데이터 셋 불러 오기
cancer_data = load_breast_cancer()

# 입력 변수를 사용하기 편하게 pandas dataframe에 저장
X = pd.DataFrame(cancer_data.data, columns = cancer_data.feature_names)
# 목표 변수를 사용하기 편하게 pandas dataframe에 저장
y = pd.DataFrame(cancer_data.target, columns = ['class'])

# training-test 셋 나누기
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2, random_state=5)
# 후에 모델 학습시킬 때 경고 안나게 하기
y_train = y_train.values.ravel()

# 결정 트리 모델 정의
model = RandomForestClassifier(n_estimators=10, max_depth=4, random_state=42)
# 모델 학습
model.fit(X_train, y_train)
# 예측하기
predictions = model.predict(X_test)
# 모델의 성능 파악
score = model.score(X_test, y_test)

predictions, score

0개의 댓글