スコアリングと配置について

スコアリングとは、新しいデータにモデルを適用することです。Oracle Machine Learning for SQLでは、スコアリングはSQL言語関数によって実行されます。

予測のファンクションでは、分類回帰または異常検出を実行します。クラスタリングのファンクションでは、行をクラスタに割り当てます。特徴抽出のファンクションでは、入力データをより高い順序の予測子セットに変換します。DBMS_DATA_MINING PL/SQLパッケージでは、スコアリング・プロシージャも使用可能です。

配置とは、ターゲット環境でモデルを使用することです。モデルを作成した後は、最適な結果を得るためにそれらのモデルを配置し、本番環境内でメンテナンスすることが課題となります。 デプロイメントは次のいずれかになります。

  • バッチまたはリアルタイム処理によるデータのスコアリング。スコアには、予測、確率、ルールおよびその他の統計を含めることができます。

  • モデルの詳細の抽出とレポートの作成。たとえば: クラスタリング・ルール、デシジョン・ツリー・ルール、属性評価モデルの属性のランク付け。

  • アプリケーションや業務系システムに機械学習の結果を組み込むことによるデータ・ウェアハウスのビジネス・インテリジェンス・インフラストラクチャの強化。

  • モデルを作成したデータベースからスコアリング用データベースへのモデルの移動(エクスポートとインポート)

OML4SQLは、こうした配置シナリオのすべてをサポートします。

ノート:

OML4SQLのスコアリング操作では、パラレル実行がサポートされます。パラレル実行を有効にすると、複数のCPUおよびI/Oリソースを1つのデータベース操作の実行に適用することができます。

パラレル実行は、通常意思決定支援システム(DSS)およびデータ・ウェアハウスに関連付けられている複雑な問合せや大規模データベースを使用する操作では特に、パフォーマンスを大幅に向上させます。

Oracle Machine Learning for SQLの関数の使用

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

OML4SQLの関数には、次のような利点があります。

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

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

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

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

予測子の選択

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

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

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

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

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

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

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

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

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

例3-8 一部の予測子を使用した場合

 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

例3-9 一部の予測子と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

単一レコードのスコアリング

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

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

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

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

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

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

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

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

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

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

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


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

予測の詳細

予測の詳細は、スコアに関する情報を提供するXML文字列です。

すべてのタイプのスコアリング(クラスタリング特徴抽出分類回帰および異常検出)に対して詳細を使用できます。詳細は、スコアリングが動的であるかモデル適用の結果であるかに関係なく使用できます。

詳細関数CLUSTER_DETAILSFEATURE_DETAILSおよびPREDICTION_DETAILSでは、スコアリングに使用された属性の実測値およびスコアの判断における属性の相対的な重要度が戻されます。これらの関数では、デフォルトで5つの最も重要な属性が重要度が高い順に戻されます。

クラスタの詳細

CLUSTER_DETAILS関数の例を示します。

顧客100955の最も可能性が高いクラスタ割当て(20%を超える割当ての確率)について次の例の問合せでは、可能性の高いクラスタごとに最も影響がある属性を5つ生成します。クラスタリング関数により、mining_data_apply_vから選択したデータにem_sh_clus_sampleという期待値最大化モデルが適用されます。デフォルトで5つの属性が戻されるため、CLUSTER_DETAILSで指定されている「5」は必須ではありません。em_sh_clus_sampleモデルは、oml4sql-clustering-expectation-maximization.sqlの例によって作成されます。

例3-12 クラスタの詳細

SELECT S.cluster_id, probability prob,
           CLUSTER_DETAILS(em_sh_clus_sample, S.cluster_id, 5 USING T.*) det
    FROM
      (SELECT v.*, CLUSTER_SET(em_sh_clus_sample, NULL, 0.2 USING *) pset
        FROM mining_data_apply_v v
       WHERE cust_id = 100955) T,
      TABLE(T.pset) S
    ORDER BY 2 DESC;

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

 
CLUSTER_ID  PROB DET
---------- ----- ----------------------------------------------------------------------------
        14 .6761 <Details algorithm="Expectation Maximization" cluster="14">  
                 <Attribute name="AGE" actualValue="51" weight=".676" rank="1"/>
                 <Attribute name="HOME_THEATER_PACKAGE" actualValue="1" weight=".557" rank="2"/>
                 <Attribute name="FLAT_PANEL_MONITOR" actualValue="0" weight=".412" rank="3"/>
                 <Attribute name="Y_BOX_GAMES" actualValue="0" weight=".171" rank="4"/>
                 <Attribute name="BOOKKEEPING_APPLICATION"actualValue="1" weight="-.003"
                  rank="5"/>
                 </Details>
 
         3 .3227 <Details algorithm="Expectation Maximization" cluster="3">
                 <Attribute name="YRS_RESIDENCE" actualValue="3" weight=".323" rank="1"/>
                 <Attribute name="BULK_PACK_DISKETTES" actualValue="1" weight=".265" rank="2"/>
                 <Attribute name="EDUCATION" actualValue="HS-grad" weight=".172" rank="3"/>
                 <Attribute name="AFFINITY_CARD" actualValue="0" weight=".125" rank="4"/>
                 <Attribute name="OCCUPATION" actualValue="Crafts" weight=".055" rank="5"/>
                 </Details>
