파이썬 랜덤 포레스트 분석

랜덤 포레스트는 분류 회귀 등에 사용되는 앙상블 방법의 일종이다.텍스트 마이닝 문제와 같이 넓고 희소한 속성인 문제에 강점이 있다고 할 수 있다. 본 포스팅에서는 랜덤 포레스트를 파이썬으로 실습해보는 시간을 갖도록 하겠습니다.


랜덤 포레스트 개요

랜덤 포레스트는 분류 회귀 등에 사용되는 앙상블 방법의 일종이다. 앙상블 방법에는 크게 배깅, 부스팅, 랜덤 포레스트로 나뉜다. 랜덤 포레스트는 배깅에 랜덤 과정을 추가한 앙상블 방법이다. 각 노드마다 모든 예측변수 안에서 최적의 분할을 선택하는 방법 대신 예측변수들을 임의로 추출한 후, 추출된 변수 내에서 최적의 분할을 만들어나가는 방법을 사용하는 기법이다. 



랜덤 포레스트 개념


랜덤 포레스트 개념을 이야기 하기에 앞서, 앙상블 기법에 대해서 간단하게 설명하겠다. 앙상블 기법은 여러 개의 분류모형에 의한 결과를 종합하여 분류의 정확도를 높이는 방법이다. 적절하게 표본추출법으로 데이터를 여러 개의 훈련용 데이터 집합을 만들어 각각 데이터 집합에서 하나의 분류기를 만들어 앙상블을 한다. 이 분류기들의 선택방법은 분류기 예측값들의 가중 투표를 통해서 수행한다. 데이터를 조절하는 가장 큰 방법에는 배깅(bootstrap aggregating의 줄임말)과 부스팅이 있다. 배깅은 bootstrap aggregating의 줄임말로 원 데이터 집합으로부터 크기가 같은 표본을 여러 번 단순 임의 추출하여 각 표본에 대해 분류기를 생성한 후 앙상블 하는 방법이다.

랜덤 포레스트는 이런 배깅에 임의 복원 추출 과정을 추가한 방법이다. 임의 복원 추출한다는 것의 차이는 크지 않아 보일 수 있지만 이 차이때문에 랜덤 포레스트가 배깅이나 그레디언트 부스팅과는 다른 성능 특징을 가진다. 일부 결과에서 보면 랜덤 포레스트는 텍스트 마이닝 문제와 같이 넓고 희소한 속성인 문제에 강점이 있다고 할 수 있다. 랜덤 포레스트는 개별 기본 학습자를 서로 독립적으로 트레이닝 할 수 있기 때문에 개별 기본 학습자가 선행 기본 학습자의 결과를 이용해야하는 그래디언트 부스팅보다 모델을 병렬로 만들기 용이하다. 이 때문에 그래디언트 부스팅뿐만 아니라 랜덤 포레스트도 강점을 가진다. 

파이썬 랜덤포레스트

랜덤 포레스트는 크게 다수의 결정 트리를 구성하는 학습 단계와 새로운 입력 벡터가 들어올 때, 예측 혹은 분류하는 테스트 단계를 거친다. 우리가 아는 결정 트리는 일반적으로 훈련 데이터에 과대적합하는 경향이 있다. 랜덤 포레스트는 이러한 과대적합을 해결하기 위해 조금씩 다른 여러 결정 트리를 묶는다. 랜덤 포레스트의 아이디어는 각 트리가 비교적 예측을 잘 할 수 있지만 데이터의 일부에 과대적합하는 경향을 가진다는것을 기초로한다. 이러한 각 서로 다른 방향으로 과대적합된 각 트리를 많이 만들어 그 결과를 평균 낸다면 과대적합된 양을 줄일 수 있다. 이렇듯 랜덤 포레스트의 가장 핵심적인 특징은 바로 랜덤(임의성)에 의해 조금씩 다른 특성을 갖는 트리들이 구성된다는 점이다. 각 트리들의 예측은 서로 비상관화하고 이러한 특징은 결과적으로 일반화 성능을 향상시켜준다. 랜덤 포레스트는 결국 여러 개의 의사결정트리를 만들고 그 트리들을 투표를 통해서 다수결로 결정하는 것이다.

