본문 바로가기

04. 캐글

00014. [KAG-002] House Prices 예측 #3 - 결측치 처리 & 파생 피처 생성

반응형

이번 편에서는 House Prices 데이터셋에서 **결측치(Missing Values)**를 정리하고, 성능 향상을 위한 파생 피처 생성을 진행해보겠습니다.


🧼 1. 결측치 현황 확인

missing = train.isnull().sum()
missing = missing[missing > 0].sort_values(ascending=False)
print(missing)

자주 등장하는 결측 변수:

  • PoolQC, MiscFeature, Alley: 대부분 결측 → "없음"으로 간주
  • LotFrontage: 수치형이지만 대지와 관련 → Neighborhood 기준 평균으로 보간
  • GarageYrBlt, GarageType 등 차고 관련 컬럼들

🧼 2. 결측치 처리 방법 예시

# '없음'으로 처리
for col in ['PoolQC', 'MiscFeature', 'Alley', 'Fence', 'FireplaceQu']:
    for df in [train, test]:
        df[col] = df[col].fillna('None')

# 수치형 평균/중앙값 처리
train['LotFrontage'] = train.groupby('Neighborhood')['LotFrontage'].transform(
    lambda x: x.fillna(x.median()))
test['LotFrontage'] = test.groupby('Neighborhood')['LotFrontage'].transform(
    lambda x: x.fillna(x.median()))

# 범주형 최빈값 처리
test['MSZoning'] = test['MSZoning'].fillna(test['MSZoning'].mode()[0])

🧩 3. 파생 피처 생성

✅ 3.1. 전체 면적 (TotalSF)

train['TotalSF'] = train['TotalBsmtSF'] + train['1stFlrSF'] + train['2ndFlrSF']
test['TotalSF'] = test['TotalBsmtSF'] + test['1stFlrSF'] + test['2ndFlrSF']

✅ 3.2. 주택 나이 관련 변수

train['HouseAge'] = train['YrSold'] - train['YearBuilt']
train['RemodAge'] = train['YrSold'] - train['YearRemodAdd']
test['HouseAge'] = test['YrSold'] - test['YearBuilt']
test['RemodAge'] = test['YrSold'] - test['YearRemodAdd']

✅ 3.3. 리모델링 여부

train['IsRemodeled'] = (train['YearBuilt'] != train['YearRemodAdd']).astype(int)
test['IsRemodeled'] = (test['YearBuilt'] != test['YearRemodAdd']).astype(int)

📌 정리

  • 결측치는 변수의 의미에 따라 적절히 처리 (None, 평균, 그룹별 보간 등)
  • TotalSF, HouseAge, IsRemodeled 같은 피처는 실전에서도 성능 향상에 도움됨
  • 데이터가 깔끔해졌으니, 다음 단계에서 모델 학습과 평가로 이어갈 수 있음

➡️ 다음 편에서는 다양한 회귀 모델을 사용해 초기 성능을 확인해보겠습니다! 🚀

반응형