機械学習における欠損値補完について考える

※この記事で使用している多重代入法のパッケージは正式な多重代入法の枠組みとは異なりますのでご注意願います。

はじめに

最近多重代入法という欠損値補完の手法があることを知りました。 統計学の界隈では欠損値補完は多重代入法を使用するのがベターのようですが、 機械学習の文脈ではあまりその手法が使用されている形跡がなかったので、 なぜそうなのか調査・実験した結果を記述します。

参考資料

欠測データ処理: Rによる単一代入法と多重代入法

欠損値について

欠損には大きく以下の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のIterativeImputerfancyimputeを用いて欠損値補完を行いました。IterativeImputerの方は19年6月ではまだ実験段階のもののようなので使用する場合は注意してください。miceとこれらパッケージの主な違いは補完するアルゴリズムをいろいろ変えている点になります。

データはMelbourne Housing Marketを使います。 このデータセットメルボルンの住宅の特徴と価格が入ったデータセットになっており、 複数の変数で欠損が存在しているデータになります。

このデータを用いて、部屋数や築年数などの住宅の特徴から価格を予測するモデルを作成します。 手順としては最低限の前処理後、各方法で欠損値補完を行い、 lightgbmで学習した5foldの平均RMSEを比較しました。

コードは割愛します。使用したコードは以下になります。

github.com

結果は以下のようになりました。 (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である場合には欠損であることに情報量はないので、補完した方が性能がよくなる可能性があるかなと思いました。

まとめ

  • 統計学における欠損補完の目的はバイアスなく統計処理を行うものであり、機械学習の欠損処理の目的は回帰・分類精度を高めることが目的であるため、欠損処理についても目的別で考える必要があると思いました。

  • 多重代入法のような欠損値補完はどちらかというと解釈のために使用する場合に役立つと考えられ、機械学習を用いる場合でも解釈性を求める場合は欠損値をどう埋めるかは問題になると思いました。例えばSHAPとかLIMEだと線形モデルを用いるのでこの部分は影響してくると思うのですがどうなっているかが気になりました。