欠損値があった時、皆さんはどう対応していますか?
良くある簡単なものだと、
- とりあえず0を代入
- 全データの平均値を代入
- 最頻値で代入
- Dropする
でしょうか。
「でも、こんな大雑把でいいのかな?」
「もう少しスマートな方法ないのかな?」
「欠損値がある行を消すとデータが減っちゃう」
「予測データはできる限り予測値を出してあげたい」
そんな方に、一歩先に行くK近傍法を用いた欠損値の補完(KNNImputer)の使い方をお教えします。
ソース
from sklearn.impute import KNNImputer
import pandas as pd
#こんなdfがあったとする(NaNが欠損値)
# id col1 col2 col3
#0 1.0 9.0 3.0 1.0
#1 2.0 NaN 3.0 NaN
#2 3.0 8.0 NaN 1.0
#3 4.0 9.0 5.0 2.0
# 補完したい列
impute_columns = ['id', 'col1', 'col2', 'col3']
# KNNImputerによる保管
# (n_neighbors=2なので、K近傍法により最も近い2つのレコードを見つけ、その2つの平均値で埋める)
imputer = KNNImputer(n_neighbors=2)
# DataFrameに直す
df_filled = pd.DataFrame(imputer.fit_transform(df[impute_columns]), columns=impute_columns, index=df.index)
df.update(df_filled)
# df_filledはこんな感じにうまる
# id col1 col2 col3
#0 1.0 9.0 3.0 1.0
#1 2.0 8.5 3.0 1.0
#2 3.0 8.0 4.0 1.0
#3 4.0 9.0 5.0 2.0
#####################################
# テストデータに関しては、学習データにfitしたものを使用してtransformする
# test_df_filled = pd.DataFrame(imputer.transform(test_df[impute_columns]), columns=impute_columns, index=test_df.index)
# test_df.update(test_df_filled)
まとめ
ほぼ2行で欠損値がいい感じに埋まりました!
KNNImputerは、k近傍法を用いて値が近いデータを見つけてその値の平均で埋めるので全体を平均で埋めるといった方法より”かなり”無理矢理感が少ないです。
欠損値に悩んでいる人はぜひ使ってみてください。
それでは!
コメント