単純ベイズ・モデルの作成例

この例では、離散化アルゴリズムおよびビン数を定義する方法を示します。

単純ベイズ分類器を顧客離れデータ・セットに適用することを想定します。入力データには連続型と名義型の属性タイプを含めることができます。すべてのタイプを自動的に検出できます。ユーザーが指定した方法で検出することもできます。タイプを手動で定義するには、incolumn パラメーターと coldeftype パラメーターを使用します。

顧客離れデータ・セットには数値列のみが入っています。ただし、単純ベイズ・モデルを作成するには VARCHAR 列が必要です。以下の呼び出しは、顧客離れデータ・セットを基に、VARCHAR 列を含むビューを作成する方法を示しています。また、このビューには、予測に必要な列も含まれています。

CREATE VIEW CUSTOMER_CHURN AS SELECT (CASE WHEN SAMPLES.CUSTOMER_CHURN."CENSOR" = '1' THEN 'YES' ELSE 'NO' END) CHURN, IN_B2B_INDUSTRY, TOTAL_BUY, ANNUAL_REVENUE_MIL, CUST_ID AS ID from SAMPLES.CUSTOMER_CHURN;
単純ベイズ予測には、トレーニング・データが入っている表が必要です。次の呼び出しは、この表を CUSTOMER_CHURN ビューから作成する方法を示しています。
CALL IDAX.SPLIT_DATA('intable=customer_churn, traintable=customer_churn_training, testtable=customer_churn_testing, id=id, fraction=0.65');
次の例は、離散化アルゴリズムおよびビン数を定義する方法を示します。
CALL IDAX.NAIVEBAYES('intable=customer_churn_training, disc=ew, bins=20, id=id, target=churn, model=cc_nb_ewd'); 

CALL IDAX.NAIVEBAYES('intable=customer_churn_training, disc=ef, bins=20, id=id, target=churn, model=cc_nb_efd'); 

CALL IDAX.NAIVEBAYES('intable=customer_churn_training, disc=ewn, id=id, target=churn, model=cc_nb_ewnd'); 

作成されるモデルは、属性/値/クラスの組み合わせごとに 1 行ずつと以下の列からなる表によって表されます。

attribute
属性
val
class
クラス
classvalcount
トレーニング・セットのクラス内の対応する属性の対応する値の出現回数
classcount
トレーニング・セットのクラスの出現回数。
attrclasscount
トレーニング・セットのクラスの非ヌルの出現回数。
totalcount
トレーニング・セットのすべてのインスタンスの数

単純ベイズ予測に使用できるクラスの事前確率および属性値の条件付き確率を計算するには、これらのパラメーターで十分です。

テスト・セットの予測を生成するには、作成したモデルを以下のように使用します。

CALL IDAX.PREDICT_NAIVEBAYES('model=cc_nb_ewd, intable=customer_churn_testing, outtable=customer_churn_nb_ewd, outtableprob = customer_churn_nb_ewd_prob'); 

CALL IDAX.PREDICT_NAIVEBAYES('model=cc_nb_efd, intable=customer_churn_testing, outtable=customer_churn_nb_efd, outtableprob = customer_churn_nb_efd_prob');

CALL IDAX.PREDICT_NAIVEBAYES('model=cc_nb_ewnd, intable=customer_churn_testing, outtable=customer_churn_nb_ewnd,outtableprob = customer_churn_nb_ewnd_prob');
注: テスト・データ内の予測プロシージャーの ID がトレーニング・データ内の予測プロシージャーの ID と等しい場合は、ID を定義する必要はありません。

モデルを適用する各テスト・セットは、対応するトレーニング・セットと同じ間隔を使用して離散化されます。指定した出力表に、生成された予測が格納されます。この表には、id 列と class 列があります。

さらに、もう 1 つ出力表が作成されます。この表の名前には、_prob 接尾部が付加されます。この出力表には、インスタンスごとに 1 行と、存在するクラス、および以下の列が含まれます。

id
インスタンス ID
class
クラス
prob
インスタンス・クラスのベイズ分子

この分子は、クラス確率とインスタンス属性値の条件付き確率から生成されます。

lnprob
prob の自然対数

