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의 수를 카운팅)