特徴の詳細

FEATURE_DETAILS関数の例を示します。

次の例の問合せでは、顧客101501に関する最上位の主成分分析(PCA)投影に最も影響を与える3つの属性が戻されます。FEATURE_DETAILS関数では、svd_sh_sample_build_num tableから選択したデータにsvd_sh_sampleという特異値分解モデル(SVD)が適用されます。表とモデルはoml4sql-singular-value-decomposition.sqlの例で作成します。

例3-13 特徴の詳細

SELECT FEATURE_DETAILS(svd_sh_sample, 1, 3 USING *) proj1det
  FROM svd_sh_sample_build_num
  WHERE CUST_ID = 101501;

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


PROJ1DET
--------------------------------------------------------------------------------
<Details algorithm="Singular Value Decomposition" feature="1">
<Attribute name="HOME_THEATER_PACKAGE" actualValue="1" weight=".352" rank="1"/>
<Attribute name="Y_BOX_GAMES" actualValue="0" weight=".249" rank="2"/>
<Attribute name="AGE" actualValue="41" weight=".063" rank="3"/>
</Details>
予測の詳細

PREDICTION_DETAILS関数の例を示します。

次の例の問合せでは、顧客100010の年齢を予測する場合に最も重要な属性が戻されます。予測関数では、mining_data_apply_vから選択されたデータにGLMR_SH_Regr_sampleという名前が付けられた一般化線形モデルの回帰モデルが適用されます。GLMR_SH_Regr_sampleモデルは、oml4sql-regression-glm.sqlの例で作成します。

例3-14 回帰用の予測の詳細

SELECT cust_id,
      PREDICTION(GLMR_SH_Regr_sample USING *) pr,
      PREDICTION_DETAILS(GLMR_SH_Regr_sample USING *) pd
  FROM mining_data_apply_v
  WHERE CUST_ID = 100010;

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


CUST_ID    PR PD
------- ----- -----------
 100010 25.45 <Details algorithm="Generalized Linear Model">
              <Attribute name="FLAT_PANEL_MONITOR" actualValue="1" weight=".025" rank="1"/>
              <Attribute name="OCCUPATION" actualValue="Crafts" weight=".019" rank="2"/>
              <Attribute name="AFFINITY_CARD" actualValue="0" weight=".01" rank="3"/>
              <Attribute name="OS_DOC_SET_KANJI" actualValue="0" weight="0" rank="4"/>
              <Attribute name="BOOKKEEPING_APPLICATION" actualValue="1" weight="-.004" rank="5"/>
              </Details>

次の例の問合せでは、技術サポートで働いている、アフィニティ・カードを使用する可能性が高い(85%より高い確率)顧客が戻されます。予測関数では、mining_data_apply_vから選択されたデータにsvmc_sh_clas_sampleというスーパー・ベクター・マシン(SVM)分類モデルが適用されます。問合せには、学歴が最も重要な予測子であることを示す予測の詳細が含まれています。svmc_sh_clas_sampleモデルは、oml4sql-classification-svm.sqlの例で作成します。

例3-15 分類用の予測の詳細

SELECT cust_id, PREDICTION_DETAILS(svmc_sh_clas_sample, 1 USING *) PD
      FROM mining_data_apply_v
  WHERE PREDICTION_PROBABILITY(svmc_sh_clas_sample, 1 USING *) > 0.85
  AND occupation = 'TechSup'
  ORDER BY cust_id;

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


 
CUST_ID PD
------- ---------------------------------------------------------------------------------------
 100029 <Details algorithm="Support Vector Machines" class="1">
        <Attribute name="EDUCATION" actualValue="Assoc-A" weight=".199" rank="1"/>
        <Attribute name="CUST_INCOME_LEVEL" actualValue="I: 170\,000 - 189\,999" weight=".044"
         rank="2"/>
        <Attribute name="HOME_THEATER_PACKAGE" actualValue="1" weight=".028" rank="3"/>
        <Attribute name="BULK_PACK_DISKETTES" actualValue="1" weight=".024" rank="4"/>
        <Attribute name="BOOKKEEPING_APPLICATION" actualValue="1" weight=".022" rank="5"/>
        </Details>
 
 100378 <Details algorithm="Support Vector Machines" class="1">
        <Attribute name="EDUCATION" actualValue="Assoc-A" weight=".21" rank="1"/>
        <Attribute name="CUST_INCOME_LEVEL" actualValue="B: 30\,000 - 49\,999" weight=".047"
         rank="2"/>
        <Attribute name="FLAT_PANEL_MONITOR" actualValue="0" weight=".043" rank="3"/>
        <Attribute name="HOME_THEATER_PACKAGE" actualValue="1" weight=".03" rank="4"/>
        <Attribute name="BOOKKEEPING_APPLICATION" actualValue="1" weight=".023" rank="5"/>
        </Details>
 
 100508 <Details algorithm="Support Vector Machines" class="1">
        <Attribute name="EDUCATION" actualValue="Bach." weight=".19" rank="1"/>
        <Attribute name="CUST_INCOME_LEVEL" actualValue="L: 300\,000 and above" weight=".046"
         rank="2"/>
        <Attribute name="HOME_THEATER_PACKAGE" actualValue="1" weight=".031" rank="3"/>
        <Attribute name="BULK_PACK_DISKETTES" actualValue="1" weight=".026" rank="4"/>
        <Attribute name="BOOKKEEPING_APPLICATION" actualValue="1" weight=".024" rank="5"/>
        </Details>
 
 100980 <Details algorithm="Support Vector Machines" class="1">
        <Attribute name="EDUCATION" actualValue="Assoc-A" weight=".19" rank="1"/>
        <Attribute name="FLAT_PANEL_MONITOR" actualValue="0" weight=".038" rank="2"/>
        <Attribute name="HOME_THEATER_PACKAGE" actualValue="1" weight=".026" rank="3"/>
        <Attribute name="BULK_PACK_DISKETTES" actualValue="1" weight=".022" rank="4"/>
        <Attribute name="BOOKKEEPING_APPLICATION" actualValue="1" weight=".02" rank="5"/>
        </Details>

