ノック88 :欠損値の処理をやってみよう
欠損値の数を確認します。
from sklearn.model_selection import train_test_split
import pandas as pd
dataset = sns.load_dataset('titanic')
label = dataset.pop('survived')
train_ds,test_ds,train_label,test_label=train_test_split(
dataset,label,random_state=2021,stratify=label)
train_ds.drop(columns=['embark_town','alive'],inplace=True)
one_hot_encoded = pd.get_dummies(train_ds)
one_hot_encoded = pd.get_dummies(one_hot_encoded,columns=['pclass'])
train_ds = one_hot_encoded
#ノック86
from sklearn.preprocessing import RobustScaler,StandardScaler
age_scaler = StandardScaler()
sibsp_scaler = RobustScaler()
parch_scaler = RobustScaler()
fare_scaler = RobustScaler()
train_ds['age'] = age_scaler .fit_transform(train_ds['age'] .values.reshape(-1,1))
train_ds['sibsp'] = sibsp_scaler.fit_transform(train_ds['sibsp'].values.reshape(-1,1))
train_ds['parch'] = parch_scaler.fit_transform(train_ds['parch'].values.reshape(-1,1))
train_ds['fare'] = fare_scaler .fit_transform(train_ds['fare'] .values.reshape(-1,1))
#ノック88
print(train_ds.isna().sum())
実行結果
age 137
sibsp 0
parch 0
fare 0
adult_male 0
alone 0
sex_female 0
sex_male 0
embarked_C 0
embarked_Q 0
embarked_S 0
class_First 0
class_Second 0
class_Third 0
who_child 0
who_man 0
who_woman 0
deck_A 0
deck_B 0
deck_C 0
deck_D 0
deck_E 0
deck_F 0
deck_G 0
pclass_1 0
pclass_2 0
pclass_3 0
dtype: int64
ageだけ欠損値が137個あることがわかります。
欠損値の処理は2通りあります。
・欠損値のあるデータを除外すること。
・別の値に補完すること。
今回は中央値で補完します。
from sklearn.impute import SimpleImputer
age_imputer = SimpleImputer(strategy='median')
train_ds['age'] = age_imputer.fit_transform(train_ds['age'].values.reshape(-1,1))
strategyは平均値 (mean)、中央値 (median)、最頻値 (most_frequent)、定数 (constant) の4つの中か
ら選択して指定できます。
欠損値がなくなったか確認します。
print(train_ds['age'].isna().sum())
実行結果
0
最後に欠損値の亡くなったデータをPickleファイルに保存します。
import os
import pickle
os.makedirs('data/imputers/',exist_ok=1)
with open('data/imputers/age_imputer.pkl',mode='wb') as f :
pickle.dump(age_imputer,f)