최적의 특성 수를 구하고 해당 특성등을 이용하도록 도와주는 SelectKBest 정리.
작성할 모델의 타겟에 대한 예측 성능을 끌어올리기 위해 하는 것으로 특성의 재조합, 특성 선택, 특성 제거 가 있다.
주어진 특성 내에서 도메인 지식 또는 상식을 바탕으로 예측에 도움이 될 만한 새로운 특성을 만들어낸다.
기계학습 모델의 특성 은 우리 모델을 헷갈리에 하는 독이 되는 녀석도 있다. 이러한 특성을 과감히 쳐내고, 필요한 특성만을 선택하는 것도 중요하다.
특성공학으로는 특성을 재조합하는 방법도 있지만, 선택 그 자체도 좋은 특성공학 방법 중 하나가 될 수 있다.
주어진 데이터셋에서 특성들을 직접 시각화를 해서 보고, 상관계수를 구하는 등 다양한 EDA를 통해 추려낼 수도 있겠다.
내가 내린 결론이 전부가 아닐 수 있는 상황을 고려해 최적의 특성을 고르고, 어떤 특성들이 있는지 파악할 수 있다.
Sikit-learn의 SelectKBest를 통해 진행할 수 있다.
from sklearn.model_selection import train_test_split
# 본래 타이타닉 데이터는 타깃이 alive이므로 target을 alive로 설정해준다.
target = 'alive'
features = df.drop(columns = target).columns
df_train, df_test = train_test_split(df, test_size = 0.2, random_state = 2)
X_train = df_train[features]
y_train = df_train[target]
X_test = df_test[features]
y_test = df_test[target]
from category_encoders import OneHotEncoder
enc = OneHotEncoder(use_cat_names = True)
X_train_enc = enc.fit_transform(X_train, y_train)
X_test_enc = enc.transform(X_test)
# y_test는 null값이 있으므로 yes는 1, no는 0으로 치환한다.
y_test = [1 if i == 'yes' else 0 for i in df_test[target]]
X_train_enc
위에서 진행한 타이타닉 데이터셋을 사용하여 train, test 셋을 나눈 뒤 categorical feature를 OnehotEncoding한다. 한 화면에 담지 못하게 column이 많아져서 보니 32개로 늘어났다. 늘어난 feature를 줄여본다.
from sklearn.impute import SimpleImputer
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import mean_absolute_error, r2_score
# Null값의 처리를 위해 SimpleImputer 처리를 먼저 한다.
sim = SimpleImputer()
X_train_sim = sim.fit_transform(X_train_enc, y_train)
X_test_sim = sim.transform(X_test_enc)
X_train_sim
# 특성 선택을 위한 SelectKBest를 진행 - K는 특성 수
selector = SelectKBest(score_func = chi2, k = 10)
X_train_selected = selector.fit_transform(X_train_sim, y_train)
X_test_selected = selector.transform(X_test_sim)
# 선택된 column의 이름을 확인하는 작업
# 컬럼 수가 encoding으로 달라졌으므로 X_train_enc를 이용
all_names = X_train_enc.columns
selected_mask = selector.get_support()
selected_name = all_names[selected_mask]
selected_name
[output]
Index(['survived', 'pclass', 'sex_male', 'sex_female', 'fare', 'class_First',
'class_Third', 'who_man', 'who_woman', 'adult_male'],
dtype='object')
feature를 10개로 선택해서 최적의 feature만 뽑아서 나열했다. 파라미터는 아래와 같다.