次の例の問合せでは、他の顧客と最も異なる2人の顧客が戻されます。予測関数により、mining_data_apply_vから選択したデータにSVMO_SH_Clas_sampleという異常検出モデルが適用されます。異常検出では、1クラスSVM分類子を使用します。このモデルは、oml4sql-singular-value-decomposition.sqlの例で作成します。

例3-16 異常検出用の予測の詳細

SELECT cust_id, pd FROM
  (SELECT cust_id,        
         PREDICTION_DETAILS(SVMO_SH_Clas_sample, 0 USING *) pd,
         RANK() OVER (ORDER BY prediction_probability(
               SVMO_SH_Clas_sample, 0 USING *) DESC, cust_id) rnk
  FROM mining_data_one_class_v)
  WHERE rnk <= 2
  ORDER BY rnk;

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


  CUST_ID PD
---------- -----------------------------------------------------------------------------------
    102366 <Details algorithm="Support Vector Machines" class="0">
           <Attribute name="COUNTRY_NAME" actualValue="United Kingdom" weight=".078" rank="1"/>
           <Attribute name="CUST_MARITAL_STATUS" actualValue="Divorc." weight=".027" rank="2"/>
           <Attribute name="CUST_GENDER" actualValue="F" weight=".01" rank="3"/>
           <Attribute name="HOUSEHOLD_SIZE" actualValue="9+" weight=".009" rank="4"/>
           <Attribute name="AGE" actualValue="28" weight=".006" rank="5"/>
           </Details>
 
    101790 <Details algorithm="Support Vector Machines" class="0">
           <Attribute name="COUNTRY_NAME" actualValue="Canada" weight=".068" rank="1"/>
           <Attribute name="HOUSEHOLD_SIZE" actualValue="4-5" weight=".018" rank="2"/>
           <Attribute name="EDUCATION" actualValue="7th-8th" weight=".015" rank="3"/>
           <Attribute name="CUST_GENDER" actualValue="F" weight=".013" rank="4"/>
           <Attribute name="AGE" actualValue="38" weight=".001" rank="5"/>
           </Details>
GROUPINGヒント

OML4SQLの関数には、PREDICTION*CLUSTER*FEATURE*およびORA_DM_*が含まれています。GROUPINGヒントは、パーティション化されたモデルをスコアリングするときに、機械学習スコアリング関数に適用されるオプションのヒントです。

拡張されたPREDICTION関数コマンド・フォーマット

このヒントによって、入力データ・セットが個別のデータ・スライスにパーティション化されるため、次のパーティションに進む前に各パーティション全体がスコアリングされます。ただし、パーティションによるパラレル化も使用できます。データ・スライスは、モデルの構築時に使用されたパーティション化キー列によって決定されます。この方法は、パーティション化されたモデルに対する機械学習ファンクションとともに使用できます。このヒントにより、多くのパーティションに関連付けられている大規模データをスコアリングするときは問合せパフォーマンスが向上する可能性がありますが、大規模システムでパーティションが少ない大規模データをスコアリングするときはパフォーマンスが低下する可能性があります。通常、ヒントを単一行問合せに使用する場合、パフォーマンスは向上しません。

<prediction function> ::=
    PREDICTION <left paren> /*+ GROUPING */ <prediction model>
        [ <comma> <class value> [ <comma> <top N> ] ]
        USING <machine learning attribute list> <right paren>

PREDICTION関数専用の構文が指定されますが、PREDICTIONCLUSTERINGおよびFEATURE_EXTRACTIONスコアリング関数が発生する機械学習ファンクションに適用可能です。

例3-17 例

SELECT PREDICTION(/*+ GROUPING */my_model USING *) pred FROM <input table>;

データベース内スコアリング

スコアリングとは、新しいデータに機械学習アルゴリズムを適用することです。Oracle Machine Learning for SQLスコアリング・エンジンとデータは、両方ともデータベース内に存在します。

従来の機械学習では、リモート・システム上の特殊なソフトウェアを使用してモデルが構築され、そのモデルはスコアリングのために別のシステムに配置されます。これは、面倒でエラーの発生しやすいプロセスであり、セキュリティ違反に対して脆弱で、データ同期に困難が伴います。

