変換について

自動データ準備(ADP)および組込み変換を使用したデータの変換方法について理解します。

変換とは、1つ以上の列のデータを変更するSQL式のことです。データを使用してモデルを作成するには、通常、事前にそれらのデータに特定の変換を行う必要があります。多くのOracle Machine Learningのアルゴリズムに特定の変換要件があります。スコアリングされるデータは、トレーニング・データが変換されたのと同じ方法で事前に変換される必要があります。

Oracle Machine Learning for SQLは、アルゴリズムで必要とされる変換を自動的に実装するADPをサポートしています。変換は、モデルに組み込まれ、モデルが適用されるたびに自動的に実行されます。

追加の変換が必要な場合は、それらの変換をSQL式として指定し、モデルの作成時に入力として提供することができます。これらの変換は、ADPを使用する場合と同じようにモデルに組み込まれます。

自動の組込みデータ変換を使用すると、データ準備のほとんどの作業が自動的に処理されます。モデルの作成と複数のデータ・セットのスコアリングを、次の少ないステップで実行できます。

  1. ケース表に含める列を特定します。

  2. ネストした列を作成します(トランザクショナル・データを含める場合)。

  3. ADPで処理されない変換のSQL式を記述します。

  4. モデルを作成し、SQL式を提供し(指定する場合)、テキスト・データを含む列を特定します。

  5. スコアリング・データの一部またはすべての列が、モデルのトレーニングに使用された列と同じ名前と型を持つことを確認します。

参照:

OMLは、アルゴリズム固有の自動データ準備と、その他のモデル構築関連機能を提供します。

関連トピック

モデルへの変換の組込み

独自の変換を指定してモデルに組み込むには、変換リストを作成し、DBMS_DATA_MINING.CREATE_MODEL2またはDBMS_DATA_MINING.CREATE_MODELに渡します。

変換の指示がモデル内に組み込まれ、新しいデータへのモデルの適用時には常にその変換指示が再適用されます。

xform_listを使用して変換を組み込むためのスキーマは、CREATE_MODELプロシージャとともにここに示されています。


DBMS_DATA_MINING.CREATE_MODEL2 (
model_name 		IN VARCHAR2,
mining_function 	  IN VARCHAR2,
data_query 		IN CLOB,
set_list 		  IN SETTING_LIST,
case_id_column_name      IN VARCHAR2 DEFAULT NULL,
target_column_name       IN VARCHAR2 DEFAULT NULL,
xform_list 		IN TRANSFORM_LIST DEFAULT NULL);

DBMS_DATA_MINING.CREATE_MODEL(
                  model_name           IN VARCHAR2,
                  mining_function      IN VARCHAR2,
                  data_table_name      IN VARCHAR2,
                  case_id_column_name  IN VARCHAR2,
                  target_column_name   IN VARCHAR2 DEFAULT NULL,
                  settings_table_name  IN VARCHAR2 DEFAULT NULL,
                  data_schema_name     IN VARCHAR2 DEFAULT NULL,
                  settings_schema_name IN VARCHAR2 DEFAULT NULL,
                  xform_list           IN TRANSFORM_LIST DEFAULT NULL);

次の例は、CREATE_MODELおよびCREATE_MODEL2プロシージャを使用して組込み変換リストを作成する方法を示しています。

DBMS_DATA_MINING.CREATE_MODELプロシージャの例を次に示します:


BEGIN 
DBMS_DATA_MINING.DROP_MODEL('model_sample2'); 
EXCEPTION WHEN OTHERS THEN NULL; 
END;
/
CREATE TABLE sett_table (SETTING_NAME  VARCHAR2(30),
                                    SETTING_VALUE VARCHAR2(4000));
 
