OML機能抽出アルゴリズムを使用したリレーショナル表のベクトル化

この例では、OMLの特徴抽出アルゴリズムをVECTOR_EMBEDDING()演算子とともに使用して、一連のリレーショナル・データのベクトル化、類似度索引の作成、および結果のベクトルに対する類似検索を実行する方法を示します。

特徴抽出アルゴリズムは、データの最も大きな差異を捕らえている主成分を識別することで、データから最も情報がある特徴/列を抽出するのに役立ち、大規模なデータ・セットの次元数を減らすことを目的としています。この削減により、最も重要な情報を保持しながらデータ・セットが簡素化され、データの相関および冗長性の分析が容易になります。

このチュートリアルでは、機械学習で広く使用されている次元数低減技術である主成分分析(PCA)アルゴリズムを使用しています。

ノート:

この例では、https://archive.ics.uci.edu/dataset/222/bank+marketingにある顧客銀行マーケティング・データを使用しています。

このリレーショナル・データ表には、数値列とカテゴリ列が混在しています。4000件以上のレコードがあります。

SELECT column_name, data_type
FROM user_tab_columns
WHERE table_name = 'BANK'
ORDER BY data_type, column_name;

出力:

COLUMN_NAME          DATA_TYPE
-------------------- --------------------
AGE                  NUMBER
CAMPAIGN             NUMBER
CONS_CONF_IDX        NUMBER
CONS_PRICE_IDX       NUMBER
DURATION             NUMBER
EMP_VAR_RATE         NUMBER
EURIBOR3M            NUMBER
ID                   NUMBER
NR_EMPLOYED          NUMBER
PDAYS                NUMBER
PREVIOUS             NUMBER
CONTACT              VARCHAR2
CREDIT_DEFAULT       VARCHAR2
DAY_OF_WEEK          VARCHAR2
EDUCATION            VARCHAR2
HOUSING              VARCHAR2
JOB                  VARCHAR2
LOAN                 VARCHAR2
MARITAL              VARCHAR2
MONTH                VARCHAR2
POUTCOME             VARCHAR2
Y                    VARCHAR2

類似検索を実行するには、リレーショナル・データをベクトル化する必要があります。そのためには、まずOML特徴抽出アルゴリズムを使用して、データをよりコンパクトな数値空間に投影します。この例では、SVDアルゴリズムを構成して、元のデータ表の主成分分析(PCA)投影を実行します。機能/列の数(この場合は5)は設定表で指定します。入力数によって、次元数低減処理後に保持される主な特徴または列の数が決まります。これらの各列は、データが最も変化する特徴空間の方向を表します。