Oracle Machine Learning for SQLでは、スコアリングは簡単で安全です。スコアリング・エンジンとデータは、両方ともデータベース内に存在します。スコアリングはSQL言語の機能拡張であるため、機械学習の結果は、アプリケーションおよびレポート・システムに簡単に統合できます。

パラレル実行と管理の簡易化

Oracle Machine Learning for SQLのすべてのスコアリング・ルーチンは、大規模データ・セットのスコアリングのためのパラレル実行をサポートしています。

データベース内スコアリングにはパフォーマンス上の利点があります。Oracle Machine Learning for SQLのすべてのスコアリング・ルーチンでは、パラレル実行がサポートされています。パラレル実行により、複雑な問合せの実行や大規模なデータ・セットのスコアリングに必要な時間が大幅に短縮されます。

データベース内機械学習により、Oracle Machine Learning for SQLの取り組みをサポートするために必要なIT作業が最小限になります。標準的なデータベース技術を使用して、モデルをより新しいデータに簡単にリフレッシュ(再作成)および再デプロイできます。スコアリング問合せが同じままであるため、データベースで基礎となるモデルが置き換えられるのみであり、デプロイは迅速です。

モデル適用と動的スコアリングのためのSQL関数

Oracle Machine Learning for SQLでは、スコアリングはSQL言語関数によって実行されます。SQL関数を使用した様々なスコアリング方法について説明します。

それらの関数は、予測、クラスタリングおよび特徴抽出を実行します。それらの関数は、2つの異なる方法、つまり、機械学習モデル・オブジェクトを適用する方法(例3-18)または機械学習分析を動的に計算する分析句を実行してそれをデータに適用する方法(例3-19)によって呼び出すことができます。動的スコアリングでは、モデルの必要性がなくなります。動的スコアリングは、機械学習のプロセスで説明されている従来の方法の補完として使用でき、そのかわりに使用することさえもできます。

例3-18では、PREDICTION_PROBABILITY関数によって、例5-1で作成されたモデルsvmc_sh_clas_sampleが適用され、mining_data_apply_vのデータがスコアリングされます。この関数によって、提携カードを使用する可能性の最も高いイタリアの10人の顧客が戻されます。

例3-19では、PREDICTIONおよびPREDICTION_PROBABILITY関数によって、分析構文(OVER ()句)が使用され、mining_data_apply_vのデータが動的にスコアリングされます。この問合せによって、現在提携カードを持っていないが、それを使用する可能性の高い顧客が戻されます。

例3-18 Oracle Machine Learning for SQLモデルの適用によるデータのスコアリング

SELECT cust_id FROM
  (SELECT cust_id, 
        rank() over (order by PREDICTION_PROBABILITY(svmc_sh_clas_sample, 1
                     USING *) DESC, cust_id) rnk
   FROM mining_data_apply_v
   WHERE country_name = 'Italy')
WHERE rnk <= 10
ORDER BY rnk;

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

 CUST_ID
----------
    101445
    100179
    100662
    100733
    100554
    100081
    100344
    100324
    100185
    101345

例3-19 分析関数の実行によるデータのスコアリング

SELECT cust_id, pred_prob FROM
  (SELECT cust_id, affinity_card, 
    PREDICTION(FOR TO_CHAR(affinity_card) USING *) OVER () pred_card,
    PREDICTION_PROBABILITY(FOR TO_CHAR(affinity_card),1 USING *) OVER () pred_prob
   FROM mining_data_build_v)
WHERE affinity_card = 0
AND pred_card = 1
ORDER BY pred_prob DESC;

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

 CUST_ID PRED_PROB
---------- ---------
    102434       .96
    102365       .96
    102330       .96
    101733       .95
    102615       .94
    102686       .94
    102749       .93
    .
    .
    .
    101656       .51

動的スコアリング

なんらかの理由で事前定義済モデルを適用しない場合は、動的スコアリングを実行できます。

Oracle Machine Learning for SQL関数は、2つのモード(事前定義されたモデルの適用または分析句の実行)で実行されます。モデル名ではなく分析句を指定すると、関数では1つ以上の一時モデルを作成し、これらのモデルを使用してデータをスコアリングします。

事前定義されたモデルを使用せずに動的なデータのスコアリングを行う機能によって、基本的な組込み機械学習手法が、モデルを使用できない環境にまで拡張して適用されます。ただし、動的スコアリングには制限があります。動的スコアリング中に作成された一時モデルは、検査や細かいチューニングには使用できません。モデルの検査、スコアリング結果とモデルとの相関、特別なアルゴリズム設定、または同じモデルを使用する複数のスコアリング問合せが必要なアプリケーションでは、事前定義されたモデルが必要です。

次の例は、動的スコアリング問合せを示しています。この例では、特異な顧客の年齢値を含む入力データの行を特定します。

例3-20 動的予測

