欠損値の多変量補完をする
インプットの記録
多変量補完とは
他の特徴量の情報も使いながら欠損値を予測して埋めていく欠損値補完の1つの方法。
(その特徴量だけの情報を使って欠損値を埋めるやり方は単変量補完である)
例:「身長」に欠損値がある場合
多変量補完: 「年齢」「体重」「性別」など、別のデータとの相関を見ながら埋める
単変量補完: 「身長」のデータのみを使い、平均値や中央値を参考にする
進んで使っていくべきか?
基本的には精度が高く積極的に使うべきだが、以下の場合は計算コストが高いため使うべきではない。
特徴量同士の関係性が低い
たとえば、「所属していた体育会系部活」と「歌のうまさ」というデータがあったとしても、通常「歌がうまいからバスケ部!」みたいな予測は難しいので多変量補完の恩恵は得られない
データが膨大
多変量補完では、1つの行だけでなくdfすべての行を参照して欠損値を埋めるので、データが大きくなるほど相応のマシンスペックが求められる
scikit-learnのIterativeImputerを使う
sklearnのimputeモジュールにIterativeImputerがあり、これを使って多変量補完できる!簡単🥳便利👌
※学習したいデータフレームは「df」とし、すでにpandasを使って作成してあるとする
from sklearn.experimental import enable_iterative_imputer # scikit‑learn 1.7.0時点では、実験的機能のためモジュールのインポートが必要
from sklearn.impute import IterativeImputer
imputer = IterativeImputer(random_state=0) # インスタンス化
imputer.fit(df) # 学習
df_imputed = imputer.fit_transform(df) # 学習済みモデルを使ってデータを置き換える(transform)
デフォルトでは反復計算上限が10回で設定されているが、ConvergenceWarningが出る場合はmax_iterの値を多めに設定しなおしたほうが良い(反復回数が足りずに収束しなかった可能性があるため)。
参考
Scikit-Learn「IterativeImputer」https://scikit-learn.org/stable/modules/generated/sklearn.impute.IterativeImputer.html
佐藤是磑さん「Pythonの欠損値補完法IterativeImputerの紹介」https://www.sink-capital.com/blogs/python_iterativeimputer/
Fukuharaさん「Pythonでの欠損値補完(代入法) scikit-learnとpandas」https://qiita.com/FukuharaYohei/items/9830d5760595619352a5
※IterativeImputerは実験段階の機能であるため、デフォルトのパラメータや動作の詳細は、廃止サイクルなしで変更される可能性があることに留意する