渋谷駅前で働くデータサイエンティストのブログ

元祖「六本木で働くデータサイエンティスト」です / 道玄坂→銀座→東京→六本木→渋谷駅前

欠損値処理に関する備忘録

最近某所で話題になっていたのが「欠損値処理はどうやるべきか」というテーマ。これは太古の昔から「荒れるテーマ」として有名で、今回も大いに荒れていて傍観している側としては面白かったんですが(笑)、古老ともあろう身がただ面白がっているだけでは自分を含めて誰の学びにもならないので、良い機会ということでちょっと欠損値処理に関する備忘録をまとめておこうと思います。いつもながらですが、誤解や理解不足の点などあればどしどしご指摘ください。

大前提


9年も前にこのブログで書いた記事が今でも時々各所で参照されているようなので引き合いに出しておきますが、そもそも論として機械学習が「予測」を目的とするのに対して統計学は「説明」を目的とすることが多い、という点を指摘しておきます。勿論それぞれに例外は少なからずありますし、前者なら解釈性であったり後者なら時系列予測であったりというように互いに逆の目的意識をもって扱われるものもありますが、今回の記事ではあくまでも「予測vs.説明」という論点に的を絞ります。


機械学習における欠損値処理は「予測」の助けになるように


僕が把握している範囲では、機械学習における欠損値処理というと以下のアプローチが一般的なようです。

  • そもそも欠損値はそのままにしておく
  • 「欠損値が発生していること」それ自体を特徴量として使う

これには理由があって、樹木モデル系の手法だとsurrogate splitという仕組みがあるため欠損値処理が不要であり*1、同時にKaggleを筆頭とする機械学習実践の世界ではGBDTなどの樹木モデル系の手法が主流だからです。実際、このブログでいつも推薦書籍に挙げている『Kaggleで勝つデータ分析の技術』でも

GBDTライブラリでは、欠損値を埋めずにそのまま取り扱うことができます。欠損値はその値が何らかの理由で欠損しているという情報を持っていると考えると、その情報を捨てるのはもったいないため、そのまま取り扱うのが自然な方法です。

と述べていて、欠損値をそのまま扱うことの有用性を強調しています。


一方で、ロジスティック回帰やNNなど線形モデル族の手法では欠損値をそのままにして扱えるわけではないので、従来的な対処法である「代表値で埋める」「他の共変量からモデリングして予測する」といった補完系のアプローチが必要になることもあります。ただし、『Kaggleで〜』でも触れられているように、欠損値というのはその「発生プロセス」自体が目的変数を予測する上で有用な情報であり、立派な特徴量になり得るものです。よって、補完系のアプローチと併せて「欠損値の有無自体でカテゴリ変数の特徴量を新たに作る」ことで、欠損値の発生プロセスの情報を保持するという手法が取られます。


いずれにせよ、機械学習分野においては欠損値処理の目的は「予測」の助けになることが重視されている、というのが個人的な感想です。そのため、「欠損値自体を情報として活かす」のが主、「欠損値を補完する」のは従、という印象があります。


統計学における欠損値処理は「パラメータ推定」の助けになるように


一方で、統計学における欠損値処理というと、僕が把握している範囲では「欠損値の発生するメカニズムを分析する」ことを前提とした上で、以下のアプローチを取ることが一般的なようです。

  • 多重代入法
  • 状態空間モデルのように観測値(欠損あり)と状態値(推定値で欠損なし)を分ける

多重代入法は恥ずかしながら僕は不案内なので確たることは言いにくいのですが、以前書評記事を書いた『ベイズデータ解析(第3版)』でも取り上げられていますし、ちょっとググれば詳しい解説記事も色々見つかります。基本的にはこちらの解説記事でまとめられているように、

多重代入法は、欠測データの分布から独立かつ無作為に抽出されたM個のシミュレーション値によって欠測値を置き換えるものである。


この代入法の目的は個々の値を完全に復元させることではなく、母集団のパラメータの推定です。

というもので、出来る限りバイアスを抑えながら母集団のパラメータを推定しようというのが多重代入法の考え方です。なおBDAでも同様に

多重代入法の重要な考え方は、データセットの欠測値を置き換える値を複数個作成することである。これにより、単一代入法の問題点の1つであった、欠測による不確実性を適切に反映させることができる。

と書かれており、続けて欠損値とパラメータの同時事後分布を計算するためのアルゴリズムの議論が展開されていきます。


もう一つの状態空間モデルですが、これは馬場さんの解説が分かりやすいかと思いますので詳細は割愛します。ただ、観測値(パラメータから遠く欠損が出る)と状態値(パラメータに近く原理的に欠損はないが推定値である)とに分けるという点で、多重代入法と根底にある哲学は同じなのかなと思っています。


ということで、統計学分野においては欠損値処理の目的は「パラメータ推定」の助けになることが重視されている、というのが個人的な感想です。そのため、「バイアスを抑えてパラメータ推定できるように欠損値を補完する」アプローチが一般的だ、と言えそうです。


感想など


一通りざっくりまとめてみましたが、こうしてみると機械学習統計学も欠損値が発生するメカニズムには注目するものの、その目的が「予測」か「パラメータ推定」かによって結構アプローチが変わっていくものなのだな、と感じています。個人的には機械学習分野でも多重代入法をやってみたらどうかなと思わなくもないのですが、Kaggleガチ勢の間で支持されていないところを見るとあまり有効ではないのかもしれません。それはやはり、「予測精度の高さ」と「パラメータ推定のバイアスの低さ」とは直接は関連しないという現実の反映なのかなと。


ちなみにこれは某所でも書きましたが、僕は極めて怠慢なので「そもそも欠損値を伴うデータセットは業務では受け付けていない」んですよね(笑)。デジタル広告・マーケティング業界だとその気になれば欠損のないデータセットを用意することは十分に可能なので、そういう芸当もできますよ、ということで。


最後に余談ですが、冒頭の画像はGemini AdvancedでImagen3に描かせたものです*2。これが「欠けたもの」かぁ……という感想です。お粗末さまでした。