SELECT cust_id, age, pred_age, age-pred_age age_diff, pred_det FROM
 (SELECT cust_id, age, pred_age, pred_det,
    RANK() OVER (ORDER BY ABS(age-pred_age) DESC) rnk FROM
    (SELECT cust_id, age,
         PREDICTION(FOR age USING *) OVER () pred_age,
         PREDICTION_DETAILS(FOR age ABS USING *) OVER () pred_det
  FROM mining_data_apply_v))
WHERE rnk <= 5; 

出力は次のようになります:


CUST_ID  AGE   PRED_AGE AGE_DIFF PRED_DET
------- ---- ---------- -------- --------------------------------------------------------------
 100910   80 40.6686505    39.33 <Details algorithm="Support Vector Machines">
                                 <Attribute name="HOME_THEATER_PACKAGE" actualValue="1"
                                  weight=".059" rank="1"/>
                                 <Attribute name="Y_BOX_GAMES" actualValue="0"
                                  weight=".059" rank="2"/>
                                 <Attribute name="AFFINITY_CARD" actualValue="0"
                                  weight=".059" rank="3"/>
                                 <Attribute name="FLAT_PANEL_MONITOR" actualValue="1"
                                  weight=".059" rank="4"/>
                                 <Attribute name="YRS_RESIDENCE" actualValue="4"
                                  weight=".059" rank="5"/>
                                  </Details>
 
 101285   79 42.1753571    36.82 <Details algorithm="Support Vector Machines">
                                 <Attribute name="HOME_THEATER_PACKAGE" actualValue="1"
                                  weight=".059" rank="1"/>
                                 <Attribute name="HOUSEHOLD_SIZE" actualValue="2" weight=".059"
                                  rank="2"/>
                                 <Attribute name="CUST_MARITAL_STATUS" actualValue="Mabsent"
                                  weight=".059" rank="3"/>
                                 <Attribute name="Y_BOX_GAMES" actualValue="0" weight=".059"
                                  rank="4"/>
                                 <Attribute name="OCCUPATION" actualValue="Prof." weight=".059"
                                  rank="5"/>
                                 </Details>
 
 100694   77 41.0396722    35.96 <Details algorithm="Support Vector Machines">
                                 <Attribute name="HOME_THEATER_PACKAGE" actualValue="1"
                                  weight=".059" rank="1"/>
                                 <Attribute name="EDUCATION" actualValue="&lt; Bach."
                                  weight=".059" rank="2"/>
                                 <Attribute name="Y_BOX_GAMES" actualValue="0" weight=".059"
                                  rank="3"/>
                                 <Attribute name="CUST_ID" actualValue="100694" weight=".059"
                                  rank="4"/>
                                 <Attribute name="COUNTRY_NAME" actualValue="United States of
                                  America" weight=".059" rank="5"/>
                                 </Details>
 
 100308   81 45.3252491    35.67 <Details algorithm="Support Vector Machines">
                                 <Attribute name="HOME_THEATER_PACKAGE" actualValue="1"
                                  weight=".059" rank="1"/>
                                 <Attribute name="Y_BOX_GAMES" actualValue="0" weight=".059"
                                  rank="2"/>
                                 <Attribute name="HOUSEHOLD_SIZE" actualValue="2" weight=".059"
                                  rank="3"/>
                                 <Attribute name="FLAT_PANEL_MONITOR" actualValue="1"
                                  weight=".059" rank="4"/>
                                 <Attribute name="CUST_GENDER" actualValue="F" weight=".059"
                                  rank="5"/>
                                 </Details>
 
 101256   90 54.3862214    35.61 <Details algorithm="Support Vector Machines">
                                 <Attribute name="YRS_RESIDENCE" actualValue="9" weight=".059"
                                  rank="1"/>
                                 <Attribute name="HOME_THEATER_PACKAGE" actualValue="1"
                                  weight=".059" rank="2"/>
                                 <Attribute name="EDUCATION" actualValue="&lt; Bach."
                                  weight=".059" rank="3"/>
                                 <Attribute name="Y_BOX_GAMES" actualValue="0" weight=".059"
                                  rank="4"/>
                                 <Attribute name="COUNTRY_NAME" actualValue="United States of
                                  America" weight=".059" rank="5"/>
                                 </Details>

リアルタイムのスコアリング

SQL問合せを実行して、リアルタイムのスコアリングを実行できます。例は、PREDICTION_PROBABILITY関数を使用したリアルタイム問合せを示しています。結果に基づいて、顧客担当は顧客にバリュー・カードを提案できます。

Oracle Machine Learning for SQLのファンクションでは、稼働中の本番システムや業務系システムに簡単に組み込むことが可能な、予測、クラスタリングおよび特徴抽出の分析を行うことができます。機械学習の結果はSQL問合せ内で戻されるため、機械学習はリアルタイムで実行できます。

リアルタイムのスコアリングでは、販売時点のデータベース・トランザクションをマイニングできます。現場の従業員がより適切な分析的判断を下すために役立つ予測やルール・セットを生成することが可能です。リアルタイムのスコアリングによって、不正の検知、潜在的負債の判別、マーケティングや販売の好機の把握ができるようになります。

