포스트 난이도: HOO_Middle
# Random Forest: 머신러닝 알고리즘
우선 Random Froest에 대해서 간략하게 요약하자면 아래와 같다. 내가 중요하게 생각되는 특징만 작성해 두었으니 구체적인 내용이 궁금하다면 댓글을 남기거나 아래의 IBM 설명을 살펴보는 것도 좋다.
랜덤 포레스트(Random Forest)는 회귀 (Regression) 및 분류 (Classifiy) 작업을 위한 앙상블 학습 방법이다. 학습 중 여러 개의 결정 트리를 구축하고 최종 예측을 위해 그 출력을 결합한다. 이러한 방식의 학습 방법을 앙상블 학습 방법이라고 부른다. 한마디로 머신러닝 특성상 여러 학습 알고리즘이 같이 이뤄지며, 아래의 Figure 1 예제에서 voting / Averaging이 결합된 학습 알고리즘 ("앙상블")에 해당한다.
또한 Figure 1을 보면 여러 개의 Decision Trees들이 존재하고 각 트리 마다도 여러 경우의 수들로 나눠진다. 이를 통해서 예측 모델에 대한 정확도를 높일 수 있다. 왜냐하면 예측 모델이라는 것이 사실상 학습한 방식을 바탕으로 주어지지 않은 조건에 대해서 어떤 결과를 산출할지 테스트하는 것을 의미하기 때문이다. 결국 마지막 결과에 Voting이 이뤄지지만 안의 산출되는 알고리즘 방식이 트리 형식을 가지고 있으며 랜덤 하게 산출이 되기 때문에 Random Forest라고 부른다.
랜덤 포레스트 작동 방식은 다음과 같다.
- 부트스트래핑(Bootstrapping): 원본 데이터에서 대체 표본 추출을 통해 여러 하위 집합을 만든다. 각 하위 집합은 별도의 결정 트리를 훈련하는 데 사용된다.
- 무작위 피처 선택(Random Feature Selection): 결정 트리의 각 분할에 대해 피처의 무작위 하위 집합만 고려된다. 이를 통해 무작위성을 추가하고 트리 간 상관관계를 줄인다.
- 예측(Prediction): 회귀에서는 모든 결정 트리 예측의 평균이 최종 출력이다. 분류에서는 모든 트리에서 다수결 투표를 한다.
랜덤 포레스트를 사용하는 이유는 다음과 같다.
- 과적합 처리: 결정 트리는 데이터를 과적 합하는 경우가 많다. 랜덤 포레스트는 여러 트리를 결합하여 과적합을 줄인다.
- 누락 또는 노이즈 데이터 처리: 노이즈 데이터와 누락된 값을 처리하며, 결과를 여러 트리에서 평균 내어 처리한다.
- 피처 중요도 처리: 자동으로 피처 중요도를 계산하여 각 피처가 모델의 예측에 얼마나 기여하는지 보여준다.
- 대규모 데이터셋 처리: 많은 피처를 가진 대규모 데이터셋도 큰 성능 저하 없이 처리할 수 있다.
# 언제 쓰나요?
나의 경우 랜덤 포레스트는 AI agent based model를 할 때 사용하는 편이다. 특히 데이터 양이 5000개 이상이 넘어가며 여러 Factors(요인)들이 많아 설계하기가 어렵거나 (사실 귀찮음) 복잡할 경우 먼저 각 요인들의 영향력과 예측 모델의 정확도를 살펴보기 위해 사용한다. Random Forest는 예측 모델을 테스트하는데 좋다고 하지만 반대로 생각하면 Regression을 통해서 각 요인들이 주는 영향력을 분석하는데도 도움이 된다. 한마디로 Open field와 같이 외부적 환경 요인이 많고 변동성이 큰 데이터셋일수록 노이즈 데이터 처리와 함께 분류 및 회귀 방식을 토대로 각 요인을 분석하는데 효과적이다. 마지막으로 내가 가장 중요하게 생각하는 요소 중 하나는 편리하고 간단하기 때문이다. 파이썬의 경우 Random forest는 sklearn 패키지를 통해서 손쉽게 사용이 가능하다.
# Example Codes
아래는 랜덤 포레스트 알고리즘을 사용해서 주어진 데이터셋의 Factors들의 중요도로를 분석하고 지정하여 예측 값을 살펴보는 모델링이다. 예제코드는 실제로 내가 사용하는 포맷이며, 아래의 포맷을 기반으로 원하는 방식으로 바꿔서 사용하면 편리하다. 한마디로 아래의 코드는 뼈대만 있는 큰 틀이며 여기에 필요한 기능을 추가하거나 수정해 줘서 말 그대로 살을 붙여줘야 한다.
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
import joblib
# Load dataset
file_path = 'Dataset.csv'
df = pd.read_csv(file_path)
# Define features and target
X = df.drop(columns=['Factor1', 'Factor2'])
y = df['Extinguisher (Minute)']
# Feature Importance Analysis: Baseline
rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X, y)
# Feature importance
importances = rf.feature_importances_
feature_importance_df = pd.DataFrame({
'Feature': X.columns,
'Importance': importances
}).sort_values(by='Importance', ascending=False)
print("Feature Importance:\n", feature_importance_df)
# Drop low-importance features
low_importance_features = ['Factor3', 'Factor4', 'Factor5']
X = X.drop(columns=low_importance_features)
# Train-test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Hyperparameter tuning with GridSearchCV
param_grid = {
'n_estimators': [100, 200, 300],
'max_depth': [10, 20, None],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 4]
}
grid_search = GridSearchCV(estimator=RandomForestRegressor(random_state=42),
param_grid=param_grid,
cv=5,
scoring='r2',
n_jobs=-1)
grid_search.fit(X_train, y_train)
# Best model
best_rf = grid_search.best_estimator_
print("Best Parameters:", grid_search.best_params_)
# Evaluate the model
y_pred = best_rf.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
print(f"R² Score: {r2}")
# Feature Importance (Optimized Model)
importances = best_rf.feature_importances_
feature_names = X.columns
# Plot feature importance
plt.figure(figsize=(10, 6))
plt.barh(feature_names, importances, color='pink')
plt.xlabel('Importance')
plt.ylabel('Feature')
plt.title('Feature Importance')
plt.show()
# Save the optimized model
joblib.dump(best_rf, 'optimized_predictor.pkl')
# Test prediction with new data
new_data = pd.DataFrame({
'Factor3': [15.5],
'Factor4': [200],
'Factor5': [-0.9],
'Factor6': [22],
'Factor7': [2.3],
'Factor8': [10.0]
})
prediction = best_rf.predict(new_data)
print(f"Predicted Values: {prediction[0]} Values")
'Computer Science > Algorithms' 카테고리의 다른 글
[Algorithms] Heap sort(힙 정렬)란 무엇인가요? (0) | 2024.12.31 |
---|---|
[Algorithms] Network Analysis Metrics: Eccentricity, Katz Centrality and Closeness Vitality (2) | 2024.01.25 |
[Deep Learning Algorithms] Adam Optimization Algorithm(아담 최적화 알고리즘) (0) | 2022.07.31 |
[Deep Learning Algorithms] SGD(Stochastic Gradient Descent), 확률적 경사 하강법 (0) | 2022.07.29 |
[Algorithms] Topology, Network Topology (0) | 2022.07.22 |
댓글