DBMS_PREDICTIVE_ANALYTICS
機械学習を使用すると、大量のデータに埋もれた有効な情報を発見できます。ただし、そうした結果を得るために必要なプログラミング・インタフェースと機械学習の専門知識は、Oracle Machine Learning for SQLの使用によって利益が得られる幅広い利用者が使用するには複雑すぎます。
DBMS_PREDICTIVE_ANALYTICSパッケージは、機械学習のプロセス全体(データの前処理からモデルの作成、新しいデータのスコアリングに至るまで)を自動化して、これらの複雑さに対処しています。このパッケージは、幅広いユーザー(特にビジネス・アナリスト)が機械学習を使用できるようにする便利なツールを提供します。 
               
この章のトピックは、次のとおりです:
DBMS_PREDICTIVE_ANALYTICSの使用方法
この項では、DBMS_PREDICTIVE_ANALYTICSパッケージの使用に関連する項目について説明します。
                     
DBMS_PREDICTIVE_ANALYTICSの概要
DBMS_PREDICTIVE_ANALYTICSにより、機械学習のプロセスの一部が自動化されます。
機械学習では、一般に使用されているプロセス・モデルに従って、次のステップを実行する必要があります。
- 
                              ビジネス上の問題を確認します。 
- 
                              データを確認します。 
- 
                              マイニングに使用するデータを準備します。 
- 
                              準備したデータを使用してモデルを作成します。 
- 
                              モデルを評価します。 
- 
                              モデルをデプロイし、使用して新しいデータのスコアリングを行います。 
DBMS_PREDICTIVE_ANALYTICSは、このプロセスのステップ3から5を自動化します。
                        
予測分析プロシージャは、入力データの分析と準備、および入力データを使用した機械学習モデルの作成とテストを実行して、スコアリングに入力データを使用します。スコアリングの結果はユーザーに戻されます。操作の完了後、モデルおよびサポート・オブジェクトは保持されません。
DBMS_PREDICTIVE_ANALYTICSのセキュリティ・モデル
DBMS_PREDICTIVE_ANALYTICSパッケージは、ユーザーSYSによって所有され、データベース・インストールの一環としてインストールされます。このパッケージの実行権限は、PUBLICに付与されます。このパッケージ内のルーチンは、実行者権限(現行のユーザーの権限)を使用して実行されます。
                     
DBMS_PREDICTIVE_ANALYTICSパッケージは、Oracle Machine Learning for SQLオプションで利用するAPIを公開します。このパッケージのプロシージャを起動するユーザーは、CREATE TABLEおよびCREATE VIEWシステム権限に加え、CREATE MINING MODELシステム権限も必要です。
                        
DBMS_PREDICTIVE_ANALYTICSサブプログラムの要約
この表では、DBMS_PREDICTIVE_ANALYTICSパッケージのサブプログラムをリストし、簡単に説明します。
                  
表6-177 DBMS_PREDICTIVE_ANALYTICSパッケージのサブプログラム
| サブプログラム | 用途 | 
|---|---|
| ターゲット列の分析時に、重要度の順に属性をランク付けします。 | |
| 入力データの値に基づいてターゲット列の値を予測します。 | |
| 同じターゲット値を持つレコードを識別するルールを生成します。 | 
EXPLAINプロシージャ
EXPLAINプロシージャは、ターゲット列の値のバリエーションを説明する場合に重要となる属性を識別します。 
                     
入力データには、ターゲット値が判明しているレコード(NULL以外の値)を含める必要があります。これらのレコードはプロシージャによって使用され、属性の重要度を計算するモデルの調整が行われます。 
                        
ノート:
EXPLAINは、DATEデータ型とTIMESTAMPデータ型、およびOracle Machine Learning for SQLのモデルでサポートされる、数値、文字およびネストしたデータ型をサポートします。
                           
Oracle Machine Learning for SQLのデータ要件については、『Oracle Machine Learning for SQLユーザーズ・ガイド』を参照してください
EXPLAINプロシージャは、属性を説明力の順序で表示する結果表を作成します。結果表については、「使用上のノート」を参照してください。 
                        