次の例では、dt_sh_clas_sampleというデシジョン・ツリー・モデルを使用して、顧客101488がアフィニティ・カードを使用する確率を予測しています。顧客担当者は、電話でこの顧客と会話しているときに、リアルタイムでこの情報を取得できます。問合せの結果によれば、顧客がカードを使用する確率は73%であるため、担当者は付加価値の高いカードを提案することができます。このモデルはoml4sql-classification-decision-tree.sqlの例で作成します。

例3-21 予測確率を求めるリアルタイムの問合せ

SELECT PREDICTION_PROBABILITY(dt_sh_clas_sample, 1 USING *) cust_card_prob
       FROM mining_data_apply_v
       WHERE cust_id = 101488;

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


CUST_CARD_PROB
--------------
        .72764

DBMS_DATA_MINING.APPLY

DBMS_DATA_MININGAPPLYプロシージャは、スコアリングの結果を表に直接書き込むバッチでの適用操作です。

その表の列は、機械学習ファンクションに依存します。

APPLYによるスコアリングでは、SQLスコアリング関数によるスコアリングと同じ結果が生成されます。たとえば、分類では各ケースの予測と確率が生成され、クラスタリングでは各ケースのクラスタIDと確率が生成されます。異なっているのは、スコアリング結果の取得方法と、その取得に使用できるメカニズムです。

APPLYによって作成される出力表の列を次の表に示します。

表3-14 APPLY出力表

機械学習手法 出力列

分類

CASE_ID

PREDICTION

PROBABILITY

回帰

CASE_ID

PREDICTION

異常検出

CASE_ID

PREDICTION

PROBABILITY

クラスタリング

CASE_ID

CLUSTER_ID

PROBABILITY

特徴抽出

CASE_ID

FEATURE_ID

MATCH_QUALITY

APPLYの出力はスコアリング・データとは別に保存されるため、スコアリング結果の行を含めた問合せをサポートするには、出力とスコアリング・データを結合する必要があります。したがって、APPLYで使用されるモデルにはケースIDが必要となります。

ケースIDは、SQLスコアリング関数で適用されるモデルには不要です。同様に、スコアリング結果はSQL問合せ内でリアルタイムに生成および使用されるため、保存や結合も不要です。

次の例は、APPLYによる異常検出を示しています。このAPPLY出力表の問合せは、表の最初の10名の顧客を戻します。各顧客について、典型的(1)または異常(0)である確率が示されます。SVMO_SH_Clas_sampleモデルは、oml4sql-anomaly-detection-1class-svm.sqlの例で作成します。

例3-22 DBMS_DATA_MINING.APPLYを使用した異常検出

EXEC dbms_data_mining.apply
        ('SVMO_SH_Clas_sample','svmo_sh_sample_prepared', 
         'cust_id', 'one_class_output'); 

SELECT * from one_class_output where rownum < 11;

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


 
   CUST_ID PREDICTION PROBABILITY
---------- ---------- -----------
    101798          1  .567389309
    101798          0  .432610691
    102276          1  .564922469
    102276          0  .435077531
    102404          1   .51213544
    102404          0   .48786456
    101891          1  .563474346
    101891          0  .436525654
    102815          0  .500663683
    102815          1  .499336317

テキストに対する機械学習の操作を含むモデルの作成

モデルを作成し、テキストに対して機械学習操作を実行するための設定を指定します。

Oracle Machine Learning for SQLでは、VARCHAR2CHARCLOBBLOBおよびBFILEの列内の非構造化テキストをサポートしています(次の表を参照)。

表3-15 非構造化テキストを格納できる列のデータ型

データ型 説明

BFILEおよびBLOB

Oracle Machine Learning for SQLでは、モデルの作成時にユーザーがテキストとして特定した場合にのみBLOBおよびBFILEの列をテキストとして解釈します。列をテキストとして特定していない場合は、CREATE_MODELがエラーを戻します。

CLOB

OML4SQLは、CLOBをテキストとして解釈します。

CHAR

OML4SQLは、デフォルトでCHARを質的として解釈します。モデルの作成時に、CHARの列をテキストとして特定することができます。

VARCHAR2

OML4SQLは、データの長さが4000より長いVARCHAR2をテキストとして解釈します。

OML4SQLは、デフォルトでデータの長さが4000以下のVARCHAR2を質的として解釈します。モデルの作成時に、これらの列をテキストとして特定することができます。

ノート:

テキストは、ネストした列ではサポートされておらず、また教師あり機械学習ターゲットとして使用することはできません。

次の表で説明されている設定は、モデルのテキスト属性に対する用語抽出プロセスを制御します。モデルの設定を指定する手順については、「モデルの設定の指定」を参照してください。

表3-16 テキスト用のモデルの設定

設定名 データ型 設定値 説明

ODMS_TEXT_POLICY_NAME

VARCHAR2(4000)

CTX_DDL.CREATE_POLICYで作成されたOracle Textのポリシー・オブジェクトの名前。

非構造化テキストからの個々のトークンの抽出方法に影響を与える。

ODMS_TEXT_MAX_FEATURES

INTEGER

1 <= <= 100000

CREATE_MODELに渡される(各テキスト列のすべてのドキュメントの)ドキュメント・セットから使用する特徴の最大数。

デフォルトは3000です。

モデルには1つ以上のテキスト属性を含めることができます。テキスト属性を持つモデルには、質的属性と量的属性を含めることもできます。

