파이썬으로 랜덤 포레스트 분석

원문 출처

이 글에서는 기계학습의 알고리즘 중의 하나인 Random forest을 간략하게 사용해보도록 하겠습니다. 그래서 구체적인 Random forest의 이론은 생략하도록 할게요. 대신에 저와 같이 기계학습을 배우려는 초보자가 흥미를 느낄 방법론 위주로 작성했습니다.

파이썬의 유명 라이브러리인 Scikit-learn을 이용할거에요.

예제 데이터

Scikit-learn에는 예제로 사용할 수 있는 데이터가 이미 포함되어 있습니다. 가짜가 아닌 진짜 데이터들이고, 몇몇은 아주 유명한 것이죠. 여기서는 Iris 데이터를 써볼거에요.

In [2]:
import numpy as np
import pandas as pd
import seaborn as sns

%matplotlib inline

from sklearn import datasets

iris = datasets.load_iris()

Random forest으로 데이터 분류하기

첫번째로 우리는 아주 간단한 분류작업을 해보겠습니다. Iris데이터를 pandasdataframe으로 만들고 시각화 라이브러리인 seaborn으로 그림을 그려볼게요.

In [3]:
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# sklearn provides the iris species 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])

sns.pairplot(df, hue="species")
Out[3]:
<seaborn.axisgrid.PairGrid at 0x7f716547fd30>
No description has been provided for this image

그림이 아주 멋집니다. 자세히 살펴보면 파란색의 setosapetal lengthpetal width에서 다른것들과 구별이 되는것을 알 수 있구요. 다른 두 종은 구별이 쉬워 보이지는 않아 보입니다. 이 정도면 분석에 앞서 충분히 살펴본것 같군요.

본격적으로, 분석을 시작하도록 하죠. 먼저 데이터를 trainingtest 세트로 나누겠습니다. 보통 75/25의 비율로 나누기 때문에 우리도 일단은 그렇게 하도록 하겠습니다.

파이썬에서는 다음과 같이 한줄의 코드로 해결 할 수 있죠.

In [17]:
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,
    stratify=iris.target,
    random_state=123456,
)

traning세트가 준비가 되었으니 Scikit-learn을 사용해 모델을 만들어 볼게요. 대부분의 설정은 기본값으로 두지만 out-of-bag estimateTrue 값으로 변경하겠습니다.

out-of-bag score은 예측이 얼마나 정확한가에 대한 추정을 수치로 나타낸 것입니다.

실제 예측의 정확도를 계산해서 두개의 값이 얼마나 비슷한지 보도록 할게요.

In [6]:
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=100, oob_score=True, random_state=123456)
rf.fit(X_train, y_train)
Out[6]:
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', max_leaf_nodes=None,
            min_impurity_split=1e-07, min_samples_leaf=1,
            min_samples_split=2, min_weight_fraction_leaf=0.0,
            n_estimators=100, n_jobs=1, oob_score=True,
            random_state=123456, verbose=0, warm_start=False)

이제 우리가 만든 모델을 가지고 test 세트를 분류해보겠습니다.

In [8]:
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}")
Out-of-bag score estimate: 0.973
Mean accuracy score: 0.933

두개의 값이 서로 비슷하네요. 하지만 주의할 점이 있습니다. 이러한 간단한 비교는 진짜로 우리가 제대로된 모델을 사용 하고 있다는 것을 의미 하지는 않습니다. 시각화를 통해 보다 구체적으로 보도록 하겠습니다.

In [11]:
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)
Out[11]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f70f7448320>
No description has been provided for this image

마치며

시각화를 통해 우리의 모델이 setosa는 정확히 분류해 내고 있지만, versicolorvirginica를 구별하는데는 애를 먹고 있다는 것을 알 수 있습니다.

이렇게 간단하게 파이썬으로 Random forest를 하는 방법을 알아 보았습니다. 다음에는 더 구체적이고 심화된 내용으로 찾아 뵙겠습니다.