構文
DBMS_PREDICTIVE_ANALYTICS.EXPLAIN (
     data_table_name     IN VARCHAR2,
     explain_column_name IN VARCHAR2,
     result_table_name   IN VARCHAR2,
     data_schema_name    IN VARCHAR2 DEFAULT NULL);パラメータ
表6-178 EXPLAINプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | 入力データの表またはビューの名前。 | 
| 
 | 分析する列の名前。 | 
| 
 | 結果を保存する表の名前。 | 
| 
 | 入力データの表またはビューが存在し、結果表が作成されるスキーマの名前。デフォルトは現在のスキーマです。 | 
使用上のノート
EXPLAINプロシージャは、表6-179で説明する列を使用して結果表を作成します。
                        
表6-179 EXPLAINプロシージャの結果表
| 列名 | データ・タイプ | 説明 | 
|---|---|---|
| 
 | 
 | 入力データの列の名前。分析された列を除くすべての列が結果表に示されます。 | 
| 
 | 
 | 分析された列の値を確認する場合の列の有効性を示す値。値が高くなると説明力が大きくなります。値の範囲は0から1です。 個々の列の分析値は、入力データ表の他の列とは無関係です。この値は、各列と分析された列との関連性の高さを示します。この値は、入力データ表のレコード数、および各列の値と分析された列の値との関係によって影響を受けます。 説明力の値が0の場合は、各列の値と解析された列の値との間に有効な相関関係がないことを示します。説明力が1の場合は完全な相関関係があることを示しており、このような列は、 | 
| 
 | 
 | 説明力のランキング。 | 
例
次の例では、販売履歴のSUPPLEMENTARY_DEMOGRAPHICS表でEXPLAIN操作を実行します。
                        
--Perform EXPLAIN operation 
BEGIN 
    DBMS_PREDICTIVE_ANALYTICS.EXPLAIN( 
        data_table_name      => 'supplementary_demographics', 
        explain_column_name  => 'home_theater_package', 
        result_table_name    => 'demographics_explain_result'); 
END; 
/ 
--Display results 
SELECT * FROM demographics_explain_result;
ATTRIBUTE_NAME EXPLANATORY_VALUE RANK ---------------------------------------- ----------------- ---------- Y_BOX_GAMES .524311073 1 YRS_RESIDENCE .495987246 2 HOUSEHOLD_SIZE .146208506 3 AFFINITY_CARD .0598227 4 EDUCATION .018462703 5 OCCUPATION .009721543 6 FLAT_PANEL_MONITOR .00013733 7 PRINTER_SUPPLIES 0 8 OS_DOC_SET_KANJI 0 8 BULK_PACK_DISKETTES 0 8 BOOKKEEPING_APPLICATION 0 8 COMMENTS 0 8 CUST_ID 0 8
この結果から、Y_BOX_GAMES、YRS_RESIDENCEおよびHOUSEHOLD_SIZEが、HOME_THEATER_PACKAGEの最適な予測子であることがわかります。
                        
PREDICTプロシージャ
PREDICTプロシージャは、ターゲット列の値を予測します。 
                     
入力データには、ターゲット値が判明しているレコード(NULL以外の値)を含める必要があります。これらのレコードはプロシージャによって使用され、予測を作成するモデルの調整およびテストが行われます。
                        
ノート:
PREDICTは、DATEデータ型とTIMESTAMPデータ型、およびOracle Machine Learning for SQLのモデルでサポートされる、数値、文字およびネストしたデータ型をサポートします。
                           
Oracle Machine Learning for SQLのデータ要件については、『Oracle Machine Learning for SQLユーザーズ・ガイド』を参照してください
PREDICTプロシージャは、レコードごとの予測されたターゲット値を含む結果表を作成します。結果表については、「使用上のノート」を参照してください。
                        
構文
DBMS_PREDICTIVE_ANALYTICS.PREDICT (
    accuracy                  OUT NUMBER,
    data_table_name           IN VARCHAR2,
    case_id_column_name       IN VARCHAR2,
    target_column_name        IN VARCHAR2,
    result_table_name         IN VARCHAR2,
    data_schema_name          IN VARCHAR2 DEFAULT NULL);パラメータ
