37.2 Oracle Machine Learning for SQLの関数の使用
Oracle Machine Learning for SQLでSQL関数を使用する利点の一部を示します。
OML4SQLの関数には、次のような利点があります。
-
既存のSQLアプリケーションのコンテキストで、モデルを簡単に配置できます。
-
スコアリング操作では、既存の問合せ実行機能を利用します。これにより、パフォーマンスが向上します。
-
スコアリング結果がパイプライン化され、実体化を行わずに行を処理することができます。
機械学習ファンクションは、選択した各行のスコアを生成します。これらの関数は、機械学習モデルのスキーマ・オブジェクトを適用してスコアを計算することも、事前定義されたモデルを使用せずに動的なスコアリングを行うこともできます(「動的スコアリング」を参照)。
37.2.1 予測子の選択
USING
句を使用して、PREDICTION
関数の予測子として異なる属性を選択できます。
OML4SQLの関数は、スコアリングに使用する属性を指定するUSING
句をサポートしています。選択した属性の一部またはすべてを指定でき、また式を指定することができます。次の例では、すべてPREDICTION
関数を使用してアフィニティ・カードを使用しそうな顧客を検出していますが、各例で異なる予測子のセットを使用しています。
予測子の値がトレーニング・データにない場合、モデルでは、トレーニング・データにない質的値がエラーなしでスコアリングされます。スコアは、残りの予測子を使用して生成されます。これにより、無効な値を持つ単一レコードのために失敗しないバッチ・スコアリングが可能になります。また、k-Meansやガウス分布のSVMなどの一部のアルゴリズムでは、不明な値の距離が大きくなるなど、新しい値が有意義な方法で予測を変更できます。さらに、スコアリング用に提供された表またはビューには、作成用に存在しない追加列が存在することがあり、モデル署名に一致する列のみが使用されます。また、スコアリングは、モデル・シグネチャにリストされているよりも少ない予測子で実行できます。
パーティション・モデルの場合は、パーティション値が無効な場合にNULL
スコアが生成されます。パーティション列の値を省略すると、エラー・メッセージが返されます。
例37-1の問合せでは、すべての予測子を使用しています。
例37-2の問合せでは、予測子として性別、未婚/既婚、職業および所得のみを使用しています。
例37-3の問合せでは、予測子として3つの属性と1つの式を使用しています。予測は、性別、未婚/既婚、職業に加えて、すべての顧客が最高額所得者階層に属するという前提に基づいて行われています。
例37-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
例37-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
例37-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
37.2.2 単一レコードのスコアリング
0と1を生成する単一のレコードをスコアリングして、アフィニティ・カードを使用する可能性が高いまたは低い顧客を予測します。
Oracle Machine Learning for SQLの関数は、単一レコードのスコアを生成できます(例37-4および例37-5を参照)。
例37-4では、分類モデルNB_SH_Clas_sampleを適用することによって、顧客102001に対する予測が戻されます。結果として生成されるスコアは0 (この顧客がアフィニティ・カードを使用する可能性は低い)です。NB_SH_Clas_Sampleモデルは、oml4sql-classification-naive-bayes.sql
の例で作成します。
例37-5では、機械学習モデルT_SVM_Clas_sampleを適用することによって、コメント属性として「Affinity card is great」を使用した場合の予測が戻されます。結果として生成されるスコアは1 (この顧客がアフィニティ・カードを使用する可能性は高い)です。T_SVM_Clas_sampleモデルは、oml4sql-classification-text-analysis-svm.sql
の例で作成します。
例37-4 単一の顧客または単一のテキスト式のスコアリング
SELECT PREDICTION (NB_SH_Clas_Sample USING *) FROM sh.customers where cust_id = 102001;
出力内容は次のようになります。
PREDICTION(NB_SH_CLAS_SAMPLEUSING*)
-----------------------------------
0
例37-5 単一のテキスト式のスコアリング
SELECT PREDICTION(T_SVM_Clas_sample USING 'Affinity card is great' AS comments) FROM DUAL;
出力内容は次のようになります。
PREDICTION(T_SVM_CLAS_SAMPLEUSING'AFFINITYCARDISGREAT'ASCOMMENTS)
-----------------------------------------------------------------
1