テキスト属性を含むモデルを作成するには:

  1. Oracle Textのポリシー・オブジェクトを作成します。

  2. 表3-16で説明されているモデルの構成設定を指定します。

  3. テキストとして処理する必要がある列を指定し、必要に応じて、個々の属性に対してテキスト変換指示を提供します。

  4. モデルの設定とテキスト変換指示を、DBMS_DATA_MINING.CREATE_MODEL2またはDBMS_DATA_MINING.CREATE_MODELに渡します。

    ノート:

    O-Clusterを除くすべてのアルゴリズムでは、非構造化テキストの列をサポートできます。

    相関ルール(Apriori)では非構造化テキストを使用しないことをお薦めします。

次の例では、SVMモデルを使用して、アフィニティ・カードのロイヤルティ・プログラムに好反応を示す可能性が最も高い顧客を予測します。データには、ユーザーが生成したコメントを含むテキスト列が含まれています。Oracle Textポリシーを作成し、モデル設定を指定することで、アルゴリズムは自動的にテキスト列を使用し、構造化データと非構造化テキストの両方でモデルを構築します。

この例では、SH.SALES表から作成された、mining_dataというビューを使用します。mining_train_textというトレーニング・データ・セットも作成されます。

次の問合せは、Oracle Textポリシーを作成し、CREATE_MODEL2プロシージャを使用してモデルを構築する方法を示します。

%script

BEGIN

EXECUTE ctx_ddl.create_policy('dmdemo_svm_policy');

出力は次のとおりです:


PL/SQL procedure successfully completed.

---------------------------

PL/SQL procedure successfully completed.
%script

BEGIN DBMS_DATA_MINING.DROP_MODEL('T_SVM_Clas_sample');
EXCEPTION WHEN OTHERS THEN NULL; END;
/
DECLARE
    v_setlst DBMS_DATA_MINING.SETTING_LIST;
    xformlist dbms_data_mining_transform.TRANSFORM_LIST;

BEGIN
   
    v_setlst(dbms_data_mining.algo_name) := dbms_data_mining.algo_support_vector_machines;
    v_setlst(dbms_data_mining.prep_auto) :=  dbms_data_mining.prep_auto_on;
    v_setlst(dbms_data_mining.svms_kernel_function) := dbms_data_mining.svms_linear;
    v_setlst(dbms_data_mining.svms_complexity_factor) := '100';
    v_setlst(dbms_data_mining.odms_text_policy_name) := 'DMDEMO_SVM_POLICY';
  
    v_setlst(dbms_data_mining.svms_solver) :=  dbms_data_mining.svms_solver_sgd;
    dbms_data_mining_transform.SET_TRANSFORM(
        xformlist, 'comments', null, 'comments', null, 'TEXT');
    DBMS_DATA_MINING.CREATE_MODEL2(
        model_name          => 'T_SVM_Clas_sample',
        mining_function     => dbms_data_mining.classification,
        data_query          => 'select * from mining_train_text',
        set_list            => v_setlst,
        case_id_column_name => 'cust_id',
        target_column_name  => 'affinity_card',
        xform_list => xformlist);
END;
/ 

出力は次のとおりです:



PL/SQL procedure successfully completed.

---------------------------

PL/SQL procedure successfully completed.

---------------------------

テキスト・ポリシーの作成

Oracle Textのポリシーは、テキスト内容をどのように解釈する必要があるのかを指定します。モデル、属性、またはモデルと個々の属性の両方を制御するテキスト・ポリシーを提供できます。

モデル固有のポリシーが存在し、1つ以上の属性が独自のポリシーを持つ場合、Oracle Machine Learning for SQLでは、指定された属性に対しては属性のポリシーを使用し、その他の属性に対してはモデル固有のポリシーを使用します。

テキスト・ポリシーの作成は、CTX_DDL.CREATE_POLICYプロシージャで行います。

CTX_DDL.CREATE_POLICY(
          policy_name    IN VARCHAR2,
          				filter         IN VARCHAR2 DEFAULT NULL,
          				section_group  IN VARCHAR2 DEFAULT NULL,
          				lexer          IN VARCHAR2 DEFAULT NULL,
          				stoplist       IN VARCHAR2 DEFAULT NULL,
          				wordlist       IN VARCHAR2 DEFAULT NULL);

CTX_DDL.CREATE_POLICYのパラメータについては、次の表で説明します。

表3-17 CTX_DDL.CREATE_POLICYプロシージャのパラメータ

パラメータ名 説明

policy_name

新しいポリシー・オブジェクトの名前。Oracle Textのポリシーとテキスト索引は、同じネームスペースを共有します。

filter

索引付けのためにドキュメントをプレーン・テキストに変換する方法を指定します。例としては、文字セット用のCHARSET_FILTERや、プレーン・テキスト、HTMLおよびXML用のNULL_FILTERがあります。

filter値については、『Oracle Textリファレンス』フィルタ型に関する説明を参照してください。

section_group

ドキュメント内のセクションを特定します。たとえば、HTML_SECTION_GROUPはHTMLドキュメント内のセクションを定義します。

section_group値については、『Oracle Textリファレンス』セクション・グループ型に関する説明を参照してください。