랜덤 포레스트 모델을 만들기 위해서는 먼저 생성할 트리의 개수를 정해야 한다. 트리들은 완전히 독립적으로 만들어져야 하므로 알고리즘은 각 트리가 고유하게 만들어지도록 무작위한 선택을 한다. 트리를 만들기 위해선 부트스트랩 샘플을 생성한다. 이렇게 만든 샘플(데이터셋)들을 이용해 결정 트리를 만든다. 대신 기존의 결정 트리와 다르게 알고리즘이 각 노드에서 전체 특성 대상이 아닌 후보 특성을 랜덤으로 선택해 이 후보 중에 최선의 테스트를 찾는다. 여기서 몇 개의 특성을 고를지는 max_features 매개변수로 조정한다. 부트스트랩 샘플링은 랜덤 포레스트의 트리가 조금씩 다른 샘플을 이용해 만들어지도록 해준다. 또 각 노드에서 특성의 일부만 사용하기 때문에 결국 트리의 각 분기는 서로 다른 특성집합을 사용한다. 이러한 두가지 방식이 랜덤 포레스트의 모든 트리가 서로 달라지도록 만든다. 랜덤 포레스트로 예측할 때 회귀의 경우에는 예측들을 평균하여 최종 예측을 만들고, 분류의 경우에는 약한 투표 전략을 사용해서 분류를 만든다. 



랜덤 포레스트 실습

랜덤 포레스트 실습을 예측하는 방법으로 실습해보자. 예제1에서는 목표변수가 범주형일 경우의 실습이다.  

예제 1 

실습 데이터 중 고객의 구매금액대, 방문빈도, Recency를 활용하여 고객등급을 예측할 수 있는 모델을 생성하고 이를 고객등급별 고객관리에 참고하고자 한다. 실습에 필요한 데이터를 불러오고 실습을 진행해보자.

먼저 csv파일을 pd_read.csv로 data객체에 저장한 후 필요한 칼럼인 구매금액대, 방문빈도, Recency, 고객등급을 가져온 후 data에 저장한다. 잘 가져 왔는지 head( )를 통해서 살펴보자.

IN[1]:
import pandas as pd data = pd.read_csv(‘/Users/파일경로, engine=’python’, encoding=’CP949′)data = data[[‘고객등급’, ‘구매금액대’, ‘방문빈도’, ‘Recency’]]data.head()
OUT[1] :

데이터를 불러왔다면 실습에 사용할 독립변수와 종속변수를 각각 지정해주고 훈련데이터와 테스트데이터를 7:3으로 분할해준다.

IN[2]:
x = data[[“구매금액대”, “방문빈도”, “Recency”]]y = data[[“고객등급”]]from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)

sklearn.ensemble앙상블을 구현하기 위한 라이브러리Scikit-Learn에서는 베깅(Bagging), 랜덤 포레스트(Random Forest), 아다부스트(Adaboost), 그래디언트 부스팅(Gradient Tree Boosting) 등을 지원한다.

위 sklearn.ensemble 라이브러리를 불러와 랜덤 포레스트 모델을 생성해보자.

IN[3]:
from sklearn.ensemble import RandomForestClassifierforest = RandomForestClassifier()forest.fit(x_train, y_train)print (“학습용 데이터셋 정확도: {:.3f}“.format(forest.score(x_train, y_train)))print (“검증용 데이터셋 정확도: {:.3f}“.format(forest.score(x_test, y_test)))
OUT[3]:
학습용 데이터셋 정확도: 0.859검증용 데이터셋 정확도: 0.790

랜덤 포레스트 모형을 생성하고 이를 학습시켜 결과물을 출력한 코드이다. 학습용 데이터셋 정확도가 85.9%로 나오고 검증용 데이터셋 정확도가 79%으로 나온 것을 볼 수 있다.

RandomForestClassifier(n_estimators=’warn’, criterion=’gini’, max_depth=None,  max_features=’auto’, bootstrap=True, oob_score=False)

