AI·ML

[ML수업] 5주차 실습1: Feature Engineering- Missing Data Handling

SubjectOwner 2024. 10. 28. 13:45

1. Check missing values

print(X_train.isnull().sum(), '\n')
print(X_test.isnull().sum())



2. Dropping

#결측값이 많은 열을 드롭하기
X_train_drop = X_train.dropna(subset=['state','car_value','risk_factor','C_previous','duration_previous'])
X_test_drop = X_test.dropna(subset=['state','car_value','risk_factor','C_previous','duration_previous'])  

#결측값이 하나라도 있는 feature를 자동으로 없애고 싶을 때 아래 코드 사용:
#X_train.dropna(subset=X_train.isnull().sum()[X_train.isnull().sum().gt(0)].index.values)



3. Imputation

 

3-1. Continuous feature의 결측값 대체

#결측치를 포함한 값들만 시리즈 형태로 추출
X_train[X_train['duration_previous'].isna()]['duration_previous']



3-2. Method-1: Univariate Imputation

from sklearn.impute import SimpleImputer 

imputer_con = SimpleImputer(strategy="median")
imputer_con.fit(X_train[con])

imputer_con.transform(X_train[con])
X_train_imp = X_train.copy()
X_train_imp[con] = imputer_con.transform(X_train[con])

# 결측값이 중위값으로 바뀐 것 확인 
X_train_imp.loc[X_train[X_train['duration_previous'].isna()].index]['duration_previous']

# 테스트 데이터에 imputer 적용
X_test_imp = X_test.copy()
X_test_imp[con] = imputer_con.transform(X_test[con])

print(X_test_imp[con].isnull().sum())

 

3-3. Method-2: Multivariate Imputation (for 연속형 데이터)

 

#이 방식은 SimpleImputer와는 달리, 다른 변수들과의 관계를 고려하여 결측값을 대체하므로 더 정교한 결과를 얻는 데 유리합니다.
#연속형 데이터에 적합하다.

from sklearn.experimental import enable_iterative_imputer  # still experimental 
from sklearn.impute import IterativeImputer

X_train_imp, X_test_imp = X_train.copy(), X_test.copy()

imp = IterativeImputer(max_iter=10)
X_train_imp[con] = imp.fit_transform(X_train[con])
X_test_imp[con] = imp.transform(X_test[con])

X_train_imp.loc[X_train[X_train['duration_previous'].isna()].index]['duration_previous']

 

 

3-4. Categorical feature 의 결측값 대체 -최빈값으로 대체

 

imp = SimpleImputer(strategy="most_frequent")
X_train_imp[cat] = imp.fit_transform(X_train_imp[cat])
X_test_imp[cat] = imp.transform(X_test_imp[cat])

print(X_train['car_value'].value_counts())
X_train_imp.loc[X_train[X_train['car_value'].isna()].index]['car_value']

 

 

**기타 다른 결측값 처리 방법:**      
<font color='black'><p>    
- 결측값인 채 처리하기(Ex: -9999 등 쉽게 얻을 수 없는 값 대입)
- 전체 데이터의 평균을 대입하는 대신 범주형 feature로 그룹을 만든 뒤 해당 그룹별 평균을 대입
- 결측값으로 새로운 feature 만들기(Ex: 행 데이터마다 결측값이 있는 feature의 수를 카운팅)