表6-180 PREDICTプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | 予測の信頼度を戻す出力パラメータであり、予測値の精度です。質的ターゲットの予測の信頼度は最も一般的なターゲット値で、量的ターゲットの予測の信頼度は平均値になります。 | 
| 
 | 入力データの表またはビューの名前。 | 
| 
 | 入力データの各ケース(レコード)を一意に識別する列の名前。 | 
| 
 | 予測する列の名前。 | 
| 
 | 結果を保存する表の名前。 | 
| 
 | 入力データの表またはビューが存在し、結果表が作成されるスキーマの名前。デフォルトは現在のスキーマです。 | 
使用上のノート
PREDICTプロシージャは、表6-181で説明する列を使用して結果表を作成します。
                        
表6-181 PREDICTプロシージャの結果表
| 列名 | データ・タイプ | 説明 | 
|---|---|---|
| ケースID列の名前 | 
 | 入力データのケースID列の名前。 | 
| 
 | 
 | 特定のケースのターゲット列の予測値。 | 
| 
 | 
 | 分類(質的ターゲット)の場合は、予測の確率です。回帰の問題(量的ターゲット)の場合は、この列に | 
ノート:
ケースID列の名前が、'PREDICTION'または'PROBABILITY'でないことを確認してください。 
                        予測は、入力にターゲット値を含むかどうかにかかわらず、すべてのケースに対して戻されます。
既知のケースの予測値が役立つ場合があります。たとえば、偏差分析を実行して予測値と実績値を比較する場合です。
例
次の例では、PREDICT操作を実行し、最初の10個の予測を表示します。この結果から、各顧客がアフィニティ・カードを持っているかどうかに関する予測の精度が79%であることがわかります。
                        
--Perform PREDICT operation 
DECLARE 
    v_accuracy NUMBER(10,9); 
BEGIN 
    DBMS_PREDICTIVE_ANALYTICS.PREDICT( 
        accuracy             => v_accuracy, 
        data_table_name      => 'supplementary_demographics', 
        case_id_column_name  => 'cust_id', 
        target_column_name   => 'affinity_card', 
        result_table_name    => 'pa_demographics_predict_result'); 
    DBMS_OUTPUT.PUT_LINE('Accuracy = ' || v_accuracy); 
END; 
/
Accuracy = .788696903
--Display results
SELECT * FROM pa_demographics_predict_result WHERE rownum < 10;
 
   CUST_ID PREDICTION PROBABILITY
---------- ---------- -----------
    101501          1  .834069848
    101502          0  .991269965
    101503          0   .99978311
    101504          1  .971643388
    101505          1  .541754127
    101506          0  .803719133
    101507          0  .999999303
    101508          0  .999999987
    101509          0  .999953074
 PROFILEプロシージャ
PROFILEプロシージャは、入力データからのケース(レコード)を記述するルールを生成します。
                     
たとえば、ターゲット列CHURNの値がYesおよびNoである場合、PROFILEは予想される結果を記述するルール・セットを生成します。各プロファイルには、ルール、レコード数およびスコアの分散が含まれています。
                        
入力データには、ターゲット値が判明しているケース(NULL以外の値)を含める必要があります。これらのケースはプロシージャによって使用され、ルールを計算するモデルが構築されます。 
                        
ノート:
PROFILEは、ネストしたタイプまたは日付をサポートしていません。
                           
Oracle Machine Learning for SQLのデータ要件については、『Oracle Machine Learning for SQLユーザーズ・ガイド』を参照してください
PROFILEプロシージャは、ルール(プロファイル)および対応するターゲット値を指定する結果表を作成します。結果表については、「使用上のノート」を参照してください。
                        
構文
DBMS_PREDICTIVE_ANALYTICS.PROFILE (
     data_table_name           IN VARCHAR2,
     target_column_name        IN VARCHAR2,
     result_table_name         IN VARCHAR2,
     data_schema_name          IN VARCHAR2 DEFAULT NULL);パラメータ
表6-182 PROFILEプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | 分析対象のデータが保存される表の名前。 | 
| 
 | ターゲット列の名前。 | 
| 
 | 結果を保存する表の名前。 | 
