이번 코스에서 배우게 될 내용
- 어느 feature가 가장 중요한지 결정하는 방법
- 데이터를 바탕으로 새로운 feature를 만드는 방법
- 카테고리 변수를 고차원으로 암호화하는 방법
- k-means clustering으로 features의 집단을 생성하는 방법
- 주요 성분을 분석하여 데이터셋의 변화를 features르 분해하는 방법
Feature Engineering의 목표
문제에 적합하게 데이터를 만드는 것입니다.
실제 온도가 아니라 열과 바람의 냉기같은 겉보기 온도를 한 번 봅시다. 이러한 단위들은 공기의 온도, 습도, 풍속을 기반으로 인간에게 감지되며 직접 측정 가능한 온도를 재려고 합니다.
- 모델의 예측 성능 향상시키기
- 필요한 계산량과 데이터 감소하기
- 결과의 해석 가능성 향상
Feature Engineering의 원칙
feature가 유용하려면 모델이 학습할 대상과 관계가 있어야 합니다.
예로 선형 모델은 선형 관계만 가질 수 있습니다. 그래서 선형 모델을 사용할 때 목표는 feature와 target의 관계를 선형적으로 만들어야 하는 것입니다.
핵심은 feature에 적용한 변형은 본질적으로 모델의 일부 그자체입니다.
한 면의 길이(Lenght)에서 토지의 정사각형 구획의 가격(Price)를 예측해봅시다.
Length에 선형 모델을 맞추면 다음과 같은 좋지 않은 결과 나옵니다. 관계가 선형적이지 않기 때문이죠.
만약 Lenght feature를 제곱하여 'Area'를 구한다면, 선형 관계를 만들 수 있습니다.
그러면 선형 모델이 포물선에 맞춰집니다. 달리 말하지면, feature를 제곱하면 선형 모델이 제곱된 features에 맞게 만들수 있습니다.
Exapmle - Concrete Formulations
featrue engineering을 이해하기 위해 사람들이 조작한 feature를 이용하여 random forest 모델의 성능을 예측해볼게요.
concrete 데이터셋에는 다양한 콘크리트 형성 방식과 압축 강도에 대해 가지고 있습니다. 압축강도는 해당 종류의 콘크리트가 얼마나 많은 양을 버틸 수 있는지 알려줍니다.
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score
df = pd.read_csv("../input/fe-course-data/concrete.csv")
df.head()
콘크리트의 종류에 따른 다양한 재료를 볼 수 있습니다. 여기서 사람이 직접 만진 feature를 추가하는 방법과 이 방법이 모델 학습에 어떻게 중요한지 살펴봅시다.
일단 추가하지 않은 (un-augmented) 데이터셋에 대해서 모델을 훈련하여 준비를 해둡시다. 이는 새로운 feature가 실제로 유용한지에 대한 여부를 결정지을 때 도움이 됩니다.
이러한 준비 과정은 feature engineering의 첫 단계입니다. 이 때 얻은 점수는 새로운 feature가 가치있는지 판단할 때 도움이 됩니다. 그렇지 않다면 제거하거나 다른 feature를 사용합시다.
X = df.copy()
y = X.pop("CompressiveStrength")
# Train and score baseline model
baseline = RandomForestRegressor(criterion="mae", random_state=0)
baseline_score = cross_val_score(
baseline, X, y, cv=5, scoring="neg_mean_absolute_error"
)
baseline_score = -1 * baseline_score.mean()
print(f"MAE Baseline Score: {baseline_score:.4}")
MAE Baseline Score: 8.232
요리를 해봤다면 재료의 적정 비율을 아는 것은 중요합니다.
그렇다면 위의 features의 비율는 압축 강도를 알아내는데 좋은 예측 변수가 될 수 있습니다.
아래 코드는 데이터에 새로운 features의 비율을 추가하는 내용입니다.
X = df.copy()
y = X.pop("CompressiveStrength")
# Create synthetic features
X["FCRatio"] = X["FineAggregate"] / X["CoarseAggregate"]
X["AggCmtRatio"] = (X["CoarseAggregate"] + X["FineAggregate"]) / X["Cement"]
X["WtrCmtRatio"] = X["Water"] / X["Cement"]
# Train and score model on dataset with additional ratio features
model = RandomForestRegressor(criterion="mae", random_state=0)
score = cross_val_score(
model, X, y, cv=5, scoring="neg_mean_absolute_error"
)
score = -1 * score.mean()
print(f"MAE Score with Ratio Features: {score:.4}")
MAE Score with Ratio Features: 7.948
분명 성능은 향상되었을 것입니다.
새로운 feature의 비율이 이전에 탐지되지 않았던 중요한 정보를 모델에 노출 시켰다는 증거입니다.
'Machine Learning > [Kaggle Course] Feature Engineering' 카테고리의 다른 글
Mutual Information (0) | 2021.06.14 |
---|