1. 피처 선택(Feature Selection)
모든 피처가 모델의 성능 향상에 도움을 주는 것은 아닙니다.
불필요한 피처들이 많으면 모델이 데이터의 노이즈나 우연한 패턴까지 과도하게 학습하게 됩니다.
이렇게 되면 새로운 데이터에 대한 예측성능이 떨어지게 됩니다.
불필요한 피처가 많으면 모델이 데이터의 본질보다는 노이즈에 매몰되어 버립니다.
이를 과적합(overfitting)이라고 합니다.
따라서 중요한 피처들만 선별하여 사용하는 것이 바람직합니다.
피처선택은 모델의 복잡도를 줄이고, 학습 시간을 단축하며, 모델의 해석을 용이하게 할 수 있는 매우 실용적으로 중요한 과정입니다.
2. 피처 선택을 해야하는 상황
1) 많은 수의 피처가 있는 경우
각 피처의 영향력을 검증하지 않고 모든 피처를 모델에 사용하는 것은 처리 시간과 리소스를 낭비하고 모델의 성능을 저하시킬 수 있습니다.
2) 피처 간 높은 상관관계가 있는 경우
피처들 사이에 높은 상관관계가 있는 경우, 이들은 중복 정보를 제공하고 모델의 해석을 어렵게 만들 수 있습니다.
이를 다중 공선성 문제라고 합니다.
3) 노이즈 피처가 포함된 경우
타겟 변수와의 관계가 불명확하거나 아예 관련이 없는 피처가 포함되어 있을 수 있습니다.
이러한 노이즈 피처는 모델이 중요하지 않은 패턴에 주의를 기울이게 만들어, 예측의 정확도를 떨어뜨리고, 학습 과정에서의 혼란을 초래할 수 있습니다.
4) 계산 비용을 절감해야 할 경우
피처의 수가 많은 대규모 데이터셋을 다룰 때, 모델 학습에 소요되는 시간과 필요한 컴퓨팅 파워는 기하급수적으로 증가 할 수 있습니다.
중요하지 않거나 불필요한 피처를 데이터셋에서 제거함으로써, 모델 학습에 필요한 계산 비용을 크게 절감할 수 있습니다.
3. 피처 선택 기법
1) 필터 방법 (Filter Methods)
필터 방법은 모델 학습 전에 피처들의 통계적 특성을 평가하여 중요도를 측정합니다.
상관계수, 상호정보량, 카이제곱 검정 등의 기법을 사용해 각 피처와 타겟 변수 간의 통계적 연관성을 계산합니다.
연관성이 낮은 피처들을 제거하고, 중요도가 높은 피처들만 남깁니다.
예를 들어 주식 가격 예측 모델에서 상관계수를 계산하면, 기업의 순이익과 같은 재무 피처는 주가와 강한 상관관계가 있을 것입니다. 반면 기상 정보는 주가와 연관성이 낮으므로 중요도 점수를 받아 제거 대상이 됩니다.
장점: 계산 비용이 낮고 빠르며, 대규모 데이터에도 스케일링이 용이합니다.
단점: 피처 간 상호작용을 고려하지 않습니다.
필터 방법을 통해 모델에 사용할 피처 수를 줄일 수 있으므로 모델의 복잡도를 낮추고 계산 효율을 높일 수 있습니다.
2) 래퍼 방법 (Wrapper Methods)
래퍼 방법은 피처 선택 과정에서 아주 실질적인 접근을 취합니다.
이 방식은 실제로 데이터를 바탕으로 모델을 여러 번 학습시키면서, 각각의 피처 집합이 얼마나 좋은 성능을 내는지를 평가합니다.
피처를 하나씩 추가하거나 제거하는 과정을 단순히 개별 피처의 중요도를 넘어서, 피처들 간의 상호작용이 모델 성능에 미치는 복합적인 영향을 함께 평가합니다.
이를 통해 최적의 피처 조합을 찾아냅니다.
예를 들어 최초에 모든 피처를 가지고 모델을 학습시키기 시작합니다. 이후에는 피처들을 하나씩 빼보면서, 모델의 성능이 어떻게 변하는지를 살펴봅니다. 만약 어떤 피처를 뺐을 때 모델의 성능이 개선된다면, 그 피처는 제거하는 것이 좋습니다. 반대로 성능이 떨어진다면, 그 피처는 모델에 필요한 중요한 요소라는 뜻이므로 다시 포함시킵니다.
장점: 모델의 실제 성능을 기준으로 피처를 선택합니다. 이는 피처 선택 과정에서 매우 정확한 기준을 제공합니다.
단점: 계산 비용이 상당히 높아집니다. 한 모델에 특정 피처 집합만 학습할 경우를 위협요소로 남길 수 있습니다.
3) 임베디드 방법 (Embedded Methods)
임베디드 방법은 피처 선택을 모델 학습 과정 자체에 내장하는 매우 효율적인 접근법입니다.
이 방식에서는 모델이 스스로 피처의 중요도를 계산하고, 그 중요도를 바탕으로 어떤 피처를 사용할지를 결정합니다.
즉, 피처 선택과 모델 학습이 동시에 이루어지게 됩니다.
의사결정트리 모델 혹은 이를 기반으로 한 앙상블 모델을 학습시키면서 살펴 본 바와 같이 학습 과정에서 모델이 측정한 피처의 중요도 값을 얻을 수 있습니다. 여기서 중요도가 낮은 피처는 제외하고 중요 피처만으로 최종 모델을 만듭니다.
장점: 계산 효율성과 모델 성능을 모두 고려할 수 있습니다.
단점: 모델 종류에 따라 사용 가능 여부가 달라집니다.
4. 피처 선택 코드(임베디드 방법)
4.1 데이터셋 로드
import numpy as np
import pandas as pd
train_credit = pd.read_csv('train_credit.csv')
# 상위행 출력
display(train_credit.head())
# 컬럼명 출력
display(train_credit.columns)
# 컬럼 갯수
num_features = len(train_credit.columns)-1
display(num_features)
4.2 기본 성능 검증
from sklearn.metrics import accuracy_score, precision_score,recall_score,f1_score
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
X = train_credit.drop('credit', axis=1);
y = train_credit['credit']
X_train, X_val, y_train, y_Val = train_test_split(X, y, test_size=0.20, random_state=42)
model_rf = RandomForestClassifier(random_state = 42)
# 모델 학습
model_rf.fit(X_train,y_train)
# 예측
y_pred = model_rf.predict(X_val)
# accuracy
accuracy = accuracy_score(y_Val, y_pred)
# precision
precision = precision_score(y_Val, y_pred, average='macro')
# recall
recall = recall_score(y_Val, y_pred, average='macro')
# f1 score
f1 = f1_score(y_Val, y_pred, average='macro')
display(f'Accuracy: {accuracy}')
display(f'Precision: {precision}')
display(f'Recall: {recall}')
display(f'F1-Score: {f1}')
4.3 피처 중요도 구하기
import matplotlib.pyplot as plt
df_feature_importances_dt = pd.DataFrame({'Feature': X.columns, 'Importance': model_rf.feature_importances_})
df_feature_importances_dt = df_feature_importances_dt.sort_values(by='Importance', ascending=False).reset_index(drop=True)
display(df_feature_importances_dt)
4.4 피처 중요도 시각화
low_importance_criteria = 0.015
ylimit_val = 0.05
# 피처 중요도를 수직 바 그래프로 시각화
fig, ax = plt.subplots(figsize=(8, 4))
ax.bar(X.columns, model_rf.feature_importances_, color='skyblue')
ax.hlines(low_importance_criteria, 0, len(X.columns)-1 , colors='r', linestyles='dotted', label='low criteria')
ax.set_xticks(range(len(X.columns))) # X축에 대한 틱 위치 설정
ax.set_xticklabels(X.columns, rotation=45, ha="right") # X축에 대한 레이블 설정
ax.set_xlabel("Feature") # X축 레이블
ax.set_ylabel("Feature Importance") # Y축 레이블
ax.set_ylim(0, ylimit_val) # Y축 범위
ax.set_title("Feature Importance in Linear Regression Model") # 그래프 제목 설정
plt.tight_layout()
plt.show()
4.5 특정 값 이하의 특성 중요도 갖는 피처 제거
low_feature_importances = df_feature_importances_dt[df_feature_importances_dt['Importance'] < low_importance_criteria]['Feature'].values.tolist()
low_feature_importances
['job_type_4',
'job_type_3',
'work_phone',
'job_type_1',
'email',
'income_type_1',
'family_type_1',
'family_type_2',
'income_type_2',
'house_type_2',
'family_type_0',
'house_type_1',
'job_type_0',
'house_type_0',
'income_type_0']
4.6 검증 성능 변화 확인
train_credit_test1 = train_credit.copy()
X = train_credit_test1.drop(low_feature_importances + ['credit'], axis=1);
y = train_credit_test1['credit']
X_train, X_val, y_train, y_Val = train_test_split(X, y, test_size=0.20, random_state=42)
model_rf = RandomForestClassifier(random_state = 42)
model_rf.fit(X_train,y_train)
y_pred = model_rf.predict(X_val)
accuracy = accuracy_score(y_Val, y_pred)
precision = precision_score(y_Val, y_pred, average='macro')
recall = recall_score(y_Val, y_pred, average='macro')
f1 = f1_score(y_Val, y_pred, average='macro')
display(f'Accuracy: {accuracy}')
display(f'Precision: {precision}')
display(f'Recall: {recall}')
display(f'F1-Score: {f1}')
'머신러닝 > 머신러닝: 심화 내용' 카테고리의 다른 글
머신러닝 앙상블 기법 1 : 보팅(Voting) (0) | 2024.12.26 |
---|---|
LightGBM 모델 (0) | 2024.12.25 |
피처 중요도(Feature Importance) (0) | 2024.12.24 |
피처 생성(Feature Generation) 2 : 다항식 피처 생성 (0) | 2024.12.24 |
피처 생성(Feature Generation) 1 : Binning 기법 (0) | 2024.12.23 |