빅데이터분석기사/개념

[빅데이터분석기사] 랜덤포레스트(Random Forest)

EveningPrimrose 2022. 6. 2. 00:05
반응형

랜덤포레스트(RF)

 

  의사결정나무를 여러개 모아서 데이터 분류 및 예측을 수행하는 AI알고리즘이다. 어떤 데이터 집단에 대한 분류나 예측을 실시한다고 할 때, 하나의 결정트리를 사용하는 것보다 여러 트리를 결합해서 사용하면 보다 높은 성능의 알고리즘 모형을 만들 수 있다.

 

랜덤포레스트 구성 예시

 

여러 나무와 하나의 포레스트, 배깅(Bagging, Bootstrap Aggregationg)

 

  결정트리를 독립병렬 결합하는 방식을 배깅이라고 한다. 원 자료에서 하위 데이터 세트를 만드는 부트스트랩 과정을 포함한다. 데이터 건수는 동일하게 그리고 데이터 무작위 추출 시 중복은 허용(복원추출)하여 각 트리 모형들이 학습할 데이터 세트를 그 수에 맞게 준비해야 한다. 가령 결정트리 서른 개를 사용한다면, 전체 자료에서 데이터를 추출하여 30개의 학습 데이터 세트를 구성해야 한다.

 

 

여러 나무와 하나의 포레스트, 부스팅(Boosting)

 

  결정트리를 연결병렬 결합하는 방식을 부스팅이라고 한다. 첫 번째 결정트리의 결과가 그 다음 결정트리의 학습 데이터 구성에 영향을 미치는 순환구조이다. 무작위 샘플 복원추출과 여러 트리의 답을 최종 결정 시 다수결의 원칙에 맞춘다는 점은 배깅과 동일하다.

 

부스팅 과정 예시

 

두 포레스트 유형 간 주요 차이 4가지

 

배깅과 부스팅의 주요 차이점

 

하나의 포레스트와 하나의 답, 다수결 원칙(Majority-Voting)

 

  결정트리가 여러 개라면 각각의 결과 역시 여러 개일 것이다. 여러 결과를 모았을 때, 그 대표 결과를 선정하는 것은 다수결 원칙에 따른다. 예를 들어, 결정트리 3개 중 2개의 결과가 '사자'라면 나머지 하나의 트리에서 '고양이'라는 결과가 나오더라도 최종의 결과는 '사자'가 된다.

 

 

랜덤포레스트의 분류모형(RandomForestClassifier)

 

  랜덤포레스트의 분류모형(RandomForestClassifier)을 활용하여 아이리스(iris)의 종 분류 시 RFC분석 과정을 알아본다. 파이썬 연습에 대표 예제인 아이리스 데이터 세트를 사용하여 모델이 스스로 아이리스의 종류를 나눈 결과를 대칭행렬(4*4)로 시각화하여 확인한다.

 

  데이터세트에는 아이리스의 속성 정보다 기록돼 있다. 잎사귀의 너비, 꽃잎의 색상 및 크기 등 총 4가지 주요 정보를 바탕으로 모델은 해당 속성 정보를 분석해 특징을 도출하고 그 특징을 기준으로 어떤 데이터가 어떤 종류의 아이리스인지 분류하게 될 것이다.

 

 

참고 소스코드

 

import numpy as np
import pandas as pd
import matplotliv.pyplot as plt
import seaborn as sns
%matplotlib inline

from sklearn import datasets

iris = datasets.loda_iris()

df = pd.DataFrame(iris.data, column=iris.feature_names)
# print(df)
# sklearn provides the iris spcies as integer values since this is required for classification
# here we're just adding a column with the species names to the dataframe for visualisation
df['species'] = np.array([iris.target_names[i] for i in iris.target])
# print(df['species'])

sns.pairplot(df, hue='species')
# 데이터 프레임으로 변경

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(df[iris.feature_names], iris.target, test_size=0.25)
# 학습/훈련데이터 구분

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=100, oob_score=True, random_state=9999, bootstrap=True)
rf.fit(X_train, y_train)

from sklearn.metrics import accuracy_score

predicted = rf.predict(X_test)
accuracy = accuracy_score(y_test, predicted)

print(f'Out-of-bag score estimate: {rf.oob_score_:.3}')
print(f'Mean accuracy score: {accuracy:.3}')

from sklearn.metrics import confusion_matrix

cm = pd.DataFrame(confusion_matrix(y_test, predicted), columns=iris.target_names, index=iris.target_names)
sns.heatmap(cm, annot=True)

 

  의사결정나무에서 확인했던 모델이 아이리스 데이터를 언제까지 분할하는지를 상기한다. 데이터의 불순도가 낮아지는(엔트로피가 0에 가까운) 상태까지 모델이 데이터 분할을 시도할 것이다.

 

  산포도를 중심으로 보면 파란색 데이터가 가장 먼저 분류가 이뤄졌을 것이란 예상이 가능하다. 변수 간 관계와 정밀도(=모여있는 정도)가 제일 명확하기 때문이다. 문제는 데이터 중첩이 많은 주황색과 녹색 자료인데, 불순도가 최소가 되는 지점에서 여러 결정트리의 분류 결과를 계산(다수결)해 최종적으로 두 자료를 나누게 된다. 결과적으로 총 3종으로 아이리스 데이터가 표현되었다.

 

