본문 바로가기
AI/Machine-Learning

중요한 피쳐 탐색(중요도)

by Wikinist 2023. 9. 7.

사이킷런에서 학습한 모델에서 중요한 피처를 나타내는 변수는 일반적으로 다음과 같은 방법을 사용하여 얻을 수 있습니다:

피처 중요도 확인

RandomForestClassifier, RandomForestRegressor, GradientBoostingClassifier, GradientBoostingRegressor 등의 트리 기반 모델을 사용한 경우, feature_importances_ 속성을 사용하여 각 피처의 중요도를 확인할 수 있습니다.

피처 중요도 확인 방법 (Tree-based 모델)

핵심 아이디어: 트리 기반 모델(예: 랜덤 포레스트, 그래디언트 부스팅 트리)은 데이터를 분할하는 결정 트리를 사용합니다. 각 피처는 어떤 노드에서 얼마나 많이 사용되었는지에 따라 중요도를 측정합니다.

과정

모델 학습 후, 피처 중요도는 feature_importances_ 속성을 통해 확인할 수 있습니다.
feature_importances_에는 각 피처의 중요도가 포함되어 있으며, 값이 클수록 해당 피처가 모델에서 중요하다는 의미입니다.

결과 해석

높은 중요도를 가진 피처는 모델의 예측에 큰 영향을 미칩니다.
중요도가 낮은 피처는 모델에서 무시될 수 있습니다.

예시 코드 (랜덤 포레스트 모델의 피처 중요도 확인)

from sklearn.ensemble import RandomForestClassifier

# 랜덤 포레스트 모델 학습
model = RandomForestClassifier()
model.fit(X_train, y_train)

# 피처 중요도 출력
feature_importance = model.feature_importances_
print("피처 중요도:", feature_importance)

결과 해석: feature_importance에는 각 피처의 중요도가 포함되어 있으며, 이를 통해 어떤 피처가 모델에서 중요한 역할을 하는지 확인할 수 있습니다. 높은 중요도를 가진 피처는 중요한 특징으로 간주됩니다.

모델 계수 확인

선형 모델인 경우 (예: 로지스틱 회귀, 선형 회귀), 모델의 계수(coefficients)를 확인하여 각 피처의 중요도를 파악할 수 있습니다. 이 계수는 coef_ 속성을 통해 접근할 수 있습니다.

Permutation Importance

permutation_importance 함수를 사용하여 모델의 각 피처에 대한 순열 중요도(Permutation Importance)를 계산할 수 있습니다. 이 방법은 모델의 성능을 평가하고 피처의 중요도를 평가하는 데 사용됩니다.

permutation_importance 함수 시그니처

sklearn.inspection.permutation_importance(estimator, X, y, scoring=None, n_repeats=30, n_jobs='deprecated', random_state=None)

estimator: 학습한 모델 객체 (예: 분류기 또는 회귀 모델).
X: 입력 데이터 (피처).
y: 목표 변수 (타겟).
scoring: 성능 측정 지표 (예: 'accuracy', 'r2' 등). 기본값은 None으로, 모델의 타입에 따라 자동으로 선택됩니다.
n_repeats: Permutation Importance를 계산할 때 섞는 횟수를 지정합니다. 높은 값일수록 더 정확한 추정이 가능하지만 더 많은 계산 시간이 필요합니다.
n_jobs: 병렬 처리에 사용되는 작업 수. 'deprecated' 또는 정수 (기본값은 'deprecated'로 설정하여 사용하지 않음).
random_state: 난수 생성에 사용되는 시드값. 결과의 재현성을 위해 사용됩니다.

Permutation Importance 작동 방식

핵심 아이디어: 특정 피처의 중요도를 측정하기 위해 해당 피처의 값을 무작위로 섞어서 변경한 후 모델의 성능을 다시 평가합니다. 중요한 피처는 섞이면 모델의 성능에 큰 영향을 미칠 것이며, 중요하지 않은 피처는 섞어도 성능에 영향을 미치지 않을 것입니다.

과정

기존 데이터에서 선택한 피처의 값을 섞습니다.
섞인 데이터로 모델을 사용하여 예측을 수행합니다.
원래 데이터와 섞인 데이터 간의 예측 성능 차이를 계산합니다.
이 과정을 모든 피처에 대해 반복하여 각 피처의 중요도를 측정합니다.

결과 해석

피처의 중요도는 성능 차이가 클수록 크게 측정됩니다.
중요한 피처는 섞었을 때 모델의 성능이 급격히 떨어지므로 중요도가 높게 측정됩니다.

예시 코드

from sklearn.inspection import permutation_importance

# Permutation Importance 계산
perm_importance = permutation_importance(model, X_val, y_val)

# 피처별 중요도 출력
print("피처 중요도:", perm_importance.importances_mean)

결과 해석: perm_importance.importances_mean에는 각 피처의 중요도가 포함되어 있습니다. 이 값을 통해 어떤 피처가 모델에 가장 큰 영향을 미치는지 확인할 수 있습니다. 값이 높은 피처는 중요한 피처로 간주됩니다.

"Permutation Importance"는 모델의 피처 중요도를 해석하는 데 유용하며, 피처 선택 및 모델 개선을 위한 결정에 도움을 줄 수 있습니다.

SelectKBest 또는 SelectPercentile

SelectKBest 또는 SelectPercentile과 같은 feature selection 메서드를 사용하여 피처 선택을 수행할 수 있습니다. 이를 통해 가장 중요한 피처를 선택할 수 있습니다.

SelectKBest 함수 시그니처

sklearn.feature_selection.SelectKBest(score_func, k='all')


