결정트리는 이상적인 머신 러닝 모델이 되기 힘든 한 가지 특징이 있는데 바로 부정확성
이다
이렇게 성능이 안 좋은 결정 트리가 그럼 왜 중요할까 ?
-> 응용하면 성능이 좋은 다른 모델들을 만들 수 있기 때문 !
ㄴ 앙상블
이라는 기법을 사용해서
앙상블
: 하나의 모델을 쓰는 대신, 수많은 모델들을 사용해 종합적인 판단을 하는 것
ex) 타이타닉 탑승자가 사망했는지, 생존했는지를 예측하는 프로그램을 만든다면
학습데이터를 이용해 100개의 모델을 만듦
-> 이 각 모델들의 예측값을 투표를 통해서 결정 -> 생존 70, 사망 30 으로 투표 결과가 나왔다면 생존
으로 예측 or 생존 40, 사망 60 이면 사망
으로 예측
즉, 수많은 모델들을 만들고 이 모델들의 예측을 합쳐서 종합적인 예측을 하는 기법 !!
랜덤 포레스트
: 트리 모델들을 임의로 많이 만들어서 다수결 투표로 결과를 종합하는 알고리즘
bootstrapping
: 갖고 있는 데이터 셋으로 다른 데이터 셋을 만들어내는 방법
ex) 질병 데이터 셋
원래 데이터 셋에서 임의로 하나의 데이터를 고름
-> 이걸 그냥 새 데이터 셋에 추가시켜줌
-> 반복
막 어떤 행은 두번 추가 되고 어떤 행은 안 추가 되기도 함 ( 원래 데이터로 같은 크기의 새 데이터 셋을 만들고 싶었던 것이기 때문에 ㄱㅊ다 )
ㄴ 이걸 Bootstrap 데이터 셋 이라고 부름
Bootstrapping
: 모든 모델을 정확히 똑같은 데이터 셋으로 학습시키면 결과 다양성이 떨어질 수 있음 -> 이걸 예방하기 위해, 각 모델을 임의로 만들어준 bootstrap 데이터 셋으로 학습시켜준다
bootstrap 데이터 셋을 만들어내고, 모델들의 결정을 합친다(aggregating) = bagging
랜덤 포레스트를 만들 때는 bootstrap 데이터 셋에서 임의로 속성 두 개를 선택함
두개만 비교해서 노드를 만든다
또 두개 비교해서 노드 만듦
= 트리를 임의로 만들기 때문에 다양한 트리가 만들어질 수 있다
결정 트리 임의로 만들기
랜덤 포레스트를 사용해서 예측할 때는 만들어 놓은 트리들의 예측을 다수결 투표로 종합해서 결정함
ex) 데이터를 100개의 트리에 각각 넣음 -> 독감을 예측하는 트리의 수 : 40, 일반 감기를 예측하는 트리의 수 : 60 -> 둘 중 많은 일반 감기로 예측 값을 리턴함
모듈 임포트 !!
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
이번 과제에서는 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