BEGIN       
   INSERT INTO sett_table (SETTING_NAME, SETTING_VALUE) VALUES ('KMNS_DISTANCE','KMNS_EUCLIDEAN');
   INSERT INTO sett_table (SETTING_NAME, SETTING_VALUE) VALUES ('PREP_AUTO','ON');
   INSERT INTO sett_table (SETTING_NAME, SETTING_VALUE) VALUES ('KMNS_DETAILS', 'KMNS_DETAILS_ALL');
END;
DECLARE
  xformlist dbms_data_mining_transform.TRANSFORM_LIST;
BEGIN
  dbms_data_mining_transform.SET_TRANSFORM(xformlist, 'N_TRANS_ATM', null, 'TO_CHAR(N_TRANS_ATM)', null);
  dbms_data_mining_transform.SET_TRANSFORM(xformlist, 'BANK_FUNDS', null, 'BANK_FUNDS+BANK_FUNDS+BANK_FUNDS', null);
  dbms_data_mining_transform.SET_TRANSFORM(xformlist, 'AGE', null, 'log(10,AGE+1)', 'power(10, AGE)-1');

 DBMS_DATA_MINING.CREATE_MODEL(
    model_name          => 'model_sample2',
    mining_function     => dbms_data_mining.clustering,
    data_table_name     => 'INSUR_CUST_LTV',
    case_id_column_name => 'customer_id',
    settings_table_name => 'sett_table',
    xform_list          => xformlist);
END;
次の例は、DBMS_DATA_MINING.CREATE_MODEL2プロシージャを使用して組込み変換を作成する方法を示しています:
DECLARE 
  xformlist dbms_data_mining_transform.TRANSFORM_LIST;
  v_setlst DBMS_DATA_MINING.SETTING_LIST;
BEGIN
  dbms_data_mining_transform.SET_TRANSFORM(xformlist, 'N_TRANS_ATM', null, 'TO_CHAR(N_TRANS_ATM)', null);
  dbms_data_mining_transform.SET_TRANSFORM(xformlist, 'BANK_FUNDS', null, 'BANK_FUNDS+BANK_FUNDS+BANK_FUNDS', null);
  dbms_data_mining_transform.SET_TRANSFORM(xformlist, 'AGE', null, 'log(10,AGE+1)', 'power(10, AGE)-1');
  
  v_setlst('ALGO_NAME') := 'ALGO_KMEANS';

 DBMS_DATA_MINING.CREATE_MODEL2(
    model_name          => 'model_sample3',
    mining_function     => 'CLUSTERING',
    data_query          => 'select * from INSUR_CUST_LTV',
    set_list            => v_setlst,
    case_id_column_name => 'customer_id',
    xform_list          => xformlist);
END;

変換リストの作成

変換リストは、SET_TRANSFORMSTACKおよびGET_*メソッドで作成できます。これらのメソッドを次に示します。

変換リストは、変換レコードの集合です。新しい変換レコードを追加すると、変換リストの一番上に追加されます。変換リストを作成する場合は、次の手法のいずれかを使用できます。

  • DBMS_DATA_MINING_TRANSFORMSET_TRANFORMプロシージャ

  • DBMS_DATA_MINING_TRANSFORMSTACKインタフェース

  • DBMS_DATA_MININGGET_MODEL_TRANSFORMATIONSファンクションおよびGET_TRANSFORM_LISTファンクション

SET_TRANSFORM

SET_TRANSFORMプロシージャは、指定されたSQL式を指定された属性に適用します。

SET_TRANSFORMプロシージャは、1つの変換レコードを変換リストに追加します。

DBMS_DATA_MINING_TRANSFORM.SET_TRANSFORM (
          xform_list               IN OUT NOCOPY TRANSFORM_LIST,
          attribute_name           VARCHAR2,
          attribute_subname        VARCHAR2,
          expression               VARCHAR2,
          reverse_expression       VARCHAR2,
          attribute_spec           VARCHAR2 DEFAULT NULL);

