디지털전환 궤도 ③ 비즈니스 분석/머신러닝 기반 분석

머신러닝 기반 데이터 탐색 : 변수 중요도 (Feature Importance)

모딜리아니 연구실 (Lab, Modigliani) 2024. 9. 1. 11:28

변수 중요도 (Feature Importance)는 각 변수가 모델이 하나의 값을 정확히 예측 또는 분류하는데 얼마나 중요한지를 나타내는 지표다. 예를 들면 매출 변화에 날씨, 계절 등등 여러 변수들이 얼마나 영향을 끼치는지를 나타낸 수치다. 그래서 예측 및 분류모델에 따라 피처 중요도를 계산 방법이 조금씩 다르다. 가장 일반적인 측정방법은 다음과 같다. 

  Decision Trees (의사결정 나무)

의사결정 나무 모델에서의 변수 중요도는 각 변수가 결과값을 얼마나 잘 분류하는데 기여했는지를 계산한다. 특정 변수를 사용한 분류로 인해 발생하는 불순도의 감소(예: 지니 불순도 감소 또는 엔트로피 감소 등 기준은 여러 가지가 될 수 있다)가 클수록 해당 변수의 중요도가 높게 평가된다.

  Random Forests (랜덤 포레스트)

랜덤 포레스트는 여러 개의 의사결정 트리 모델을 조합한 앙상블 모델이기에, 변수중요도를 구할 때도 각 트리모델의 피처 중요도를 평균내어서 최종 피처 중요도를 계산한다. 조금 더 깊이 들어가면, 랜덤 포레스트에서 피처 중요도를 계산하는 일반적인 방법은 각 피처가 불순도를 얼마나 감소시켰는지에 대한 평균을 계산하는 Mean Decrease Impurity (MDI), 특정 변수를 무작위로 섞어 모델의 성능이 얼마나 떨어지는지를 측정하고, 성능이 크게 떨어지면 그 변수는 중요한 피처로 간주하는 Mean Decrease Accuracy (MDA)가 있다. 그레디언트 부스팅 ( GBM  : Gradient Boosting Machines) 모델도 랜덤 포레스트와 변수중요도 측정방식은 비슷하다. 

아래에서 랜덤 포레스트 모델을 이용한 Feature Importance 측정 예시이다.

1) 환경설정

# 필요한 라이브러리 설치 및 임포트
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

2) 예시 데이터 생성

# 예제 데이터세트 생성
np.random.seed(42)  # 재현성을 위해 랜덤 시드 고정

# 데이터 생성
n_samples = 1000
data = {
    'Advertising': np.random.normal(100, 10, n_samples),  # 광고비
    'Promotion': np.random.normal(20, 5, n_samples),  # 프로모션
    'Customer_Satisfaction': np.random.normal(4, 0.5, n_samples),  # 고객만족도
    'Product_Quality': np.random.normal(3, 1, n_samples),  # 제품 품질
    'Seasonality': np.random.choice([0, 1], n_samples),  # 계절성 (0: 비수기, 1: 성수기)
    'Competitor_Activity': np.random.normal(50, 10, n_samples),  # 경쟁사 활동
}

# 매출 = 광고비 * 0.3 + 프로모션 * 0.5 + 고객만족도 * 20 + 제품 품질 * 10 + 계절성 * 100 + 랜덤 노이즈
data['Sales'] = (
    data['Advertising'] * 0.3 +
    data['Promotion'] * 0.5 +
    data['Customer_Satisfaction'] * 20 +
    data['Product_Quality'] * 10 +
    data['Seasonality'] * 100 +
    np.random.normal(0, 10, n_samples)  # 랜덤 노이즈 추가
)

df = pd.DataFrame(data)

df

위 코드를 실행하면 예시 아래와 같이 더미데이터 df 를 볼 수 있다

3) 랜덤 포레스트 모델 개발

매출액에 가장 영향을 끼치는 요소들을 보고자 하는 것이기 때문에 Sales 컬럼을 y 값으로 설정하고, 다른 변수들을 x값으로 설정한다.

# 모델훈련 입력데이터 분할
X = df.drop('Sales', axis=1)
y = df['Sales']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 랜덤 포레스트 모델 훈련
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

4) Feature Importance 측정

# Feature Importance 계산
feature_importances = model.feature_importances_

# Feature Importance 시각화
features = X.columns
importance_df = pd.DataFrame({'Feature': features, 'Importance': feature_importances})
importance_df = importance_df.sort_values(by='Importance', ascending=False)

plt.figure(figsize=(10, 6))
plt.barh(importance_df['Feature'], importance_df['Importance'])
plt.xlabel('Feature Importance')
plt.title('Feature Importance of Each Factor on Sales')
plt.gca().invert_yaxis()
plt.show()

위 코드를 실행하면 아래와 같이 각 요소별 영향력을 확인 할 수 있다. 계절성(Seasonality)에 의해 매출(Sales)이 크게 좌지우지되는 것을 볼 수 있다

 

마지막으로 변수중요도가 변수들의 영향력을 확인할 수 있는 좋은 방법이긴 하지만 단점이 있다. 바로 모델 의존도인데, 변수 중요도는 위 설명에서처럼 특정 머신러닝 모델마다 측정방법이 달라진다. 그래서 여러 모델을 통해 변수 중요도를 측정할 경우 서로 다른 결과가 나오는 난처한 결과가 나올 수도 있다.

반응형