※この記事で使用している多重代入法のパッケージは正式な多重代入法の枠組みとは異なりますのでご注意願います。
はじめに
最近多重代入法という欠損値補完の手法があることを知りました。 統計学の界隈では欠損値補完は多重代入法を使用するのがベターのようですが、 機械学習の文脈ではあまりその手法が使用されている形跡がなかったので、 なぜそうなのか調査・実験した結果を記述します。
参考資料
欠損値について
欠損には大きく以下の3種類があります。
・MCAR(Missing Completely At Random):完全にランダムに欠損
・MAR(Missing At Random):観測データに依存する欠損
・MNAR(Missing Not At Random):欠損データに依存する欠損
多くの学習器は欠損値を入力できないので欠損値に対応する必要がありますが、 欠損した行を削ったり平均値埋めなどをするとバイアスが生じるためにそうならないような方法が必要となります。 欠損値の補完方法としてはいろいろ手法があるのですが、今は多重代入法を用いるのがベターなようです。 パッケージとしてはRのmiceが一番メジャーでしょうか。 考え方としては欠損している変数を他の欠損していない変数を用いて推定するというものです。 miceで推定するアルゴリズムは線形モデルが使用されることが多いようです。詳細を知りたい方は参考資料を参照するのが良いかと思います。 多重代入法はMARに対して最も効果がありますが、MNARの場合でも補助変数を入れてMARに近づければ効果が出るようです。
機械学習における欠損処理
機械学習で使用頻度の高いlightgbmやxgboostといった勾配ブースティングを用いる場合、 デフォルト設定だと欠損値を補完しなくてもlossが下がるように欠損値の部分が処理されます。 詳細は以下資料の3.2項を参照してください。 http://mlexplained.com/2018/01/05/lightgbm-and-xgboost-explained/
このアプローチの場合、欠損値は補完されるわけではなく、欠損という特徴をlossがより下がる方にsplitすることになります。処理的に欠損値のジャンルでいうとMNARのケースに最も有効に働きそうです。
実験
多重代入法が回帰や分類に効果があるかを確認するため、様々な欠損値補完を用いた場合の精度の比較を行います。 欠損値補完はRだとmiceを使用するケースが多いようですが、今回はpythonを使いたかったのでsklearnのIterativeImputerとfancyimputeを用いて欠損値補完を行いました。IterativeImputerの方は19年6月ではまだ実験段階のもののようなので使用する場合は注意してください。miceとこれらパッケージの主な違いは補完するアルゴリズムをいろいろ変えている点になります。
データはMelbourne Housing Marketを使います。 このデータセットはメルボルンの住宅の特徴と価格が入ったデータセットになっており、 複数の変数で欠損が存在しているデータになります。
このデータを用いて、部屋数や築年数などの住宅の特徴から価格を予測するモデルを作成します。 手順としては最低限の前処理後、各方法で欠損値補完を行い、 lightgbmで学習した5foldの平均RMSEを比較しました。
コードは割愛します。使用したコードは以下になります。
結果は以下のようになりました。 (I)がsklearnのIterativeImputerを用いたもので、(F)がfancyimputeを用いたものになります。
欠損値補完方法 | RMSE |
---|---|
補完なし | 300058 |
baysian ridge(I) | 308926 |
ExtraTreesRegressor(I) | 308560 |
KNeighborsRegressor(I) | 308190 |
MatrixFactorization(F) | 312793 |
BiScaler(F) | 386955 |
SoftImpute(F) | 305534 |
補完を用いず欠損値をそのままlightgbmに入れたものが最も性能が良い結果となりました。 下手に値が入っているよりも欠損であることがわかる方がlightgbmとしてはうれしいようです。 今回の住宅のデータセットだと確かに欠損していることが推定の手段として役立つ(条件が悪すぎで載せられない、古いため情報が残っていない等)場合が考えられるので、この結果にそれほど違和感はないかと思いました。 仕組み的に欠損値がMNARである場合にはそのまま欠損を入れた方がよく、 MARやMCARである場合には欠損であることに情報量はないので、補完した方が性能がよくなる可能性があるかなと思いました。