SET_TRANSFORMを使用して指定するSQL式は、VARCHAR2に収まる必要があります。より長い式を指定するには、VARCHAR2配列に行を追加することにより式を作成するSET_EXPRESSIONを使用します。たとえば、次の文では、country_idの変換指示を、my_xformsという変換リストに追加します。変換指示は、アルゴリズムの処理が開始される前にcountry_idを10で割ります。逆変換はcountry_idに10を掛けます。

  dbms_data_mining_transform.SET_TRANSFORM (my_xforms,
     'country_id', NULL, 'country_id/10', 'country_id*10');

逆変換はモデルの詳細で適用されます。country_idが教師ありモデルのターゲットである場合、逆変換はスコアリングされるターゲットにも適用されます。

STACKインタフェース

STACKインタフェースは、変換指示の表から変換レコードを作成し、変換リストに追加します。

STACKインタフェースは、属性または属性のグループに適用可能な事前定義された変換のセットを提供します。たとえば、すべての質的属性に対して教師ありビニングを指定することができます。

STACKインタフェースは、指定したタイプの属性のすべてまたは一部を同じ方法で変換する必要があることを指定します。たとえば、STACK_BIN_CATは、質的属性のビニング指示を変換リストに追加します。STACKインタフェースは、次の3つのステップで構成されます。

  1. CREATEプロシージャにより、変換定義表を作成します。たとえば、CREATE_BIN_CATは、質的ビニングの指示を保持する表を作成します。この表には、属性の名前、属性の値および値のビン割当てを格納するための列があります。

  2. INSERTプロシージャにより、1つ以上の属性のビン境界を計算し、定義表を移入します。たとえば、INSERT_BIN_CAT_FREQは、データ・ソースの一部またはすべての質的属性に対して頻度ベースのビニングを実行し、CREATE_BIN_CATにより作成された表を移入します。

  3. STACKプロシージャにより、定義表の情報から変換レコードを作成し、その変換レコードを変換リストに追加します。たとえば、STACK_BIN_CATは、質的ビニングの定義表に格納されている情報に対する変換レコードを作成し、その変換レコードを変換リストに追加します。

GET_MODEL_TRANSFORMATIONSおよびGET_TRANSFORM_LIST

ファンクションを使用して、新しい変換リストを作成します。

これら2つのファンクションは、既存のモデルに組み込まれている変換から新しい変換リストを作成する場合に使用できます。

GET_MODEL_TRANSFORMATIONSファンクションは、組み込まれた変換のリストを戻します。

DBMS_DATA_MINING.GET_MODEL_TRANSFORMATIONS (
      model_name     IN VARCHAR2)
RETURN DM_TRANSFORMS PIPELINED;

GET_MODEL_TRANSFORMATIONSは、dm_transformオブジェクトの表を戻します。各dm_transformは、次のフィールドを持ちます。

attribute_name       VARCHAR2(4000)
attribute_subname    VARCHAR2(4000)
expression           CLOB
reverse_expression   CLOB

変換リストの構成要素は、dm_transformではなく、transform_recです。transform_recのフィールドについては、表3-7で説明しています。GET_MODEL_TRANSFORMATIONSをコールして、dm_transformオブジェクトのリストをtransform_recオブジェクトに変換し、各transform_recを変換リストに追加することができます。

DBMS_DATA_MINING.GET_TRANSFORM_LIST (
      xform_list           OUT NOCOPY TRANSFORM_LIST,
      model_xforms         IN  DM_TRANSFORMS);

変換リストおよび自動データ準備

変換リストおよび自動データ準備(ADP)を指定して、データ変換をカスタマイズできます。

CREATE_MODEL2およびCREATE_MODELに対する変換リスト引数は、ADPを制御するPREP_AUTO設定と相互作用します

  • ADPが有効で、変換リストを指定した場合、ユーザー指定の変換は自動変換とともに適用されてモデルに組み込まれます。指定した変換は、自動変換の前に処理されます。

  • ADPが無効で、変換リストを指定した場合、ユーザー指定の変換が適用されてモデルに組み込まれますが、システム生成の変換は実行されません。

  • ADPが有効で、変換リストを指定しなかった場合、システム生成の変換が適用されてモデルに組み込まれます。

  • ADPが無効で、変換リストも指定しなかった場合、変換はモデルに組み込まれません。モデルの作成、テストおよびスコアリングに使用するデータセットは別個に準備する必要があります。

