missing values의 예시
1. 세번째 침대가 들어갈 공간이 부족한 두 침대로 꽉찬 방
2. 설문조사는 아마도 응답자의 소득을 알 수 없음.
Missing Values를 다루는 세가지 방법
1. A Simple Option: Drop Columns with Missing Values
missing values가 있는 column을 삭제한다.
대부분의 column이 missing value를 포함하지 않는다면 괜찮음.
100개 중 1개 정도라면 정확도에 크게 영향을 미치지 않음.
!! 꼭 X_valid 데이터에서도 drop 해야 함 !!
# Get names of columns with missing values
cols_with_missing = [col for col in X_train.columns
if X_train[col].isnull().any()]
# Drop columns in training and validation data
reduced_X_train = X_train.drop(cols_with_missing, axis=1)
reduced_X_valid = X_valid.drop(cols_with_missing, axis=1)
print("MAE from Approach 1 (Drop columns with missing values):")
print(score_dataset(reduced_X_train, reduced_X_valid, y_train, y_valid))
2. A Better Option: Imputation(대체값)
missing values 자리에 some number을 채워줌. 위보다 나은 방법이긴 함.
# Imputation
my_imputer = SimpleImputer()
imputed_X_train = pd.DataFrame(my_imputer.fit_transform(X_train))
imputed_X_valid = pd.DataFrame(my_imputer.transform(X_valid))
# Imputation removed column names; put them back
imputed_X_train.columns = X_train.columns
imputed_X_valid.columns = X_valid.columns
print("MAE from Approach 2 (Imputation):")
print(score_dataset(imputed_X_train, imputed_X_valid, y_train, y_valid))
3. An Extension To Imputation
만약 imputed values가 실제값보다 체계적으로(systematically) 위 또는 아래에 있다면,
또는 missing value를 가진 row가 또다른 방식으로 유일하다면
이전에 Missing value 자리였음을 표기해주는 column이 필요.
SimpleImputer()를 import 해옴.
원본훼손 방지를 위해 copy()해주는 센스
X_train에는 my_imputer.fit_transform()을,
X_valid에는 my_imputer.transform() 적용.
마지막에 imputation을 적용한 data에 column 이름을 다시 박아줘야함.
SimpleImputer는 column 이름까지 삭제하기 때문.
# Make copy to avoid changing original data (when imputing)
X_train_plus = X_train.copy()
X_valid_plus = X_valid.copy()
# Make new columns indicating what will be imputed
for col in cols_with_missing:
X_train_plus[col + '_was_missing'] = X_train_plus[col].isnull()
X_valid_plus[col + '_was_missing'] = X_valid_plus[col].isnull()
# Imputation
my_imputer = SimpleImputer()
imputed_X_train_plus = pd.DataFrame(my_imputer.fit_transform(X_train_plus))
imputed_X_valid_plus = pd.DataFrame(my_imputer.transform(X_valid_plus))
# Imputation removed column names; put them back
imputed_X_train_plus.columns = X_train_plus.columns
imputed_X_valid_plus.columns = X_valid_plus.columns
print("MAE from Approach 3 (An Extension to Imputation):")
print(score_dataset(imputed_X_train_plus, imputed_X_valid_plus, y_train, y_valid))
2, 3번 방법이 1번보다 나은 이유를 증명하는 코드
각 column 속 missing values의 수를 산출해주는 함수!
-> drop column을 쓸지 imputation을 쓸지 결정해야할 때 사용
-> 삭제해야할 column이 너무 많으면 imputation으로 가자
-> 그런데 위와 같은 경우지만 어떤 데이터는 drop column이 나을 때도 있음.
-> missing value를 0으로, 평균으로 채워주느냐에 따라 결과가 천차만별로 달라지기도 하고
-> 평균값으로 채워주고 싶다면, final_imputer = SimpleImputer(strategy='median')
house price prediction data에서는 10864개의 row와 12개의 column을 가지고 있는데
그 중 3개의 column에 missing data가 포함되어 있다.
1/4를 삭제하기엔 정보 손실이 너무 크기에 이 때는 imputation이 더 효율적이다
# Shape of training data (num_rows, num_columns)
print(X_train.shape)
# Number of missing values in each column of training data
missing_val_count_by_column = (X_train.isnull().sum())
print(missing_val_count_by_column[missing_val_count_by_column > 0])
+) X_train.shape :해당 training data의 전체 row와 columns 수를 알려줌.
+) X_train.isnull().sum(): column 별로 missing value의 개수를 알려줌
+) X_train.notnull().sum(): column 별로 missing value가 아닌 값의 개수를 알려줌
# Fill in the line below: How many rows are in the training data?
num_rows = X_train.shape[0]
# Fill in the line below: How many columns in the training data
# have missing values?
num_cols_with_missing = missing_val_count_by_column[missing_val_count_by_column > 0].shape[0]
# Fill in the line below: How many missing entries are contained in
# all of the training data?
tot_missing = sum(missing_val_count_by_column[missing_val_count_by_column > 0])
# Check your answers
step_1.a.check()
+) MAE를 확인해보면서 정말 효율이 더 좋아졌는지 확인해보기
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
# Function for comparing different approaches
def score_dataset(X_train, X_valid, y_train, y_valid):
model = RandomForestRegressor(n_estimators=100, random_state=0)
model.fit(X_train, y_train)
preds = model.predict(X_valid)
return mean_absolute_error(y_valid, preds)
print("MAE (Drop columns with missing values):")
print(score_dataset(reduced_X_train, reduced_X_valid, y_train, y_valid))
print("MAE (Imputation):")
print(score_dataset(imputed_X_train, imputed_X_valid, y_train, y_valid))
- n_estimators: the number of trees in the forest
[ Generate test Predictions ]
Part A
X_train과 X_valid의 값들을 깔끔하게 만든 뒤(missing value 처리)
model에 적용해야함 순서 주의!
# Imputation
final_imputer = SimpleImputer(strategy='median')
final_X_train = pd.DataFrame(final_imputer.fit_transform(X_train))
# final_X_train = imputed_X_train
final_X_valid = pd.DataFrame(final_imputer.transform(X_valid))
# Imputation removed column names; put them back
final_X_train.columns = X_train.columns
final_X_valid.columns = X_valid.columns
# Define and fit model
model = RandomForestRegressor(n_estimators=100, random_state=0)
model.fit(final_X_train, y_train)
# Get validation predictions and MAE
preds_valid = model.predict(final_X_valid)
print("MAE (Your approach):")
print(mean_absolute_error(y_valid, preds_valid))
- n_estimators: the number of trees in the forest
Part B
X_train, X_valid 따로따로 적용하기 귀찮으니 한 꺼번에 하기 위해 X_test에 바로 적용하자
from sklearn.impute import SimpleImputer
final_imputer = SimpleImputer(strategy='median')
# Preprocess test data
final_X_test = pd.DataFrame(final_imputer.transform(X_test))
# Get test predictions
preds_test = model.predict(final_X_test)
# Save test predictions to file
output = pd.DataFrame({'Id': X_test.index,
'SalePrice': preds_test})
output.to_csv('submission.csv', index=False)
'Machine Learning > [Kaggle Course] ML (+ 딥러닝, 컴퓨터비전)' 카테고리의 다른 글
[Kaggle Course] Pipelines + How to make and submit CSV in Kaggle (0) | 2020.10.21 |
---|---|
[Kaggle Course] Categorical Variables (0) | 2020.10.12 |
[Kaggle Course] Introduction (0) | 2020.10.11 |
Intro to AutoML (0) | 2020.10.08 |
!! Steps to apply machine learing to real-world data (0) | 2020.10.08 |