score_func: 피처 선택에 사용할 통계적 테스트 또는 스코어 함수입니다. 이 함수는 피처의 중요도를 평가합니다.
k: 선택할 피처의 개수를 나타내는 정수 또는 'all'로 지정할 수 있습니다. 'all'로 설정하면 모든 피처가 선택됩니다.

score_func

SelectKBest에서 score_func로 사용할 수 있는 함수들은 피처 선택에 사용되는 통계적 테스트 또는 스코어 함수입니다. 이러한 함수들은 각각의 피처가 타겟 변수와 어떤 관련성을 가지는지를 측정하고, 중요한 피처를 선택하는 데 도움을 줍니다. 아래에 몇 가지 일반적인 score_func 함수들을 소개합니다:

f_classif

용도: 분류(Classification) 문제에서 사용됩니다.
적합한 경우: 연속형 피처와 이산형(범주형) 타겟 변수 간의 중요도를 평가할 때 적합합니다. 이것은 피처의 분산과 클래스 간의 분산을 비교하여 중요도를 결정합니다.
예시: 연령(연속형)과 구매 여부(이산형) 간의 중요성을 평가하고자 할 때 사용됩니다.

mutual_info_classif

용도: 분류(Classification) 문제에서 사용됩니다.
적합한 경우: 피처와 클래스 간의 상호 의존성을 측정하고 중요도를 결정할 때 사용됩니다. 피처와 클래스 간의 관계가 얼마나 강한지를 나타냅니다.
예시: 텍스트 분류에서 단어(피처)와 카테고리(클래스) 간의 중요도를 평가하고자 할 때 사용됩니다.

chi2

용도: 분류(Classification) 문제에서 사용됩니다.
적합한 경우: 범주형 피처와 범주형 타겟 변수 간의 독립성을 검정하고 중요도를 평가할 때 사용됩니다. 카이제곱 검정을 통해 중요도를 결정합니다.
예시: 범주형 피처(예: 성별)와 분류 결과(예: 질병 발생 여부) 간의 중요성을 평가하고자 할 때 사용됩니다.

f_regression

용도: 회귀(Regression) 문제에서 사용됩니다.
적합한 경우: 연속형 피처와 연속형 타겟 변수 간의 중요도를 평가할 때 사용됩니다. 피처의 분산과 타겟 변수 간의 분산을 비교하여 중요도를 결정합니다.
예시: 주택 가격 예측과 같은 회귀 문제에서 피처(예: 방의 개수)의 중요성을 평가하고자 할 때 사용됩니다.

mutual_info_regression

용도: 회귀(Regression) 문제에서 사용됩니다.
적합한 경우: 피처와 타겟 변수 간의 상호 의존성을 측정하고 중요도를 결정할 때 사용됩니다. 피처와 타겟 변수 간의 관계가 얼마나 강한지를 나타냅니다.
예시: 주택 가격 예측과 같은 회귀 문제에서 피처(예: 주변 학군의 평가)의 중요성을 평가하고자 할 때 사용됩니다.

이외에도 사용 가능한 다른 함수들이 있을 수 있으며, 특정 문제에 가장 적합한 score_func 함수를 선택하는 것이 중요합니다. 예를 들어, 분류 문제와 회귀 문제에서 각각 적절한 함수를 선택하여 피처 선택을 수행할 수 있습니다.

SelectKBest 작동 방식

핵심 아이디어: 모든 피처에 대해 통계적인 테스트를 수행하고, 가장 높은 점수를 가진 K개의 피처를 선택합니다. 이 점수는 각 피처의 예측 능력을 측정하는 데 사용됩니다.

과정

각 피처와 타겟 변수 간의 통계적 테스트(예: ANOVA, chi-squared, mutual information)를 수행하여 각 피처에 점수를 부여합니다.
피처들의 점수를 내림차순으로 정렬하고, 상위 K개의 피처를 선택합니다.

결과 해석

선택된 K개의 피처는 데이터에서 가장 중요하다고 간주됩니다.
나머지 피처들은 버려지거나 무시됩니다.

예시 코드 (SelectKBest 사용 예시)

from sklearn.feature_selection import SelectKBest, f_classif

# SelectKBest 객체 생성
selector = SelectKBest(score_func=f_classif, k=5)

# 피처 선택
X_new = selector.fit_transform(X_train, y_train)

결과 해석: 위 코드에서는 f_classif 테스트를 사용하여 피처를 선택하고, k 매개변수를 통해 선택할 피처의 개수를 지정합니다. 이를 통해 선택된 피처는 모델 학습에 사용되며, 나머지 피처는 제거됩니다.

"SelectKBest"를 사용하면 모델의 복잡성을 줄이고 불필요한 피처를 제거하여 예측 성능을 향상시킬 수 있습니다. "SelectPercentile"은 비슷한 방식으로 작동하지만 피처의 비율을 선택하는 데 사용됩니다.

이러한 방법 중에서 적합한 방법을 선택하여 모델에서 중요한 피처를 확인할 수 있습니다.

피처 중요도 확인은 모델 해석과 피처 선택에 유용하며, 데이터 과학 및 머신러닝 프로젝트에서 피처 엔지니어링과 모델 개선에 도움을 줍니다.

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.

'AI > Machine-Learning' 카테고리의 다른 글

계층적 군집화(Hierarchical Clustering)  (0) 2023.09.08
[NumPy] newaxis  (0) 2023.09.08
[Pandas] interpolate()  (0) 2023.09.07
[statsmodels] variance_inflation_factor() - VIF  (0) 2023.09.07
[patsy] dmatrices  (0) 2023.09.07