これらの確率を使用して、モデルの予測からより深い洞察を得たり、モデル操作を変更したりできます。正規化によってベイズ分子を正規確率に変換できます。正規化とは、同じインスタンスとすべてのクラスの分子の合計で除算することを意味します。

次の照会は、最小エントロピー離散化を使用して生成した 3 番目のモデルについて、各インスタンスおよびその予測されたクラス・ラベルにクラス確率を追加する例を示しています。

SELECT S.id, S.class, S.prob/S.sump as prob 
FROM (SELECT id, class, prob, sum(prob) OVER (PARTITION BY id) AS sump FROM customer_churn_nb_ewnd_prob) S, customer_churn_nb_ewnd P 
WHERE S.id=P.id AND S.class=P.class; 

取得した予測の品質を評価するには、誤分類誤差を次のように計算します。

CALL IDAX.CERROR('intable=customer_churn_nb_ewd, resulttable=customer_churn_testing, id=id, target=class, resulttarget=churn');

CALL IDAX.CERROR('intable=customer_churn_nb_efd, resulttable=customer_churn_testing, id=id, target=class, resulttarget=churn'); 

CALL IDAX.CERROR('intable=customer_churn_nb_ewnd, resulttable=customer_churn_testing, id=id, target=class, resulttarget=churn'); 

これらのモデルは同じように動作しますが、等頻度離散化に基づく最初のモデルは他の 2 つのモデルほど正確ではありません。さらに、すべてのモデルで誤分類誤差レベルが 0.37 より大きいので、単純ベイズ分類器は顧客離れデータ・セットには適していないという結論になります。

予測時に何の確率も得られないという状況を避けるには、m-推定手法を有効にします。

この手法を有効にするには、PREDICT_NAIVEBAYES プロシージャーの mestimation=TRUE 引数を次のように指定します。

CALL IDAX.PREDICT_NAIVEBAYES('model=cc_nb_ewnd, intable=customer_churn_testing, mestimation=TRUE, outtable=customer_churn_nb_ewnd_mest'); 

CALL IDAX.CERROR('pred_table=customer_churn_nb_ewnd_mest, true_table=customer_churn_testing, pred_id=id, true_id=id, pred_column=class, true_column=churn'); 

この分析では、この手法は customer_churn データについて生成される予測の品質にほとんど影響を与えないことがわかります。

より高い予測品質の分析を行うには、混同行列および混同行列から得られる品質指標を使用します。3 番目のモデルで、次のようにします。

CALL IDAX.CONFUSION_MATRIX('intable=customer_churn_testing, resulttable=customer_churn_nb_ewnd, id=id, target=churn, matrixTable=cc_churn_nb_ewnd_cm'); 

CALL IDAX.CMATRIX_STATS('matrixTable=cc_churn_nb_ewnd_cm'); 

この結果から、顧客離れデータに対する単純ベイズ予測の品質を新たな観点から見直すことができます。大きい誤分類誤差は、約 0.55 もの高い偽陽性率を意味しますが、同時に約 0.77 という驚くほど高い真陽性率も意味します。この場合、顧客離れは陽性と見なされます。

以下のステートメントに示されているように、タイプとロールによってすべての列を定義できます。

CALL IDAX.NAIVEBAYES('model=cc_nb1, intable=customer_churn_training, id=id, target=churn');

このステートメントは、以下のステートメントと同じです。

CALL IDAX.NAIVEBAYES('model=cc_nb2, intable=customer_churn_training, incolumn=id:id, target=churn');

名義型属性と連続型属性を手動で定義するには、次のように nom タイプと cont タイプを使用します。

CALL IDAX.NAIVEBAYES('model=cc_nb3, intable=customer_churn_training,incolumn=IN_B2B_INDUSTRY:nom;TOTAL_BUY:cont;CHURN:target;ID:id');

また、以下のように、1 列のプロパティー定義を作成して、モデルに数回渡すこともできます。

CALL IDAX.COLUMN_PROPERTIES('intable=customer_churn_training, outtable=cc_columns, coldeftype=cont, incolumn=IN_B2B_INDUSTRY:nom;TOTAL_BUY:cont;ANNUAL_REVENUE_MIL:cont:ignore;CHURN:nom:target;ID:id');

select * from cc_columns;

CALL IDAX.NAIVEBAYES('model=cc_nb4, intable=customer_churn_training,colPropertiesTable=cc_columns');