【定番の前処理】k近傍法を用いたお手軽スマートなテーブルデータの欠損値補完(KNNImputer)

スポンサーリンク
python Python

欠損値があった時、皆さんはどう対応していますか?

良くある簡単なものだと、

  • とりあえず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近傍法を用いて値が近いデータを見つけてその値の平均で埋めるので全体を平均で埋めるといった方法より”かなり”無理矢理感が少ないです。

欠損値に悩んでいる人はぜひ使ってみてください。

それでは!

コメント

タイトルとURLをコピーしました