AI 개발 공부 공간

AI, 머신러닝, 딥러닝, Python & PyTorch, 실전 프로젝트

머신러닝/머신러닝: 심화 내용

피처 생성(Feature Generation) 1 : Binning 기법

qordnswnd123 2024. 12. 23. 11:04

1. 피처 생성(Feature Generation)

기존의 피처들만으로 충분한 예측력을 발휘하지 못한다면 피처 생성을 고려해보아야 합니다.

피처 생성은 기존 데이터에서 새로운 의미를 찾아 내거나, 데이터의 관계를 재해석하여 새로운 피처를 만드는 과정입니다.

이 과정을 통해 모델이 데이터를 더 잘 이해하고, 더 정확한 예측을 할 수 있도록 합니다.


2. 피처 생성 과정

피처 생성 과정은 EDA(탐색적 데이터 분석)로 시작합니다.

이 단계에서는 데이터를 다양한 각도에서 관찰하고 분석하여, 숨겨진 패턴이나 관계를 발견하려고 합니다.

통계적 분석, 시각화, 도메일 지식을 활용하는 것이 여기에 해당됩니다.

새로운 피처를 생성한 뒤에는 생성된 피처가 실제로 유용한지, 모델의 성능을 실제로 개선하는지 검증하는 과정이 필요합니다.

이를 위해 생성된 피처를 모델에 포함시켜 학습을 진행하고, 검증 데이터셋을 사용해 모델의 성능을 평가합니다.


3. Binning 기법

Binning 은 연속적인 수치 데이터를 구간별로 범주화하는 기법입니다.

이 방법은 데이터의 세부적인 차이를 줄이고, 주요 패턴이나 경향성을 더 명확하게 파악할 수 있도록 해줍니다.

 

1) 이상치의 영향 감소

만일 연속형 변수로 이루어진 특정 피처 극단적인 값이 다수 포함되어 있어 모델에 큰 영향을 미칠 가능성이 우려되는 상황에서 Binning을 통해 이러한 이상치의 영향력을 완화 시킬 수 있습니다.

 

2) 비선형 패턴 포착

피처변수와 타겟변수 사이에 선형적인 관계 패턴이 보이지 않고 관계가 복잡 할때, Binning 기법은 이 두 데이터간의 숨겨진 비선형 관계를 드러내는 핵심적인 수단이 될 수 있습니다.

 

3) 모델 해석의 용이성 및 변수간 관계의 단순화

연속적인 수치 데이터를 명확한 범주로 나눔으로써, 모델이 내놓은 결과를 좀 더 직관적으로 해석할 수 있습니다.


4. Binning 기법 코드

1) 데이터셋 로드

import pandas as pd
import seaborn as sns 

housing_df = pd.read_csv('housing_california.csv')
display(housing_df.head())

 

2) 산점도 그래프 통한 '중간 소득'과 '주택가격' '주택 연식'과 '주택가격'의 관계 탐색

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(1, 2, figsize=(10, 5))  

# HouseAge와 target 사이의 관계
sns.scatterplot(x=housing_df['HouseAge'], y=housing_df['target'], ax=ax[0])
ax[0].set_title('주택 연식 vs. 주택 가격')  
ax[0].set_xlabel('주택 연식') 
ax[0].set_ylabel('주택 가격')  

# MedInc와 target 사이의 관계
sns.scatterplot(x=housing_df['MedInc'], y=housing_df['target'], ax=ax[1])
ax[1].set_title('중간소득 vs. 주택가격')  
ax[1].set_xlabel('중간소득') 
ax[1].set_ylabel('주택 가격') 

# 그래프 간 충돌을 방지하기 위해 자동으로 레이아웃 조정
plt.tight_layout() 
plt.show()

중간소득과 주택가격 사이에 선형관계가 있습니다.

즉, 특정 구획에 사는 사람들의 중간 소득이 높으면 그 지역의 주택가격이 높다는 패턴이 드러납니다.

그러나 주택연식과 주택가격사이에는 선형관계나 다른패턴이 발견되지 않습니다.

이경우에는 주택연식이라는 연속형 변수를 binning을 통해 숨겨져 있는 패턴을 찾으려 하는 시도를 할 수 있습니다.

 

3) 빈도수 기반 범주화 : qcut

# 등빈도 binning
housing_df['HouseAge_cat'] = pd.qcut(housing_df['HouseAge'], q=6)

# 생성된 범주 확인

HouseAge_cat = housing_df['HouseAge_cat'].value_counts().sort_index()
display(HouseAge_cat)
(0.999, 16.0]    4058
(16.0, 22.0]     3080
(22.0, 29.0]     3531
(29.0, 35.0]     3627
(35.0, 42.0]     3130
(42.0, 52.0]     3214
Name: HouseAge_cat, dtype: int64

 

4) binning 통해 생성된 변수 시각화

import seaborn as sns
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8, 4))  # 그림 크기 설정

# 상자 수염 그림 생성, 축(ax) 지정
sns.boxplot(x='HouseAge_cat', y='target', data=housing_df, ax=ax) 

plt.show()

(0.999,16.0]와(16.0,22.0] 범주에서 target의 중앙값은 매우 유사합니다.

이는 해당 연령대의 집들에서 target값이 일정하게 유지되고 있음을 시사합니다.

 

5) 값 기반 범주화 : cut

import seaborn as sns
import matplotlib.pyplot as plt

bins = [0, 22, 29, 35, 42, 53]

housing_df['HouseAge_cat2'] =  pd.cut(housing_df['HouseAge'], bins=bins)
HouseAge_cat2 = housing_df['HouseAge_cat2'].value_counts().sort_index()

# 상자 수염 그림 생성
fig, ax = plt.subplots(figsize=(8, 4))  # 그림 크기 설정
sns.boxplot(x='HouseAge_cat2', y='target', data = housing_df, ax=ax) 

plt.show()  # 그림 표시

첫 번째와 두 번째 범주가 매우 유사하므로 이를 통합하였습니다.