머신 러닝 알고리즘 : 선형 데이터

이번에는 랜덤 포레스트 알고리즘을 적용하여 동일한 데이터 세트에 대한 예측을 수행해 보겠습니다.

우선 Random Forest는 회귀 및 분류 문제 모두에 사용할 수 있는 기계 학습 방법 중 하나입니다.

의사 결정 트리라는 여러 분류 알고리즘을 결합한 앙상블 학습 방법입니다.

이름에서 알 수 있듯이 포리스트를 형성하는 데 사용되는 의사 결정 트리 모음으로 이해할 수 있습니다.

의사 결정 트리 및 랜덤 포레스트의 다이어그램

여러 의사결정나무에서 학습하여 결정한 모델이기 때문에 과적합 확률이 낮고 예측 성능이 우수합니다.

또한 입력값이 여러 개인 경우 1차원 회귀분석 대신 변수별 가중치(중요도)를 계산한다.

훈련 데이터가 많을 때 메모리 사용량이 많고 속도가 느리다는 단점이 있지만 예측력이 강하고 모델 활용이 쉬워 다양한 인공지능 모델에 활용되고 있다.

이제 보스턴 주택 가격 추정 예에 적용된 결과를 검토해 보겠습니다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import warnings
warnings.filterwarnings('ignore')

# boston 집값 dataset 불러오기
train = pd.read_csv('train.csv')

# 수치형데이터 취합
train_data = train(('CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE',
                    'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'))

# 주어진 데이터에서 input 데이터와 output(추정하는 값) 으로 구분
X = np.array(train_data.iloc(:, 0:13))
y = np.array(train_data.iloc(:, 13))

# 주어진 데이터에서 train set 과 test set 으로 데이터를 구분
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 랜덤포레스트 회귀 모델 생성
# n_estimators : 트리의 개수, random_state : random seed 의 넘버(아무거나 상관없음)
rf = RandomForestRegressor(n_estimators=180, random_state=42)
rf.fit(X_train, y_train)

# fitting 한 모델을 통해 test data 의 target 변수를 예측
y_pred = rf.predict(X_test)

# r-squared 값 계산
r2 = r2_score(y_test, y_pred)

# 실측치와 예측치에 대한 scatter plot
plt.figure(figsize=(5,4)) 
plt.scatter(y_test, y_pred)

# 추세선 및 r-squared value 표시
z = np.polyfit(y_test, y_pred, 1)
p = np.poly1d(z)
plt.plot(y_test, p(y_test), "r--")
plt.text(20, 48, "R-squared = {:.3f}".format(r2))

# label 붙이기
plt.xlabel("Actual MEDV values")
plt.ylabel("Predicted MEDV values")
plt.title("Predicted MEDV values by RF")
plt.grid(True)
plt.show()

# 모델 성능 평가
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("Mean Squared Error: {:.2f}".format(mse))
print("Mean Absolute Error: {:.2f}".format(mae))
print("R-squared Score: {:.2f}".format(r2))

# column 별 가중치 계산
feature_importances = pd.DataFrame({'feature': train_data.iloc(:, 0:13).columns, 
                                    'importance': rf.feature_importances_})
feature_importances = feature_importances.sort_values('importance', ascending=False)
print(feature_importances)

Train set과 test set의 비율은 7:3으로 나누었고 나무의 수는 180개로 설정하였다.

실험 결과 180개 이상의 추정기가 같은 결과를 보여 보스턴 데이터셋에서 최적점일 가능성이 높다.

예측 성능은 r-squared 값이 0.91로 매우 양호했습니다.

또한 오른쪽과 같이 각 변수의 중요도를 계산하는 함수가 내장되어 있으니 참고하시면 유용하게 사용하실 수 있습니다.

중요도가 낮은 변수를 제외하여 재학습을 위한 피드백이나 다른 분석 방법의 성능 향상을 위한 피드백으로 유용할 것으로 기대됩니다.

다음 포스팅에서는 Neural Network Algorithm의 기초가 되는 Multi-Layer Perceptron Method에 대해 알아보도록 하겠습니다.