랜덤 포레스트 코드 중 설정 가능한 옵션은 다음과 같다. n_estimators는 앙상블 트리의 개수이다. 소스 코드를 정확하게 만든다면 기본값(=10)을 사용해도 괜찮지만 일반적으로 최적 성능을 얻기 위해서 10개 트리 이상을 사용할 것이다. 좋은 출발점은 100~500개 정도이다. Criterion은 스플릿의 품질을 측정하는 기능이며 기본값은 gini이다. max_depth는 트리의 최대 깊이를 의미한다. 기본값은 None이다. max_features는 최상의 분할을 찾을 때 고려해야 할 기능의 수를 말한다. int로 설정했다면 모든 분기에서 기능을 고려한다. Float이라면 max_features는 기능의 비율을 고려한다. None이라면 max_feaures=nFeaures를 의미한다. Bootstrap은 Boolean 또는 optional을 입력할 수 있다. 트리 만들 때 부트스트랩 여부를 설정할 때 사용한다. 기본 값은 True이다. oob_score는 예측이 얼마나 정확한가에 대한 추정을 의미한다. 기본값은 False이다.

조금 더 자세한 평가를 위해 classification_report 모듈을 이용하였다. 이 모듈은 모형 성능평가를 위한 모듈로 정밀도(precision), 재현율(recall), F1-score, support를 구해준다.

IN[3]:
from sklearn.metrics import classification_reporty_pred=forest.predict(x_test)print(classification_report(y_test, y_pred))
OUT[3]:

예제 모델의 정밀도의 수치는 0.8, 재현율의 수치는 0.79로 괜찮은 값으로 나타났다.

구매금액대, 방문빈도, Recency는 고객등급을 예측하는데 유의미한 변수로 작용하는 것을 볼 수 있었다. 고객등급을 예측하는데 유의미한 변수를 사용해서 고객등급별 고객군을 찾아 효율적인 고객관리 방안을 생각 할 수 있게 되었다. 

예제 1.1

다음으로는 랜덤 포레스트의 파라미터값을 변경해 기존의 랜덤 포레스트의 결과값을 더 나은 모델로 만들어보자.

더 나은 랜덤 포레스트를 만들기 위해 이전 예제와 같은 종속변수와 독립변수를 가진 데이터에 변경한 파라미터값을 넣어주었다. 나무수는 900 깊이는 10, criterion은 엔트로피로 설정하였다. 그 다음, 이전 예제와 마찬가지로 훈련데이터와 테스트데이터도 7:3으로 분할해준다. 

IN[4]:
from sklearn.ensemble import RandomForestClassifierforest = RandomForestClassifier(n_estimators=900, max_depth=10, random_state=0, criterion=”entropy”)forest.fit(x_train, y_train)print (“학습용 데이터셋 정확도: {:.3f}“.format(forest.score(x_train, y_train)))print (“검증용 데이터셋 정확도: {:.3f}“.format(forest.score(x_test, y_test)))
OUT[4]:
학습용 데이터셋 정확도: 0.857 검증용 데이터셋 정확도: 0.807

학습용 데이터셋 정확도가 85.7%로 나오고 검증용 데이터셋 정확도가 80.7%로 나온 것으로 볼 수 있다. 이전 예제에 비해 학습용 데이터셋 정확도는 미세하게 떨어진데 반해, 검증용 데이터셋은 소폭 증가했음을 볼 수 있다. 

이전 예제와 마찬가지로 모형 평가를 위해 정밀도(precision), 재현율(recall), F1-score, support를 구해준다.

IN[3]:

from sklearn.metrics import classification_reporty_pred=forest.predict(x_test)print(classification_report(y_test, y_pred))
OUT[3]:

정밀도의 수치는 0.81, 재현율의 수치는 0.81로 이전 예제의 랜덤 포레스트 모형보다 조금 더 나은 모델로 생성된 것을 확인 할 수 있다. 이는 실제 마케팅에 활용할 때에도 매우 높은 정확도가 나온 수치인 수준이다. 해당 모델을 이용해서 이전 예제보다 고객등급을 효과적으로 예측할 수 있게 되었다. 새로운 고객 데이터가 들어온다면 해당 모델을 적용해서 고객등급을 예측하고 이에 따른 고객관리 방안을 수립할 수 있게 되었다.

함께 보면 좋은 콘텐츠 – 파이썬 시각화 튜토리얼

error: Content is protected !!
Scroll to Top