아이리스 속성 4가지의 시각화 대칭행렬

 

  scikit-learn 라이브러리에는 랜덤포레스트의 분류모형과 회귀모형 모두 있다. 랜덤포레스트 알고리즘은 이산형 자료 바탕의 '분류'와 연속형 자료 바탕의 '예측'을 목적으로 한다.

 

 

랜덤포레스트의 회귀모형(RandomForestRegressor)

 

  랜덤포레스트의 회귀모형(RandomForestRegressor)을 활용하여 와인 맛 평가에 가장 중요한 요인이 무엇인지 확인한다. 여기서는 와인 성분이 정리된 정보표를 RFR모델에 학습시키고 해당 모델의 어떤 성분이 와인 종류를 나누는 데 가장 큰 영향을 미치는 성분인지를 예측하는 과정을 확인한다.

 

 

소스코드와 설명

 

nrows = len(xList)
ncols = len(xList[0])
X = numpy.array(xList)
Y = numpy.array(labels)
wineNames = numpy.array(names)
# print(X); print(Y); print(wineNames)

# 데이터 행의 30%로 고정된 홀드 아웃 세트 구성
xTrain, xTest, yTrain, yTest = train_test_split(X, Y, test_size=0.3, random_state = 531)
# print(xTrain); print(xTest); print(yTrain); print(yTest)

# MSE의 변화를 확인하기 위하여 앙상블의 크기 범위에서 랜덤포레스트 트레이닝
mseOos = []
nTreeList = range(50, 500, 10)
for iTrees in nTreeList:
 depth = None
 maxFeat = 4
 wineRFModel = ensemble.RandomForestRegressor(n_estimators = iTrees,
               max_depth = depth, max_features = maxFeat,
               oob_score = False, random_state = 531)
 wineRFModel.fit(xTrain, yTratin)
 
 # 데이터 세트에 대한 MSE 누적
 prediction = wineRFModel.predict(xTest)
 mseOos.append(mean_squared_error(yTest, prediction)

print("MSE")
print(mseOos[-1])

# 트레이닝 테스트 오차 대비 앙상블의 트리 개수 도표 그리기
plot.plot(nTreeList, mseOos)
plot.xlable('Number of Trees in Ensemble')
plot.ylable('Mean Square Error')
# plot.ylim([0.0, 1.1*max(mseOob)])
plot.show()

 

 

랜덤포레스트(Random Forest) : 실습

 

  랜덤포레스트에서 결정트리의 수가 정확도를 항상 보장하진 않는다. 아래 그림에서처럼 알고리즘은 결정트리의 적정한 수와 더불어 원 자료를 근거로 마련된 데이터 학습이 잘 선행되어야 일정 수준의 성능을 기대할 수 있다.

결정트리의 개수와 오류 발생의 관계 검정

 

  와인 종류 정보를 포함해 와인을 구성하는 성분표 데이터 세트를 RF회귀 모델에 학습시키고 해당 모델에서 어떤 성분이 와인 맛(=종류)을 결정하는 데 유의미하게 영향을 미쳤는지를 예측한 결과이다. 그래프를 통해 확인하면 알코올(alcohol)과 산도(tile acidity) 등의 성분이 와인 맛을 가르는 중요한 성분으로 예측됐다.

 

와인 맛 평가 주요 요인 분석 결과

 

함께 보면 좋은 글

 

[빅데이터분석기사/개념] - [빅데이터분석기사] 앙상블(Ensemble)

 

[빅데이터분석기사] 앙상블(Ensemble)

앙상블 학습(Ensemble Learning) 그동안 우리는 여러 기계학습 모델들을 살펴보았다. 이렇게 개별적으로 동작하는 모델들을 모아 종합적으로 의사결정을 한다면 어떨까? 앙상블은 프랑스어로 전체적

it-utopia.tistory.com

 

[빅데이터분석기사] 서포트벡터머신(SVM)

 

[빅데이터분석기사] 서포트벡터머신(SVM)

서포트벡터머신(SVM) 분류를 위한 기준선을 정의하는 모델이다. 분류되지 않은 새로운 점이 나타나면 어느 쪽에 속하는지 확인을 위해서 결정 경계를 정한다. 데이터에 2개 속성(feature)만 있다면

it-utopia.tistory.com

 

[빅데이터분석기사] 군집분석(Clustering Analysis)

 

[빅데이터분석기사] 군집분석(Clustering Analysis)

군집분석 분류 기준이 없는 상태에서 데이터 속성을 고려해 스스로 전체 데이터를 N개의 소그룹으로 묶어내는(Clustering) 분석법이다. 유사성이 높은 대상 데이터를 묶고, 서로 다른 그룹에 속한

it-utopia.tistory.com

 

[빅데이터분석기사] 인공신경망(Artificial Neural Network)

 

[빅데이터분석기사] 인공신경망(Artificial Neural Network)

핵심요약 인공신경망(ANN)은 기계학습과 인지과학 분야에서 고안한 학습 알고리즘이다. 신경세포의 신호 전달체계를 모방한 인공뉴런(노드)이 학습을 통해 결합 세기를 변화시켜 문제를 해결하

it-utopia.tistory.com

 

[빅데이터분석기사] 심층신경망(Deep Neural Network)

 

[빅데이터분석기사] 심층신경망(Deep Neural Network)

핵심요약 심층신경망(Deep Neural Network)은 인공신경망(Aritificial Neural Network)과 동일한 구조와 동작 방식을 갖고 있다. 심층신경망은 단지 인공신경망에서 은닉층(Hidden Layer)의 깊이가 깊어진 형태를

it-utopia.tistory.com

 

반응형