9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

機械学習における欠測の取り扱い

Last updated at Posted at 2019-10-15
本記事は参考図書、文献、資料を参考に、自分なりにまとめたノートです。

欠測のあるデータの解析

データを収集していると、例えば、臨床研究などでは何らかの理由で検査ができなかったりするため、どうしても取得できなかったデータなどが出てくる。欠測を含むデータはそのままでは機械学習へ流せない(NaNやNullは数値ではないので)。この対処例として、欠測を含むデータは解析セットに含めない、あるいは、欠測を何らかの値で補完する方法がある。ほとんどの場合、解析セットから欠測を含むデータを除外してしまう方法がとられるかもしれない。

しかし、除外されるデータが決定境界に影響を与えるかもしれないという可能性は否定できない。できればこれは避けたい。どうするか。
このような疑問に真摯に対応しようとするのが補完という対応である。補完は、切り捨てるメリット、切り捨てないメリット、両方のいいところを残していい塩梅を探そうとする。ただし、前提として、欠測を推定した値が正確であったかどうかはわからないため、適用しても問題ないだろうと思われる落としどころを探すことが必要になる(PMM感度分布解析※1)。
今回は欠測の取り扱いについて考えてみた。

多少面倒だが、欠測が起こる契機についても考慮しておく必要がある※2。
欠測が本当に偶然に起こっている場合(missing at random)と、何かの要因でシステマチックに欠測としている場合などがある。
基本的に、統計数学的にも、バイアスを除外したいというモチベーションから、たまたま欠損した場合には補完で対処しようというアプローチが許容されやすい。
欠測の補完方法は大きく分けて2つある。

単一補完法

1つの欠測に対して1つの値を補完する。(例えば、Last Observation Carried Forward(時系列に取得していたなら、最後に取得できた値で代用する方法)、同じ系列の値の中央値、平均値、最頻値などによる単純な補完)。

多重補完法(今回はMICE:Multivariate Imputation by Chained Equationsを利用)

欠測値を他の特徴量から回帰計算して予測する。補足として、この場合は、回帰モデルの学習方法によっても値が変わることを利用して、欠測を補完したデータセットを複数作り、結果を総合的に評価する。

現在は後者の多重補完が主流のようである。どちらが正しいということではなく、双方をいかに使うかが大切。研究者間でも意見が分かれるところである。個人的には、単一補完単体はテストケースで利用し、精度を検証するような厳密な解析では多重補完という感じではないだろうか。もっと言えば、両方試して傾向が同じかどうかを確かめておくことも必要と思う。

試してみる

想定シナリオ

何かの臨床研究を実施し、5つのラボデータを得たとする(それぞれが何かはここでは言及しない)。
このデータを使ってプラセボ群と実薬群との2群間の最終時点で計測された結果を比較したい。
しかし、このデータには欠測が含まれている。
欠測を補完してみよう。

今回のデータセット(※1から引用、一部改変, d011001_2.csv

実装(python) MICE(一部改変)で試す。sklearnで一発。

GoogleColabでいきます。
まず読み込み。

# show upload dialog
from google.colab import files
uploaded1 = files.upload()
# read data
import pandas as pd
import io
data = pd.read_csv(io.StringIO(uploaded1['d011001_2.csv'].decode('utf-8')),header=0)

カテゴリー変数を分離して、実数へ変換(ここは不要かも)

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import numpy as np

x = data.drop(["arm","caseid"],axis=1)
y = data["arm"]
# print(x)

x = x.values

MICEモデルを学習

from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

#IterativeImputer(add_indicator=False, estimator=None,
#                 imputation_order='ascending', initial_strategy='mean',
#                 max_iter=10, max_value=None, min_value=None,
#                 missing_values=np.nan, n_nearest_features=None,
#                 random_state=0, sample_posterior=False, tol=0.001,
#                 verbose=0)

imp = IterativeImputer(max_iter=10, random_state=0)
imp.fit(x)  

テストで確認

X_test = [[21.3, np.nan, np.nan, np.nan, np.nan], [12.4913,	8.4772, np.nan, np.nan, 14.7096]]
# the model learns that the second feature is double the first
print(np.round(imp.transform(X_test)))

結果
[[21. 18. 15. 13. 9.]   //学習データ:21.5683 20.1376 19.5006 10.9272 8.5499(わるくない、、、)
[12. 8. 12. 12. 15.]]   //学習データ:12.4913 8.4772 13.5651 11.4243 14.7096(すごい、、、ほとんどあってる)

###メモ:MICEの手順

ステップ1:
データセット内のすべての欠損値に対して、対応する系の平均値(あるいはその他の代表的な単一値)を代入。これらの平均値が代入された箇所は「プレースホルダー」と考える。

ステップ2:「プレースホルダー」には、以降に行う繰り返し計算される予測値が再帰的にセットされる。

ステップ3:欠測は、データセット内のすべての変数で構成された(あるいはそうでない場合もある)回帰モデルで予測される(つまり、予測対象の欠測値は回帰モデルの従属変数であり、他のすべての変数は回帰モデルの独立変数)。回帰モデルは、線形、ロジスティック、またはポアソン回帰モデルなどで動作させる。

ステップ4:欠損値は、回帰モデルからの予測(補完)に置き換えられる。その後、他の変数の回帰モデルで独立変数として使用される。

ステップ5:その後、データが欠落している変数ごとにステップ2〜4が繰り返される。この欠損のある各変数の回帰モデルを作っては代入を繰り返すことを1サイクルとして構成する。1サイクルの終わりに欠損値はすべて単一値から回帰予測値に置き換えられる。

ステップ6:ステップ2から4は、設定されたサイクル数にわたって繰り返され、各サイクルで代入が更新される。実行するサイクル数は、研究者が指定する。これらのサイクルの終了時に、最終的な代入が保持され、1つの代入データセットが作成される。通常、10サイクルが実行される(Raghunathan et al。、2002)。ただし、最適なサイクル数を特定するための調査は必要。考え方は、サイクルの終わりまでに、回帰モデルが安定したか(学習が収束したかなど)を確かめること。
MICEの考え方は、最終サイクルの回帰予測値を残すというよりも、各サイクルで予測した分だけデータセットを作り、総合的に評価することの方が主流かもしれないが、最終的に1つのデータセットに見極めが必要という意味では、見ている方向は同じかなと。

#感想

今回はコンプリートデータとの比較、感度分布を確かめるPMM解析ができていないので、今度やってみようかな。

#Reference

9
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?