| 
 | 入力データの表またはビューが存在し、結果表が作成されるスキーマの名前。デフォルトは現在のスキーマです。 | 
使用上のノート
PROFILEプロシージャは、表6-183で説明する列を使用して結果表を作成します。
                        
表6-183 PROFILEプロシージャの結果表
| 列名 | データ・タイプ | 説明 | 
|---|---|---|
| 
 | 
 | このプロファイル(ルール)に対する一意の識別子。 | 
| 
 | 
 | プロファイルによって記述されるレコード数。 | 
| 
 | 
 | プロファイルのルール。「プロファイルのルールのXMLスキーマ」を参照してください。 | 
プロファイルのルールのXMLスキーマ
結果表のDESCRIPTION列には、次のXSDに準拠するXMLが含まれています。
                        
<xs:element name="SimpleRule">
  <xs:complexType>
    <xs:sequence>
      <xs:group ref="PREDICATE"/>
      <xs:element ref="ScoreDistribution" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:string" use="optional"/>
    <xs:attribute name="score" type="xs:string" use="required"/>
    <xs:attribute name="recordCount" type="NUMBER" use="optional"/>
  </xs:complexType>
</xs:element>例
この例では、アフィニティ・カードを使用する可能性がある顧客を記述するルール(ターゲット値は1)、およびアフィニティ・カードを使用する可能性がない顧客を記述するルール・セット(ターゲット値は0)が生成されます。ルールは、educationおよびoccupationの2つの予測子のみに基づいています。
SET serveroutput ON
SET trimspool ON
SET pages 10000
SET long 10000
SET pagesize 10000
SET linesize 150
CREATE VIEW cust_edu_occ_view AS
              SELECT cust_id, education, occupation, affinity_card
              FROM sh.supplementary_demographics;
BEGIN
    DBMS_PREDICTIVE_ANALYTICS.PROFILE(
         DATA_TABLE_NAME    => 'cust_edu_occ_view',
         TARGET_COLUMN_NAME => 'affinity_card',
         RESULT_TABLE_NAME  => 'profile_result');
END;
/
この例では、結果表profile_resultに8個のルールが生成されます。このルールのうち7個はターゲット値0を示し、1つはターゲット値1を示しています。ルールのscore属性はターゲット値を識別します。
                        
次のSELECT文は、結果表のすべてのルールを戻します。
                        
SELECT a.profile_id, a.record_count, a.description.getstringval() FROM profile_result a;
次のSELECT文は、ターゲット値0のルールを戻します。
                        
SELECT * FROM profile_result t WHERE extractvalue(t.description, '/SimpleRule/@score') = 0;
この例で生成された8個のルールは、次のとおりです。
<SimpleRule id="1" score="0" recordCount="443"> 
  <CompoundPredicate booleanOperator="and"> 
    <SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn"> 
      <Array type="string">"Armed-F" "Exec." "Prof." "Protec."
      </Array> 
    </SimpleSetPredicate> 
    <SimpleSetPredicate field="EDUCATION" booleanOperator="isIn"> 
      <Array type="string">"< Bach." "Assoc-V" "HS-grad"
      </Array> 
    </SimpleSetPredicate> 
  </CompoundPredicate> 
  <ScoreDistribution value="0" recordCount="297" /> 
  <ScoreDistribution value="1" recordCount="146" /> 
</SimpleRule>
<SimpleRule id="2" score="0" recordCount="18">
  <CompoundPredicate booleanOperator="and">
    <SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
      <Array type="string">"Armed-F" "Exec." "Prof." "Protec."
      </Array> 
    </SimpleSetPredicate>
    <SimpleSetPredicate field="EDUCATION" booleanOperator="isIn">
      <Array type="string">"10th" "11th" "12th" "1st-4th" "5th-6th" "7th-8th" "9th" "Presch."
      </Array> 
    </SimpleSetPredicate>
  </CompoundPredicate>
  <ScoreDistribution value="0" recordCount="18" /> 
