3.6 欠損値の処理

スパース・データおよび欠損値について理解します。

Oracle Machine Learning for SQLでは、スパース・データランダムな欠損値を含むデータが区別されます。後者は、一部の属性値が不明であることを意味します。一方、スパース・データには、データ内には表されていないが既知であるとみなされる値が含まれます。

スパース・データの典型例はマーケット・バスケット・データです。何百または何千個もある取扱い商品の中で、個々のケース(バスケットまたはトランザクション)に含まれる商品はわずかです。商品の値はすべて既知ですが、すべての商品がバスケットの中に存在するわけではありません。存在する商品に対しては特定の数量がありますが、存在していない商品についてはスパース(既知の数量は0(ゼロ))となります。

OML4SQLでは、欠損データは次のように解釈されます。

  • ランダムな欠損: 単純な(ネストしていない)データ型の列内の欠損値は、ランダムに欠損しているとみなされます。

  • スパース: ネストした列内の欠損値は、スパース性を示します。

3.6.1 欠損値とスパース・データの識別基準

欠損値とスパース・データについて、いくつかの現実世界の例を使用して説明します。

この例では、データがスパースであるのかランダムに欠損しているのかをOracle Machine Learning for SQLがどのように識別するかについて説明します。

3.6.1.1 売上表のスパース性

Oracle Machine Learning for SQLがネストした列の欠損データを解釈する方法について理解します。

ある売上表には、一定期間内に複数の店舗で顧客に販売された製品グループのPOSデータが格納されます。それぞれの顧客は、少数の製品しか購入しません。顧客が購入しなかった製品は、売上表の行として表示されません。

1人の顧客が各製品に支払った金額を求める場合、購入されなかった製品の金額は0(ゼロ)と推定されます。表に行が表示されなくても、この値はランダムな欠損でも未知でもなくゼロになります。

売上データは(製品、店舗、顧客、時間で)ディメンション化され、多くの場合、機械学習用のネストしたデータとして表されます。

ネストした列の欠損値は常にスパース性を示すため、マイニング対象のデータに関してこの解釈が適切であることを確認する必要があります。たとえば、大規模な映画データベースのユーザーの映画評価が格納されている複数レコード・ケースのデータセットをマイニングしようとする場合、欠損している評価は未知の(ランダムに欠損している)値ですが、Oracle Machine Learning for SQLではこのデータをスパースとして扱い、欠損値については評価を0 (ゼロ)と推定します。

3.6.1.2 顧客データの表の欠損値

一部の属性でデータを使用できない場合、それらの欠損値はランダムに欠損しているとみなされます。

顧客に関する人口統計データが格納されている顧客データの表があるとします。ケースID列は顧客IDです。属性は、年齢、学歴、職業、性別、世帯人員などです。データがすべてそろっていない顧客もいます。欠損値がある場合は、ランダムに欠損しているとみなされます。たとえば、顧客1の年齢と顧客2の職業がデータにない場合、その情報は不明です。スパース性を示すことにはなりません。

この顧客データはディメンション化されないことに注意してください。ケースとその各属性の間には1対1のマッピングが存在します。どの属性もネストしていません。

3.6.2 Oracle Machine Learning for SQLでの欠損値の処理

OML4SQLでの欠損値の処理の要約を示します。

欠損値の処理方法は、アルゴリズムおよびデータの性質(質的または量的、スパースまたはランダムな欠損)によって異なります。次の表に、欠損値の処理方法の概要を示します。

ノート:

OML4SQLでは、自動データ準備(ADP)が使用されているかどうかにかかわらず、同じ欠損値処理が実行されます。

表3-3 アルゴリズムによる欠損値処理

欠損データ EM、GLM、NMF、k-Means、SVD、SVM DT、MDL、NB、OC Apriori

ランダムな欠損値(量的)

欠損している量的な値はアルゴリズムにより平均値に置換される。

期待値最大化(EM)では、ガウス分布でモデル化された列のみ置換される。

欠損値はそのままランダムな欠損として処理される。

すべての欠損データがスパースとして解釈される。

ランダムな欠損値(質的)

一般化線形モデル(GLM)、Non-Negative Matrix Factorization (NMF)、k-Meansおよびサポート・ベクター・マシン(SVM)により、欠損質的値がモードで置換されます。

特異値分解(SVD)は、質的データをサポートしていません。

EMは欠損している質的な値を置換しない。EMはNULLを、独自の頻度カウントとともに、個別値として扱う。

欠損値はそのままランダムな欠損として処理される。

すべての欠損データがスパースとして解釈される。

スパース・データ(量的)

スパースな量的データはアルゴリズムにより0(ゼロ)に置換される。

O-Clusterはネストしたデータをサポートしないため、スパース・データもサポートされない。デシジョン・ツリー(DT)、最小記述長(MDL)およびNaive Bayes (NB)では、スパースな量的データはゼロに置換される。

スパース・データは処理される。

スパース・データ(質的)

SVD以外のすべてのアルゴリズムは、スパースな質的データをゼロ・ベクターで置換する。SVDは質的データをサポートしない。

O-Clusterはネストしたデータをサポートしないため、スパース・データもサポートされない。DT、MDLおよびNBでは、スパースな質的データはDM$SPARSEという特別な値に置換される。

スパース・データは処理される。

3.6.3 欠損値処理の変更

欠損データをスパースまたはランダムな欠損として置換します。

Oracle Machine Learning for SQLで、欠損データを、ランダムな欠損としてではなくスパースとして、またはスパースとしてではなくランダムな欠損として処理する必要がある場合、モデルを作成する前に変換を行う必要があります。

欠損値をスパースとして処理する必要があるが、OML4SQLではその欠損値がランダムな欠損値として解釈される場合、NVLなどのSQL関数を使用すると、NULLを「NA」などの値に置換できます。OML4SQLでは、特定の値が存在する場合、欠損値処理は行われません。

欠損しているネストした属性をランダムな欠損として処理する場合は、ネストした行を、別々の列に格納された物理的な属性に変換できます(ただし、ケース表の列数がデータベースによる制限(列以内)を超えない場合に限ります)。存在しうる属性の名前をすべて入力し、それらをNULLとして指定してください。かわりに、存在していないすべての商品について、ネストした列に行を挿入し、各行に平均値やモードなどの値を割り当てます。