DBMS_DATA_MININGパッケージを使用してモデルを作成する必要があるため、ベクトル索引および類似検索に関連する他の権限に加えて、CREATE MINING MODEL権限が必要です。CREATE MINING MODEL権限の詳細は、『Oracle Machine Learning for SQLユーザーズ・ガイド』を参照してください。

  1. 設定表を作成し、値を挿入してからモデルを作成します。

    DBMS_DATA_MININGパッケージを使用し、mod_settを設定表として使用してモデルを作成します。

    CREATE TABLE mod_sett(
      setting_name  VARCHAR2(30),
      setting_value VARCHAR2(30)
    );
    
    
    BEGIN
      INSERT INTO mod_sett (setting_name, setting_value) VALUES 
            (dbms_data_mining.algo_name, dbms_data_mining.algo_singular_value_decomp);
      INSERT INTO mod_sett (setting_name, setting_value) VALUES
            (dbms_data_mining.prep_auto, dbms_data_mining.prep_auto_on);
      INSERT INTO mod_sett (setting_name, setting_value) VALUES
            (dbms_data_mining.svds_scoring_mode, dbms_data_mining.svds_scoring_pca);
      INSERT INTO mod_sett (setting_name, setting_value) VALUES
            (dbms_data_mining.feat_num_features, 5);
      commit;
    END;
    /
    
    
    BEGIN
      DBMS_DATA_MINING.CREATE_MODEL(
        model_name          => 'pcamod',
        mining_function     => dbms_data_mining.feature_extraction,
        data_table_name     => 'bank',
        case_id_column_name => 'id',
        settings_table_name => 'mod_sett');  
    END;
    /
  2. VECTOR_EMBEDDING()関数を使用して、SVDの投影結果をベクトルとして出力します。

    ベクトル列の次元はPCAモデルの特徴数と同じで、ベクトルの値は元の行データのPCA投影結果を表します。

    ノート:

    USING *を指定すると、入力行に存在する関連するすべての特徴が使用されます。
    SELECT id, vector_embedding(pcamod USING *) embedding
    FROM bank
    WHERE id=10000;

    出力:

                ID      EMBEDDING
    --------------     --------------------------------------------------
            10000      [-2.3551013972411354E+002,2.8160084506788273E+001,
                         5.2821278275005774E+001,-1.8960922352439308E-002,
                        -2.5441143639048378E+000]
    
    
  3. すべてのデータ・レコードのベクトル出力結果を保持する表を作成します。

    これは、元のリレーショナル・データの最も重要な上位5列のベクトル化を表します。

    CREATE TABLE pca_output AS
    (SELECT id, vector_embedding(pcamod USING *) embedding
     FROM bank);
  4. ベクトル表に基づいてベクトル索引を作成します。

    たとえば、コサイン距離を使用してIVF索引を作成できます:

    CREATE VECTOR INDEX my_ivf_idx ON pca_output(embedding) 
    ORGANIZATION NEIGHBOR PARTITIONS
    DISTANCE COSINE WITH TARGET ACCURACY 95;
  5. my_ivf_idx索引を使用して類似検索を実行します。

    この例では、コサイン距離に基づいてid=10000に最も近い上位3件の結果を検索し、ベクトル表を元の銀行表に結合して、元の表から最も影響のある属性を取得します。この行の最も影響の大きい列を識別するには、FEATURE_DETAILS()関数を使用します。

    SELECT feature_details(pcamod, 5 USING *) features
    FROM bank
    WHERE id=10000;

    出力:

    FEATURES
    -----------------------------------------------------------------------------------------------
    <Details algorithm="Singular Value Decomposition" feature="5">
    <Attribute name="PDAYS" actualValue="999" weight=".041" rank="1"/>
    <Attribute name="EURIBOR3M" actualValue="4.959" weight=".028" rank="2"/>
    <Attribute name="CONTACT" actualValue="telephone" weight=".016" rank="3"/>
    <Attribute name="EMP_VAR_RATE" actualValue="1.4" weight=".014" rank="4"/>
    <Attribute name="DAY_OF_WEEK" actualValue="wed" weight=".002" rank="5"/>
    </Details>

    元のデータ表を結合して、最も影響のある情報を取得します:

    SELECT p.id id, b.PDAYS PDAYS, b.EURIBOR3M EURIBOR3M, b.CONTACT CONTACT, 
        b.EMP_VAR_RATE EMP_VAR_RATE, b.DAY_OF_WEEK DAY_OF_WEEK
    FROM pca_output p, bank b
    WHERE p.id <> 10000 AND p.id=b.id
    ORDER BY VECTOR_DISTANCE(embedding, (select embedding from pca_output where id=10000), COSINE)
    FETCH FIRST 3 ROWS ONLY;

    出力:

            ID      PDAYS  EURIBOR3M   CONTACT EMP_VAR_RATE DAY_OF_WEEK
    ---------- ---------- ---------- --------- ------------ -----------
          9416        999      4.967 telephone          1.4         fri
         13485        999      4.963 telephone          1.4         thu
          9800        999      4.959 telephone          1.4         wed

    前述の問合せの結果は、最も近い3つのレコードが非常に似ていることを示しています。対照的に、次の問合せに示すように、次の特徴はデータ・セット全体に分散しています:

    SELECT avg(PDAYS) avg, stddev(PDAYS) std, min(PDAYS) min, max(PDAYS) max
    FROM bank;

    出力:

           AVG        STD        MIN        MAX
    ---------- ---------- ---------- ----------
    962.475454 186.910907          0        999
    SELECT avg(EURIBOR3M) avg, stddev(EURIBOR3M) std, min(EURIBOR3M) min, max(EURIBOR3M) max
    FROM bank;

    出力:

           AVG       STD        MIN        MAX
    ---------- --------- ---------- ----------
    
    3.62129081 1.7344474       .634      5.045

    このチュートリアルでは、高品質な類似検索を維持しながら、リレーショナル・データを非常に効率的にベクトル化し、大幅な圧縮を実現する方法を示します。

    関連項目:

    特徴抽出アルゴリズムの詳細は、『Oracle Machine Learning for SQL概要』を参照してください