5.2 Oracle Machine Learning for SQLの関数の使用

Oracle Machine Learning for SQLでSQL関数を使用する利点の一部を示します。

OML4SQLの関数には、次のメリットがあります。

  • 既存のSQLアプリケーションのコンテキストで、モデルを簡単に配置できます。

  • スコアリング操作では、既存の問合せ実行機能を利用します。これにより、パフォーマンスが向上します。

  • スコアリング結果がパイプライン化され、実体化を行わずに行を処理することができます。

機械学習関数は、選択した各行のスコアを生成します。これらの関数は、機械学習モデルのスキーマ・オブジェクトを適用してスコアを計算することも、事前定義されたモデルを使用せずに動的なスコアリングを行うこともできます(「動的スコアリング」を参照)。

5.2.1 予測子の選択

USING句を使用して、PREDICTION関数の予測子として異なる属性を選択できます。

OML4SQL関数では、スコアリングに使用する属性を指定するUSING句をサポートしています。選択した属性の一部またはすべてを指定でき、また式を指定することができます。次の例では、すべてPREDICTION関数を使用してアフィニティ・カードを使用しそうな顧客を検出していますが、各例で異なる予測子のセットを使用しています。

予測子の値がトレーニング・データにない場合、モデルでは、トレーニング・データにない質的値がエラーなしでスコアリングされます。スコアは、残りの予測子を使用して生成されます。これにより、無効な値を持つ単一レコードのために失敗しないバッチ・スコアリングが可能になります。また、k-Meansやガウス分布のSVMなどの一部のアルゴリズムでは、不明な値の距離が大きくなるなど、新しい値が有意義な方法で予測を変更できます。さらに、スコアリング用に提供された表またはビューには、作成用に存在しない追加列が存在することがあり、モデル署名に一致する列のみが使用されます。また、スコアリングは、モデル・シグネチャにリストされているよりも少ない予測子で実行できます。

パーティション・モデルの場合は、パーティション値が無効な場合にNULLスコアが生成されます。パーティション列の値を省略すると、エラー・メッセージが返されます。

例5-1の問合せでは、すべての予測子を使用しています。

例5-2の問合せでは、予測子として性別、未婚/既婚、職業および所得のみを使用しています。

例5-3の問合せでは、予測子として3つの属性と1つの式を使用しています。予測は、性別、未婚/既婚、職業に加えて、すべての顧客が最高額所得者階層に属するという前提に基づいて行われています。

例5-1 すべての予測子を使用した場合

dt_sh_clas_sampleモデルは、oml4sql-classification-decision-tree.sqlの例によって作成されます。

SELECT cust_gender, COUNT(*) AS cnt, ROUND(AVG(age)) AS avg_age
     FROM mining_data_apply_v
     WHERE PREDICTION(dt_sh_clas_sample USING *) = 1
   GROUP BY cust_gender
   ORDER BY cust_gender;
 
C        CNT    AVG_AGE
- ---------- ----------
F         25         38
M        213         43

例5-2 一部の予測子を使用した場合

 SELECT cust_gender, COUNT(*) AS cnt, ROUND(AVG(age)) AS avg_age
     FROM mining_data_apply_v
     WHERE PREDICTION(dt_sh_clas_sample USING
                      cust_gender,cust_marital_status,
                      occupation, cust_income_level) = 1
   GROUP BY cust_gender
   ORDER BY cust_gender;
 
C        CNT    AVG_AGE
- ---------- ----------
F         30         38
M        186         43

例5-3 一部の予測子と1つの式を使用した場合

SELECT cust_gender, COUNT(*) AS cnt, ROUND(AVG(age)) AS avg_age
     FROM mining_data_apply_v
     WHERE PREDICTION(dt_sh_clas_sample USING
                     cust_gender, cust_marital_status, occupation,
                    'L: 300,000 and above' AS cust_income_level) = 1
   GROUP BY cust_gender
   ORDER BY cust_gender;
 
C        CNT    AVG_AGE
- ---------- ----------
F         30         38
M        186         43

5.2.2 単一レコード・スコアリング

0と1を生成する単一のレコードをスコアリングして、アフィニティ・カードを使用する可能性が高いまたは低い顧客を予測します。

Oracle Machine Learning for SQLの関数は、単一レコードのスコアを生成できます(例5-4および例5-5を参照)。

例5-4では、分類モデルNB_SH_Clas_sampleを適用することによって、顧客102001に対する予測が戻されます。結果として生成されるスコアは0 (この顧客がアフィニティ・カードを使用する可能性は低い)です。NB_SH_Clas_Sampleモデルは、oml4sql-classification-naive-bayes.sqlの例によって作成されます。

例5-5では、テキストの機械学習モデルT_SVM_Clas_sampleを適用することによって、コメント属性として「Affinity card is great」を使用した場合の予測が戻されます。結果として生成されるスコアは1 (この顧客がアフィニティ・カードを使用する可能性は高い)です。T_SVM_Clas_sampleモデルは、oml4sql-classification-text-analysis-svm.sqlの例によって作成されます。

例5-4 単一の顧客または単一のテキスト式のスコアリング

SELECT PREDICTION (NB_SH_Clas_Sample USING *)
    FROM sh.customers where cust_id = 102001;  

出力内容は次のようになります。

 
PREDICTION(NB_SH_CLAS_SAMPLEUSING*)
-----------------------------------
                                  0

例5-5 単一のテキスト式のスコアリング

SELECT
  PREDICTION(T_SVM_Clas_sample USING 'Affinity card is great' AS comments)
FROM DUAL;
 

出力内容は次のようになります。


PREDICTION(T_SVM_CLAS_SAMPLEUSING'AFFINITYCARDISGREAT'ASCOMMENTS)
-----------------------------------------------------------------
                                                                1