ノート: CONTEXT索引でサポートされている任意のセクション・グループを指定できます。

lexer

索引付けされている言語を特定します。たとえば、BASIC_LEXERは、空白で区切られた単語を使用する言語(英語やほとんどの西ヨーロッパ言語など)のテキストから用語を抽出するためのレクサーです。

lexer値については、『Oracle Textリファレンス』レクサー型に関する説明を参照してください。

stoplist

用語抽出から除外する単語とテーマを指定します。たとえば、英語言語のドキュメントの場合、通常、単語の「the」はストップリストに含まれます。

デフォルトではシステム提供のストップリストが使用されます。

『Oracle Textリファレンス』ストップリストに関する説明を参照してください。

wordlist

ステミング問合せおよびファジー問合せの拡張方法を指定します。ステムは、異なる文法形式で単一表現を持つことができるように単語の原形を定義します。ファジー問合せには、単語の表現における一般的なスペルミスが含まれます。

『Oracle Textリファレンス』"BASIC_WORDLISTに関する説明を参照してください。

関連トピック

テキスト属性の構成

列のデータ型を明示的に識別することにより、テキスト属性または非構造化テキストの変換指示を提供します。

表3-15に示したとおり、CHAR、短いVARCHAR2 (<=4000)、BFILEおよびBLOBの列は、テキスト属性として特定できます。CHARおよび短いVARCHAR2の列が明示的に非構造化テキストとして特定されていない場合、CREATE_MODELは、これらの列を質的属性として処理します。BFILEおよびBLOBの列が明示的に非構造化テキストとして特定されていない場合、CREATE_MODELはエラーを戻します。

列をテキスト属性として特定するには、属性指定でキーワードTEXTを提供します。属性指定とは、変換レコード(transform_rec)のフィールド(attribute_spec)です。変換レコードは、CREATE_MODELまたはCREATE_MODEL2に渡すことのできる変換リスト(xform_list)の構成要素です。

ノート:

属性指定には、テキストに関係のない情報も含めることができます。属性指定を作成する手順については、「モデルへの変換の組込み」を参照してください。

次の表に記載されているサブセットで、属性指定のTEXTキーワードを修飾することで、任意のテキスト属性の変換指示を指定できます。

表3-18 属性固有のテキスト変換指示

サブ設定名 説明

BIGRAM

トークンの文字列(通常は文字、音節または単語)からの2つの隣接する要素の並び。

ここで、NORMALトークンはバイグラムと混在しています

(TOKEN_TYPE:BIGRAM)

POLICY_NAME

CTX_DDL.CREATE_POLICYで作成されたOracle Textのポリシー・オブジェクトの名前。

(POLICY_NAME:my_policy)

STEM_BIGRAM

ここで、STEMトークンが最初に抽出され、ステム・バイグラムが形成されます。

(TOKEN_TYPE:STEM_BIGRAM)

SYNONYM

Oracle Machine Learning for SQLはシノニムをサポートしています。次のパラメータは、オプションです。

<thesaurus> ここで<thesaurus>は、シノニムを定義するシソーラスの名前です。このパラメータの指定なしにSYNONYMを使用すると、デフォルトのシソーラスが使用されます。

(TOKEN_TYPE:SYNONYM)

(TOKEN_TYPE:SYNONYM[NAMES])

TOKEN_TYPE

サポートされている値は次のとおりです。

  • NORMAL (デフォルト)
  • STEM
  • THEME

「属性指定のトークン・タイプ」を参照。

(TOKEN_TYPE:THEME)

MAX_FEATURES

属性から使用する特徴の最大数。

(MAX_FEATURES:3000)

ノート:

CLOBおよび長いVARCHAR2 (4000より長い場合)に対しては、変換指示を指定する場合のみ、TEXTキーワードが必要となります。CHAR、短いVARCHAR2BFILEおよびBLOBに対しては、変換指示を指定するかどうかにかかわらず、TEXTキーワードが常に必要となります。

ヒント:

『Oracle Databaseリファレンス』に示すように、データ・ディクショナリ・ビューALL_MINING_MODEL_ATTRIBUTESで属性指定を表示できます。

属性指定のトークン・タイプ

トークン・タイプとしてステムまたはテーマを指定する場合は、テキスト・ポリシーのレクサー・プリファレンスでこれらのタイプのトークンがサポートされている必要があります。

次の例では、BASIC_LEXERにテーマと英語のステムを追加します。

BEGIN
  CTX_DDL.CREATE_PREFERENCE('my_lexer', 'BASIC_LEXER');
  CTX_DDL.SET_ATTRIBUTE('my_lexer', 'index_stems', 'ENGLISH');
  CTX_DDL.SET_ATTRIBUTE('my_lexer', 'index_themes', 'YES');
END;

例3-23 テキスト用の属性指定の例

次の式では、属性に対するテキスト変換でmy_policyという名前のテキスト・ポリシーを使用する必要があることを指定します。トークン・タイプはTHEMEであり、特徴の最大数は3000です。

"TEXT(POLICY_NAME:my_policy)(TOKEN_TYPE:THEME)(MAX_FEATURES:3000)"