属性の変換指示の指定

変換リストを定義することにより、属性の変換命令を渡すことができます。

変換リストは、変換レコードの表として定義されます。各レコード(transform_rec)は、属性の変換指示を指定します。

TYPE transform_rec IS RECORD (
    attribute_name      VARCHAR2(30),
    attribute_subname   VARCHAR2(4000),
    expression          EXPRESSION_REC,
    reverse_expression  EXPRESSION_REC,
    attribute_spec      VARCHAR2(4000));

変換レコードのフィールドについては、この表で説明します。

表3-7 属性の変換レコードのフィールド

フィールド 説明

attribute_nameおよびattribute_subname

これらのフィールドは属性を特定します(「モデル属性の名前の詳細」を参照)。

expression

属性を変換するためのSQL式。たとえば、次の式では、age属性をchildとadultという2つのカテゴリに変換します(0から19までが子供で、19を超えると大人)。

CASE WHEN age < 19 THEN 'child' ELSE 'adult'

式および逆変換式は、expression_recオブジェクトに格納されます。詳細は、「式のレコード」を参照してください。

reverse_expression

変換を元に戻すためのSQL式。たとえば、次の式では、age属性の変換を元に戻します。

DECODE(age,'child','(-Inf,19)','[19,Inf)')

attribute_spec

属性の特別な処理を指定します。attribute_specフィールドは、NULLを設定するか、または次の値うちの1つ以上を設定できます。

  • FORCE_IN—GLMで、ftr_selection_enable設定が有効な場合、モデル作成に属性を強制的に含めます(ftr_selection_enableはデフォルトで無効です)。モデルがGLMではない場合は、この値の効果はありません。FORCE_INは、ネストした属性またはテキストに指定できません。

  • NOPREP—ADPが有効な場合、属性の自動変換を阻止します。ADPが有効になっていない場合は、この値による影響はありません。NOPREPは、ネストした属性に対しては指定できますが、ネストした属性の個別のサブ名(行)に対しては指定できません。

  • TEXT—属性に非構造化テキストが含まれていることを示します。ADPはこの設定に対して効果がありません。TEXTには、必要に応じてPOLICY_NAMETOKEN_TYPEおよびMAX_FEATURESのサブ設定が含まれます。

例3-5および例3-6を参照してください。

式のレコード

変換レコードの例を示します。

変換レコードの変換式は、expression_recオブジェクトです。

TYPE expression_rec IS RECORD (
     lstmt       DBMS_SQL.VARCHAR2A,
     lb          BINARY_INTEGER DEFAULT 1,
     ub          BINARY_INTEGER DEFAULT 0);

TYPE varchar2a IS TABLE OF VARCHAR2(32767)
INDEX BY BINARY_INTEGER;

lstmtフィールドには、VARCHAR2A (変換式をVARCHAR2の複数の行に分割できるため、非常に長い変換式を使用可能)が格納されます。expression_recを作成するには、DBMS_DATA_MINING_TRANSFORM.SET_EXPRESSIONを使用します。

属性指定

属性指定を通じて属性に固有の特性を定義する方法を学習します。

変換レコードの属性指定は、この属性に固有の特性を定義します。NULL以外の場合、属性指定にはFORCE_INNOPREPまたはTEXTという値を含めることができます(表3-7を参照)。

例3-5 複数のキーワードを使用した属性指定

複数の属性指定キーワードが適用可能な場合、カンマ区切りリストで指定できます。次の式は、GLMモデルでの属性の指定です。ftr_selection_enable設定が有効な場合、この式によって、属性がモデルに強制的に含まれます。ADPが有効な場合、属性の自動変換は実行されません。