</SimpleRule>
<SimpleRule id="3" score="0" recordCount="458"> 
  <CompoundPredicate booleanOperator="and"> 
    <SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn"> 
      <Array type="string">"Armed-F" "Exec." "Prof." "Protec."
      </Array> 
    </SimpleSetPredicate> 
    <SimpleSetPredicate field="EDUCATION" booleanOperator="isIn"> 
      <Array type="string">"Assoc-A" "Bach."
      </Array> 
    </SimpleSetPredicate> 
  </CompoundPredicate> 
  <ScoreDistribution value="0" recordCount="248" /> 
  <ScoreDistribution value="1" recordCount="210" /> 
</SimpleRule>
<SimpleRule id="4" score="1" recordCount="276"> 
  <CompoundPredicate booleanOperator="and"> 
    <SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn"> 
      <Array type="string">"Armed-F" "Exec." "Prof." "Protec."
      </Array> 
    </SimpleSetPredicate> 
    <SimpleSetPredicate field="EDUCATION" booleanOperator="isIn"> 
      <Array type="string">"Masters" "PhD" "Profsc"
      </Array> 
    </SimpleSetPredicate> 
  </CompoundPredicate> 
  <ScoreDistribution value="1" recordCount="183" /> 
  <ScoreDistribution value="0" recordCount="93" /> 
</SimpleRule>
<SimpleRule id="5" score="0" recordCount="307"> 
  <CompoundPredicate booleanOperator="and"> 
    <SimpleSetPredicate field="EDUCATION" booleanOperator="isIn"> 
      <Array type="string">"Assoc-A" "Bach." "Masters" "PhD" "Profsc"
      </Array> 
    </SimpleSetPredicate> 
    <SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn"> 
      <Array type="string">"Crafts" "Sales" "TechSup" "Transp."
      </Array> 
    </SimpleSetPredicate> 
  </CompoundPredicate> 
  <ScoreDistribution value="0" recordCount="184" /> 
  <ScoreDistribution value="1" recordCount="123" /> 
</SimpleRule>
<SimpleRule id="6" score="0" recordCount="243"> 
  <CompoundPredicate booleanOperator="and"> 
    <SimpleSetPredicate field="EDUCATION" booleanOperator="isIn"> 
      <Array type="string">"Assoc-A" "Bach." "Masters" "PhD" "Profsc"
      </Array> 
    </SimpleSetPredicate> 
    <SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn"> 
      <Array type="string">"?" "Cleric." "Farming" "Handler" "House-s" "Machine" "Other"
      </Array> 
    </SimpleSetPredicate> 
  </CompoundPredicate> 
  <ScoreDistribution value="0" recordCount="197" /> 
  <ScoreDistribution value="1" recordCount="46" /> 
</SimpleRule>
<SimpleRule id="7" score="0" recordCount="2158">
  <CompoundPredicate booleanOperator="and">
    <SimpleSetPredicate field="EDUCATION" booleanOperator="isIn">
      <Array type="string">
        "10th" "11th" "12th" "1st-4th" "5th-6th" "7th-8th" "9th" "< Bach." "Assoc-V" "HS-grad"
        "Presch."
      </Array>
    </SimpleSetPredicate>
    <SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
      <Array type="string">"?" "Cleric." "Crafts" "Farming" "Machine" "Sales" "TechSup" " Transp."
      </Array>
    </SimpleSetPredicate>
  </CompoundPredicate>
  <ScoreDistribution value="0" recordCount="1819"/>
  <ScoreDistribution value="1" recordCount="339"/>
</SimpleRule>
<SimpleRule id="8" score="0" recordCount="597">
  <CompoundPredicate booleanOperator="and">
    <SimpleSetPredicate field="EDUCATION" booleanOperator="isIn">
      <Array type="string">
        "10th" "11th" "12th" "1st-4th"  "5th-6th" "7th-8th" "9th" "< Bach." "Assoc-V" "HS-grad"
        "Presch."
      </Array>
    </SimpleSetPredicate>
    <SimpleSetPredicate field="OCCUPATION" booleanOperator="isIn">
      <Array type="string">"Handler" "House-s" "Other"
      </Array>
    </SimpleSetPredicate>
  </CompoundPredicate>
<ScoreDistribution value="0" recordCount="572"/>
<ScoreDistribution value="1" recordCount="25"/>
</SimpleRule>