"FORCE_IN,NOPREP"

例3-6 テキスト属性指定

テキスト属性の場合、必要に応じてPOLICY_NAMETOKEN_TYPEおよびMAX_FEATURESのサブ設定を指定できます。サブ設定は、テキスト変換に固有の構成情報を提供します。次の例では、テキスト内容に対する変換指示がmy_policyというテキスト・ポリシーで定義され、トークン・タイプとしてTHEMEが指定されます。抽出した特徴の最大数は3000です。

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

関連トピック

Oracle Machine Learning for SQLの変換ルーチン

変換ルーチンについて学習します。

Oracle Machine Learning for SQLには、DBMS_DATA_MINING_TRANSFORMパッケージの様々な変換手法を実装するルーチンが用意されています。

ビニング・ルーチン

Oracle Machine Learning for SQLのビニングの手法について説明します。

ビニング計画の決定には、多数の要因が関与します。通常、値の数を少なくするとモデルがコンパクトになり、短時間でモデルを作成できるようになりますが、精度が低下する可能性もあります。

ビンの境界を適切に選択すると、モデルの質が大幅に向上する場合があります。たとえば、年齢をビンに分ける適切な手段としては、0から13は子供、13から19は10代、19から24は青年、24から35は社会人、などのように、対象とするグループに分割する方法があります。

次の表に、Oracle Machine Learning for SQLで提供されているビニングの手法を示します:

表3-8 DBMS_DATA_MINING_TRANSFORMのビニング手法

ビニング手法 説明

上位N個の最頻出項目

この手法は、質的属性のビニングに使用できます。ユーザーはビンの数を指定します。発生頻度が最も高い値が最初のビンとしてラベル付けされ、発生頻度が2番目に高い値が2番目のビンとしてラベル付けされる、などとなります。残りの値はすべて追加のビンに含まれます。

教師ありビニング

教師ありビニングは高い知能を備える形式のビニングであり、ビンの境界はデータの重要な特性から導かれる。教師ありビニングでは、単一予測子のデシジョン・ツリーが作成され、ターゲットに関して特徴的なビンの境界が検出される。これは、量的属性または質的属性に使用できる。

等幅ビニング

等幅ビニングは、量的属性に使用できます。最大値から最小値を差し引いて値の範囲を計算し、その値の範囲が等間隔に分割されます。ビンの数は、ユーザーが指定することも、自動的に計算することもできます。等幅ビニングは通常、外れ値の処理とともに使用する必要があります。

分位ビニング

分位ビニングは量的なビニングの手法です。分位の計算には、SQL分析関数のNTILEが使用されます。ビンの境界は、各分位の最小値に基づいて計算されます。左右の境界が等しいビンはビンとして形成されないため、必要な数よりも少ないビン数となる可能性があります。

正規化ルーチン

Oracle Machine Learning for SQLにおける正規化ルーチンについて学習します。

正規化のほとんどの手法では、1つの属性の範囲を別の範囲(通常は0から1または-1から+1)にマップします。

正規化は外れ値に対して非常に敏感です。外れ値の処理をしない場合、値の多くがきわめて小さな範囲にマップされ、情報の多くが失われてしまいます。

表3-9 DBMS_DATA_MINING_TRANSFORMの正規化方法

変換 説明

最小値と最大値による正規化

この手法では、最小値と最大値を使用して属性の正規化が計算される。シフト量には最小値が、スケールには最大値と最小値の差が使用される。

スケールによる正規化

この正規化手法でも、最小値と最大値が使用される。スケール正規化の場合、シフト量が0で、スケールがmax{abs(max), abs(min)}となる。

Zスコアによる正規化

この手法では、平均値と標準偏差を使用して属性の正規化が計算される。シフト量には平均値が、スケールには標準偏差が使用される。

外れ値の処理

外れ値を処理するために行う必要のある操作について理解します。

列内の他の値から大幅に外れている値は、外れ値とみなされます。外れ値が存在すると、データに歪効果が現れ、正規化やビニングなどの変換の有効性が抑制される場合があります。

トリミングやクリッピングなど外れ値の処理手法を行うと、外れ値の影響を最小限に抑えることができます。

外れ値は、機器の異常に起因する不正確な読取りなど、問題のあるデータを表します。ただし、特にビジネス分野などの一部のケースでは、外れ値が完全に有効となることがあります。たとえば、人口調査のデータにおいて、富裕層に属する一部の個人の収入が一般層とは大きく異なる場合があります。この情報はデータの重要な部分であるため、外れ値として処理しないでください。外れ値の処理を決定するには専門知識が必要です。

外れ値の処理のルーチン

外れ値の処理に使用される変換について説明します。

外れ値は極端な値であり、通常は平均値から標準偏差の数倍離れた値のことを指します。外れ値の影響を最小限に抑えるには、データをウィンザライズするかトリミングします。

ウィンザライズでは、属性の両端の値を特定の指定値に設定します。たとえば、ウィンザライズを90%とする場合、値の下位5%は5パーセンタイルの最小値と同じ値に設定され、値の上位5%は95パーセンタイルの最大値に一致する値に設定されます。

トリミングでは、末端値をNULLに設定します。これらの値はアルゴリズムで欠損値として処理されます。

外れ値が及ぼす影響はアルゴリズムによって異なります。通常、外れ値は、等幅ビニングおよびmin-max正規化において歪みを生じさせます。

表3-10 DBMS_DATA_MINING_TRANSFORMの外れ値の処理手法

変換 説明

トリミング

この手法では、非NULL値をソートし、一定の割合に基づいて末端値を計算し、その末端値をNULLに置き換えることによって数値列の外れ値を取り除く。

ウィンザライズ

この手法では、非NULL値をソートし、一定の割合に基づいて末端値を計算し、その末端値を指定値に置き換えることによって数値列の外れ値を取り除く。

逆変換の理解

逆変換では、モデルによって戻される情報は、モデルのトレーニングに使用されたデータの形式に似た形式または同じ形式で表されます。内部変換は、モデルの詳細およびスコアリング結果で元に戻されます。

モデルで使用される属性の一部は、作成データ内の列に対応します。ただし、アルゴリズム、ネストしたデータおよび変換に固有のロジックがあるため、一部の属性は列に対応しません。

たとえば、モデルでは、トレーニング・データ内のネストした列は属性として解釈されません。Oracle Machine Learning for SQLではモデルの作成時に、ネストした列が展開され、各行(属性の名前と値のペア)が1つの属性となります。

サポート・ベクター・マシン(SVM)および一般化線形モデル(GLM)などの一部のアルゴリズムは、量的属性でのみ動作します。SVMの場合、作成データ内の非数値列は2項属性に展開されます(列内の各個別値に対して1つ)。GLMでは、元の列内の最頻値に対して新しい属性は生成されません。これらの2項属性は、ケースの列値がその2項属性に関連付けられた値と等しい場合にのみ、1に設定されます。

係数を生成するアルゴリズムは、結果を解釈する際の課題を示しています。例として、SVMおよびNon-Negative Matrix Factorization (NMF)があります。これらのアルゴリズムは、変換された属性と組み合せて使用される係数を生成します。これらの係数は、元のデータのスケールではなく、変換されたスケール上のデータに関連があります。

こうしたすべての理由から、モデルの詳細にリストされる属性は、モデルのトレーニングに使用されるデータの列とは似ていません。ただし、自動データ準備(ADP)で実行される、またはユーザーが指定した変換リストによるかにかかわらず、組込みの変換が行われる属性は、元の列値とできるだけ近い変換前の状態でモデルの詳細に表示されます。属性は、モデルによって使用される際に変換されますが、モデルの詳細ではユーザーが解釈できる形式で表示されます。