ヘッダーをスキップ
Oracle Data Miningアプリケーション開発者ガイド
11g リリース1(11.1)
E05706-02
  目次へ
目次
索引へ
索引

戻る
戻る
 
次へ
次へ
 

7 データ・マイニングJava API

この章では、Oracle Data MiningのJava APIの概要について説明します。このJava APIは、JDM(データ・マイニング用の業界標準であるJava API)に準拠しています。


注意:

Java APIは、Oracle Data MiningのPL/SQLおよびSQL言語インタフェースのレイヤーに位置します。このマニュアルで説明するSQLベースの機能もすべて、このJava APIに実装されています。

また、Java APIでは、テキスト変換およびマイニング・タスクの非同期実行など、SQLに実装されていないいくつかの機能がサポートされています。



関連項目:

  • 「データ・マイニングJava API」

  • 『Oracle Data Mining Java API Reference』(Javadoc)

  • Oracle Data Mining Java APIの新機能の概要は、『Oracle Data Mining概要』を参照してください。


この章では、次の項目について説明します。

Javaの環境

Oracle Data Mining Java APIを使用するには、Oracle Database 11g リリース1(11.1)およびJ2SE 1.5が必要になります。ただし、下位互換性があるため、Oracle Database 10.2でも使用できます。

Oracle Data Mining Java APIを使用するには、次のライブラリをCLASSPATHに含める必要があります。

$ORACLE_HOME/rdbms/jlib/jdm.jar
$ORACLE_HOME/rdbms/jlib/ojdm_api.jar
$ORACLE_HOME/rdbms/jlib/xdb.jar
$ORACLE_HOME/jdbc/lib/ojdbc5.jar
$ORACLE_HOME//oc4j/j2ee/home/lib/connector.jar
$ORACLE_HOME/jlib/orai18n.jar
$ORACLE_HOME/jlib/orai18n-mapping.jar
$ORACLE_HOME/lib/xmlparserv2.jar

データ・マイニング・エンジンへの接続

データ・マイニング・エンジン(DME)は、一連のデータ・マイニング・サービスをそのJDMクライアントに提供するインフラストラクチャです。Oracle Databaseは、Oracle Data Miningのコア・マイニング・オプションを通じて、JDMにデータベース内データ・マイニング機能を提供しています。したがって、以降はOracle DatabaseのことをDMEと呼ぶことにします。

データベース内のデータ・マイニング機能にアクセスするには、DME Connectionを作成する必要があります。DMEに接続するために、OJDMでは次の様々なオプションをサポートしています。

DME Connectionオブジェクトの詳細は、「DME Connectionの機能」を参照してください。

コネクション・ファクトリ

コネクション・ファクトリは、DME接続の作成に使用されます。JDM標準では、DME Connectionを作成する上でベンダー中立のアプローチをとれるようにするため、JavaインタフェースとしてConnectionFactory(コネクション・ファクトリ)を定義しています。このアプローチでは、アプリケーションのインフラストラクチャで、ConnectionFactoryのインスタンスをJNDIサーバーに登録する必要があります。登録すると、アプリケーションは、JNDIサーバーのConnectionFactoryをルックアップし、このファクトリを使用してConnectionをインスタンス化できます。

OJDMではoracle.dmt.jdm.resource.OraConnectionFactoryクラスが提供されており、このクラスは、インスタンス化してアクセスすることにより接続を作成するか、またはJNDIサーバーに登録して使用できます。次のコードでは、コネクション・ファクトリを作成するためのこれらの2つのアプローチを示します。

OraConnectionFactoryを使用したConnectionFactoryの作成

//Create OraConnectionFactory
javax.datamining.resource.ConnectionFactory connFactory =
                 oracle.dmt.jdm.resource.OraConnectionFactory();

JNDIサーバーからのConnectionFactoryのルックアップ

//Setup the initial context to connect to the JNDI server
Hashtable env = new Hashtable();
env.put( Context.INITIAL_CONTEXT_FACTORY,
"oracle.dmt.jdm.resource.OraConnectionFactory" );
env.put( Context.PROVIDER_URL, "http://myHost:myPort/myService" );
env.put( Context.SECURITY_PRINCIPAL, "user" );
env.put( Context.SECURITY_CREDENTIALS, "password" );
InitialContext jndiContext = new javax.naming.InitialContext( env );
// Perform JNDI lookup to obtain the connection factory
javax.datamining.resource.ConnectionFactory dmeConnFactory =
(ConnectionFactory) jndiContext.lookup("java:comp/env/jdm/MyServer");
//Lookup ConnectionFactory
javax.datamining.resource.ConnectionFactory connFactory =
  (ConnectionFactory) jndiContext.lookup("java:comp/env/jdm/MyServer");

JDBCを使用した接続

この方法は、OJDM外でJDBC接続をアプリケーションにより制御し、指定したOracleDataSourceをOraConnectionFactoryで使用してデータベース接続を作成できるようにする場合に役立ちます。この方法によって、必要に応じてアプリケーションで暗黙的な接続のキャッシング機能を使用できるようになります。デフォルトでは、OJDMでは暗黙的な接続のキャッシングが有効にされていません。接続のキャッシングについては、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。

//Create an OracleDataSource
OracleDataSource ods = new OracleDataSource();
ods.setURL(URL);
ods.setUser(user);
ods.setPassword(password);

//Create a connection factory using the OracleDataSource
javax.datamining.resource.ConnectionFactory connFactory =
  oracle.dmt.jdm.resource.OraConnectionFactory(ods);
//Create DME Connection
javax.datamining.resource.Connection dmeConn =
    connFactory.getConnection();

ConnectionSpecを使用した接続

この方法は、アプリケーションでJDBC接続を事前に作成せず、JDBC接続をOJDMで維持できるようにする場合に役立ちます。この方法では、ユーザーがoracle.dmt.jdm.resource.OraConnectionFactoryクラスのgetConnectionSpec()メソッドを使用して空のConnectionSpecインスタンスを作成し、そのConnectionSpecを使用してDME Connectionを作成する必要があります。次のコードで使用例を示します。

//Create ConnectionSpec
ConnectionSpec connSpec = m_dmeConnFactory.getConnectionSpec();
connSpec.setURI("jdbc:oracle:thin:@host:port:sid");
connSpec.setName("user");
connSpec.setPassword("password");

//Create DME Connection
javax.datamining.resource.Connection m_dmeConn =
m_dmeConnFactory.getConnection(connSpec);

DME Connectionの機能

Oracle Data Mining Java APIでは、DME Connectionは主要なファクトリ・オブジェクトです。Connectionは、getFactoryメソッドを使用してオブジェクト・ファクトリをインスタンス化します。Connectionオブジェクトは、名前付きオブジェクトのルックアップ、永続化およびタスク実行機能を備えています。

オブジェクト・ファクトリの作成

Connection.getFactoryメソッドは、ファクトリ・オブジェクトを作成します。たとえば、PhysicalDataSetオブジェクトのファクトリを作成するには、そのオブジェクトの絶対名をこのメソッドに渡します。getFactoryメソッドは、PhysicalDataSetFactoryのインスタンスを作成します。

javax.datamining.data.PhysicalDataSetFactory pdsFactory =
                dmeConn.getFactory("javax.datamining.data.PhysicalDataSet");

マイニング・オブジェクトのメタデータへのアクセス

Connectionオブジェクトには、マイニング・オブジェクトのメタデータを取得するためのメソッドがあります。

メソッド 説明
getCreationDate 指定された名前付きオブジェクトの作成日を戻す。
getCreationDate(java.lang.String objectName,
                 NamedObject objectType)
     returns java.util.Date
getDescription 指定されたマイニング・オブジェクトの説明を戻す。
getDescription(java.lang.String objectName,
                NamedObject objectType)
     returns java.lang.String
getObjectNames 指定された型のオブジェクトの名前の集合を戻す。
getObjectNames(NamedObject objectType)
     returns java.util.Collection
getObjectNames 11.1に追加されたOracle JDMの拡張メソッド。複数のスキーマまたは1つのスキーマのマイニング・オブジェクトの名前のリストを提供する。フィルタ処理された引数のリストを取得するために、様々なオプションのメソッド引数を指定可能。
getObjectNames(
java.lang.String schemaPattern,
NamedObject objectType,
java.lang.String objectNamePattern,
javax.datamining.Enum minorType_1,
javax.datamining.Enum minorType_2 ):
returns java.sql.ResultSet

例7-1を参照。


例7-1 Oracle JDMの拡張メソッドgetObjectNames

この例では、getObjectNamesメソッドの使用例を示します。

ユーザーSCOTTが計算した分類のテスト・メトリックの名前をリスト表示するには、次のように指定します。


schemaPattern: "SCOTT"
objectType: NamedObject.testMetrics
objectPattern: NULL
minorType_1: MiningFunction.classification
minorType_2: NULL

getObjectNamesメソッドは、指定されたフィルタのタイプに関係なく、次の列でjava.sql.ResultSetオブジェクトを戻します。

列名 データ型 説明
SCHEMA_NAME String スキーマの名前(NULLの場合もある)。
TYPE String マイニング・オブジェクトのタイプ。
NAME String マイニング・オブジェクトの名前。
MINOR_TYPE_1 String マイニング・オブジェクトはマイナー(サブ)タイプを持つ場合がある。たとえば、モデル・オブジェクトはマイナー・タイプとして機能とアルゴリズムを持つことがある。
MINOR_TYPE_2 String マイニング・オブジェクトは複数のマイナー・タイプを持つ場合がある。マイニング・オブジェクトが2つ目のマイナー・タイプを持つ場合、この列が使用される。
CREATION_DATE Timestamp このオブジェクトが作成された日付。
DESCRIPTION String オブジェクトの説明。

マイニング・オブジェクトの永続化と取得

Connectionオブジェクトには、マイニング・オブジェクトを取得したり、マイニング・オブジェクトをDMEに保存したりするためのメソッドがあります。永続オブジェクトは、データベース・オブジェクトとして格納されます。一時オブジェクトは、Connectionオブジェクトによって、メモリーに格納されます。

メソッド 説明
saveObject 接続に関連付けられているメタデータ・リポジトリに名前付きオブジェクトを保存する。
saveObject(java.lang.String name, MiningObject object,
            boolean replace)
retrieveObject 接続に関連付けられているメタデータ・リポジトリから、指定された名前付きオブジェクトのコピーを取得する。
retrieveObject(java.lang.String objectIdentifier)
    returns MiningObject
retrieveObject 接続に関連付けられているメタデータ・リポジトリから、名前付きオブジェクトのコピーを取得する。
retrieveObject(java.lang.String name,
                NamedObject objectType)
     returns MiningObject
retrieveObjects 指定の期間(createAfter〜createBefore)内に作成された特定のタイプのマイニング・オブジェクトの集合を戻す。
(java.util.Date createdAfter, java.util.Date createdBefore,
 NamedObject objectType):
 returns java.util.Collection
retrieveObjects 指定の期間(createAfter〜createBefore)内に作成された指定したタイプのマイニング・オブジェクトの集合を戻す。
retrieveObjects(java.util.Date createdAfter,
java.util.Date createdBefore, NamedObject objectType,
Enum minorType):
returns java.util.Collection

マイニング・タスクの実行

Connectionオブジェクトには、マイニング・タスクを非同期または同期で実行できるexecuteメソッドがあります。DMEでは、データベース・スケジューラを使用してマイニング・タスク(ユーザーのスキーマにスケジューラ・ジョブとして格納)を実行します。次のメソッドはこうしたタスクを実行するために使用します。

タスクの実行 executeメソッドの構文
非同期
execute(java.lang.String taskName)
     returns ExecutionHandle
同期
execute(Task task,java.lang.Long timeout))
     returns ExecutionHandle
通常、単一レコードのスコアリングで使用されるが、他のコンテキストでも使用可能。


関連項目:


DMEの機能とメタデータの取得

Connectionインタフェースには、ConnectionMetaDataおよびsupportsCapability取得メソッドがあります。この機能は、実行時にアプリケーションでDMEに関する情報を取得する場合に役立ちます。次のメソッドは、接続からこうした情報を取得するために使用します。

メソッド 説明
getMetaData アクティブな接続を通じて表される基底のDMEインスタンスについての情報を戻す。ConnectionMetaDataは、JDMの実装とOracle Databaseのバージョン情報を提供。
getMetaData()
      returns ConnectionMetaData
getSupportedFunctions 実装によってサポートされているマイニング機能の配列を戻す。
getSupportedFunctions()
     returns MiningFunction[]
getSupportedAlgorithms 指定したマイニング機能によってサポートされているマイニング・アルゴリズムの配列を戻す。
getSupportedAlgorithms(MiningFunction function)
     returns MiningAlgorithm[]
supportsCapability 指定した組合せのマイニング機能がサポートされている場合にTRUEを戻す。アルゴリズムが指定されていない場合は、指定の機能がサポートされていればTRUEを戻す。
supportsCapability(MiningFunction function,
                    MiningAlgorithm algorithm,
                    MiningTask taskType)
     returns boolean

バージョン情報の取得

ConnectionMetaDataオブジェクトには、JDM標準のバージョン情報とOracleのバージョン情報を取得するためのメソッドがあります。

メソッド 説明
getVersion JDM標準のAPIのバージョンを戻す。JDMの最初のリリースの場合、JDM 1.0。
getVersion()
     returns String
getMajorVersion メジャー・バージョン番号を戻す。JDMの最初のリリースの場合、1が戻される。
getMajorVersion()
     returns int
getMinorVersion マイナー・バージョン番号を戻す。JDMの最初のリリースの場合、0が戻される。
getMinorVersion()
     returns int
getProviderName プロバイダの名前(Oracle Corporationなど)を戻す。
getProviderName()
     returns String
getProviderVersion Oracle Data Mining Java APIのjarファイルが含まれていたOracle Databaseのバージョンを戻す。
getProviderVersion()
     returns String
getProviderDMEVersion プロバイダのDMEのバージョンを戻す。
getProviderDMEVersion()
     returns String

API設計の概要

この項では、開発者がAPIについての理解を深めることができるように、OJDMの設計原理について簡単に説明します。JDM標準では、APIのコア設計パターンとしてファクトリ・メソッド・パターンが使用されています。ユーザーは、このファクトリを使用してJDMオブジェクトをインスタンス化できます。これによって、OracleのようなJDMベンダーは、ベンダー中立のAPIを実装できます。OJDMでも、その拡張機能について同じファクトリ・メソッド・パターンに準拠しています。javax.dataminingはJDM標準によって定義されているクラスの基本パッケージであり、oracle.dmt.jdmはJDM標準に対するOracleによる拡張機能の基本パッケージです。

JDM標準では、パッケージをマイニング機能とマイニング・アルゴリズムによって編成しています。たとえば、javax.datamining.supervisedパッケージには、監視あり機能に関連するすべてのクラスとサブパッケージのjava.datamining.supervised.classificationおよびjava.datamining.supervised.regressionがあります。各機能のサブパッケージには、その機能に関連するクラスがあります。同様に、javax.datamining.algorithmはすべてのアルゴリズムの基本パッケージであり、各アルゴリズムには、このパッケージ下にサブパッケージがあります。たとえば、javax.datamining.algorithm.naivebayesは、Naïve Bayesアルゴリズム関連クラスのサブパッケージです。OJDMでは、その拡張機能について同様のパッケージ構造を持ちます。たとえば、特徴抽出はOJDMでサポートされている非JDM標準の機能ですが、OJDMでは、oracle.dmt.jdm.featureextractionがこの機能のパッケージであり、oracle.dmt.jdm.algorithm.nmfが特徴抽出に使用されるNon-Negative Matrix Factorizationアルゴリズムのパッケージです。

JDM標準には、タスク、モデルの詳細、ルールおよび統計用の共通クラスおよびパッケージを定義するコア・パッケージがいくつかあります。詳細については、JDMのjavadocを参照してください。図7-1のクラス図に、第2章で説明した名前付きマイニング・オブジェクトの継承階層を示します。他のOJDMオブジェクトについては、以降の項のクラス図を参照してください。OracleによるJDM拡張インタフェース/クラスは、灰色で示しています。図7-1oracle.dmt.jdm.transform.OraTransformationSequenceは、JDM 1.1標準で定義されているマイニング・オブジェクトに対するOracleの拡張機能です。

図7-1 JDM名前付きオブジェクトのクラス図

名前付きオブジェクトのクラス図
「図7-1 JDM名前付きオブジェクトのクラス図」の説明

マイニング・データの記述

JDM標準では、データを説明する統計計算のみならず、データのマイニング属性の特徴を記述する物理データ・オブジェクトおよび論理データ・オブジェクトが定義されています。

javax.datamining.dataパッケージには、データ関連クラスがすべて含まれています。図7-2のクラス図は、Oracle Data Mining Java APIでサポートされているデータ・オブジェクトのクラス関係を示しています。

図7-2 Oracle Data Mining Java APIのデータ・オブジェクト

データ・オブジェクトのクラス図
「図7-2 Oracle Data Mining Java APIのデータ・オブジェクト」の説明

PhysicalDataSetオブジェクトは、マイニング操作に使用されるデータセットの名前と場所を指定するために使用されます。たとえば、DMUSERスキーマ・アカウントでモデル作成の入力データセットMINING_DATA_BUILD_Vを表すには、データURI DMUSER.MINING_DATA_BUILD_Vを使用してPhysicalDataSetオブジェクトを作成します。同じユーザー・アカウントのデータセットにアクセスする場合、スキーマ名の接頭辞はオプションとなります。

図7-2のクラス図で、PhysicalDataSetPhysicalAttributeオブジェクトを持つことができる点に注目してください。PhysicalAttributeは、入力データセットの列の物理的特性を表します。物理的な属性ではオプションで列の役割を指定できます。たとえば、MINING_DATA_BUILD_VデータセットのCUST_IDはマイニングに使用される各ケースを一意に識別します。したがって、CUST_ID列の役割は、ケースIDとして指定されます。

例7-2に、PhysicalDataSetオブジェクトを作成するコード例を示します。PhysicalDataSetオブジェクトが、モデル作成の入力として指定可能な名前JDM_BUILD_PDSで保存されている点に注目してください(「構築設定」を参照)。

図7-2に示すPhysicalDataRecordオブジェクトは、データセットの単一レコードを指定するために使用されます。このオブジェクトは、この章の後半部分で説明する単一レコードの適用に使用されます。SignatureAttributeは、この章の後半部分で説明するマイニング・モデルのモデルのシグネチャを指定するために使用されます。OJDMのAttributeDataTypeは、マイニング属性のデータ型を暗黙的に指定するために使用されます。たとえば、VARCHAR2列はすべて質的として処理され、NUMBER列はすべて量的として処理されます。したがって、OJDMで論理データの詳細を指定する必要はありません。ただし、列の属性の名前を変更するには、次の項で説明する組込み変換を指定する必要があります。

例7-2 物理データセットの作成

//Create PhysicalDataSetFactory
PhysicalDataSetFactory pdsFactory =
(PhysicalDataSetFactory)m_dmeConn.getFactory("javax.datamining.data.PhysicalDataSet");
//Create a PhysicalDataSet object
PhysicalDataSet buildData = pdsFactory.create("DMUSER.MINING_DATA_BUILD_V", false);
//Create PhysicalAttributeFactory
PhysicalAttributeFactory paFactory =
(PhysicalAttributeFactory)m_dmeConn.getFactory("javax.datamining.data.PhysicalAttribute");
//Create PhysicalAttribute object
PhysicalAttribute pAttr = paFactory.create(
"cust_id", AttributeDataType.integerType, PhysicalAttributeRole.caseId );
//Add the attribute to the PhysicalDataSet object
buildData.addAtribute(pAttr);
//Save the physical data set object
dmeConn.saveObject("JDM_BUILD_PDS", buildData, true);

構築設定

Oracle Data Mining Java APIでは、BuildSettingsオブジェクトがデータベースに表として保存されます。この設定表は、DBMS_DATA_MINING.CREATE_MODELプロシージャと互換性があります。設定表の名前は、ユーザー・スキーマ内で一意である必要があります。図7-3に、構築設定のクラス階層を示します。

図7-3 構築設定クラス図

構築設定クラス図
「図7-3 構築設定クラス図」の説明

例7-3のコード例では、ツリー・アルゴリズムでの分類設定オブジェクトの作成および格納方法を示します。

例7-3 ディシジョン・ツリー・アルゴリズムでの分類設定の作成

//Create a classification settings factory
ClassificationSettingsFactory clasFactory =
(ClassificationSettingsFactory)dmeConn.getFactory
     ("javax.datamining.supervised.classification.ClassificationSettings");
//Create a ClassificationSettings object
ClassificationSettings clas = clasFactory.create();
//Set target attribute name
clas.setTargetAttributeName("AFFINITY_CARD");
//Create a TreeSettingsFactory
TreeSettingsFactory treeFactory =
(TreeSettingsFactory)dmeConn.getFactory
     ("javax.datamining.algorithm.tree.TreeSettings");
//Create TreeSettings instance
TreeSettings treeAlgo = treeFactory.create();
treeAlgo.setBuildHomogeneityMetric(TreeHomogeneityMetric.entropy);
treeAlgo.setMaxDepth(10);
treeAlgo.setMinNodeSize( 10, SizeUnit.count );
//Set algorithm settings in the classification settings
clas.setAlgorithmSettings(treeAlgo);
//Save the build settings object in the database
dmeConn.saveObject("JDM_TREE_CLAS", clas, true);

自動データ準備の有効化

11.1では、すべてのマイニング・アルゴリズムで自動データ準備(ADP)がサポートされています。デフォルトでは、ADPはディシジョン・ツリー・アルゴリズムおよびGLMアルゴリズムで有効化されています。その他のアルゴリズムでは、下位互換性を保つため、デフォルトは無効となっています。ADPがデフォルトで有効になっていないアルゴリズムでADPを明示的に有効にするには、useAutomatedDataPreparationsブール値フラグをTRUEに指定して次の関数を起動します。

OraBuildSettings.useAutomatedDataPreparations
          (boolean useAutomatedDataPreparations)

自動データ準備の詳細は、『Oracle Data Mining概要』を参照してください。

マイニング・タスクの実行

OJDMでは、DBMS_SCHEDULERインフラストラクチャを使用して、データベース内で同期または非同期にマイニング・タスクを実行します。マイニング・タスクは、DBMS_SCHEDULERジョブとしてユーザー・スキーマに保存され、DISABLED状態に設定されます。ユーザーがDME Connectionのexecuteメソッドをコールすると、ジョブの状態はENABLEDに変わり、スケジューラは、非同期実行のために新しいデータベース・セッションを作成することによってマイニング・タスクの実行を開始します。スケジューラは、同期実行用にも、DME接続で開かれたものと同じデータベース・セッションを使用します。

図7-4のクラス図は、OJDMで利用できる様々な種類のタスクと、そのクラス階層を示しています。この図に示されている個々のタスクの詳細は、以降の項で説明します。

図7-4 タスクのクラス図

様々な種類のタスクのクラス図
「図7-4 タスクのクラス図」の説明

DBMS_SCHEDULERは、追加のスケジューリング機能およびリソース管理機能を提供します。スケジューラのインフラストラクチャを使用すると、Oracle Data Miningタスクの機能を拡張できます。


関連項目:

データベース・スケジューラについては、『Oracle Database管理者ガイド』を参照してください。

マイニング・タスクのワークフローの作成

Oracle Data Mining 11.1のタスク・インフラストラクチャでは、アプリケーションでAPIを通じて依存タスクを指定し、タスクの実行をデータベース・サーバーに配置できます。サーバーはAPIで指定されたタスクの完全なワークフローを実行し、配置された後はクライアントに依存しません。クライアントはこの実行プロセスをOJDM APIを使用して監視できます。たとえば、データ準備が完了した後は通常、モデルが作成され、テストおよび適用されます。テストと適用は、モデルが正常に作成された後で並列的に行うことができます。

タスク・フローを作成するには、メソッドOraTask.addDependency(String parentTaskName)を起動します。例7-4に、マイニング・タスクのワークフローをセットアップするコード例を示します。この例では、最初に変換タスクを実行してから、モデルの作成タスクを実行します。作成タスクが正常に完了したら、適用タスクとテスト・タスクを並列的に実行します。

例7-4 マイニング・タスクのワークフローの作成

//Task objects declarations
private TransformationTask xformTask;
private BuildTask buildTask;
private TestTask testTask;
private DataSetApplyTask applyTask;
//Creation of the tasks and task input objects are skipped for this example
…
//Save the first task in the workflow (the transformations task)
dmeConn.saveObject("transformationTask", xformTask, true);
//Specify dependencies before saving of the tasks
buildTask.addDependency("transformationTask");
dmeConn.saveObject("modelBuildTask", buildTask, true);
testTask.addDependency("modelBuildTask");
dmeConn.saveObject("modelTestTask", testTask, true);
applyTask.addDependency("modelBuildTask");
dmeConn.saveObject("modelApplyTask", applyTask, true);
//Execute the first task in the workflow to initiate the execution of the whole workflow
dmeConn.execute("transformationTask");

マイニング・モデルの作成

javax.datamining.task.BuildTaskクラスは、マイニング・モデルの作成に使用されます。モデルの作成前に、PhysicalDataSetオブジェクトおよびBuildSettingsオブジェクトを保存する必要があります。

例7-5では、「マイニング・データの記述」で説明したPhysicalDataSet、および「構築設定」で説明したBuildSettingsを使用したツリー・モデルの作成方法を示します。

例7-5 モデルの作成

//Create BuildTaskFactory
BuildTaskFactory buildTaskFactory =
     dmeConn.getFactory("javax.datamining.task.BuildTask");
//Create BuildTask object
BuildTask buildTask = buildTaskFactory.create
     ( "JDM_BUILD_PDS","JDM_TREE_CLAS","JDM_TREE_MODEL");
//Save BuildTask object
dmeConn.saveObject("JDM_BUILD_TASK", buildTask, true);
//Execute build task asynchronously in the database
ExecutionHandle execHandle = dmeConn.execute("JDM_BUILD_TASK");
//Wait for completion of the task
ExecutionStatus execStatus = execHandle.waitForCompletion(Integer.MAX_VALUE);

モデルの詳細の調査

BuildTaskを使用してモデルを作成すると、モデル・オブジェクトはデータベースに永続化されます。モデル・オブジェクトを取得するとモデルの詳細を調べることができます。

図7-5のクラス図は、Oracle Data Mining Java APIでサポートされている様々な種類のモデル・オブジェクトおよびモデル詳細オブジェクトを示しています。

図7-5 モデルおよびモデル詳細のクラス図

モデル・オブジェクトおよびモデル詳細のクラス図
「図7-5 モデルおよびモデル詳細のクラス図」の説明

例7-6では、「マイニング・モデルの作成」で作成した分類ツリー・モデルおよびそのTreeModelDetailの取得方法を示します。

例7-6 モデルの詳細の取得

//Retrieve classification model from the DME
ClassificationModel treeModel = (ClassificationModel)dmeConn.retrieveObject
     ( "JDM_TREE_MODEL", NamedObject.model);
//Retrieve tree model detail from the model
TreeModelDetail treeDetail = (TreeModelDetail)treeModel.getModelDetail();
//Get the root node
TreeNode rootNode = treeDetail.getRootNode();
//Get child nodes
TreeNode[] childNodes = rootNode.getChildren();
//Get details of the first child node
int nodeId = childNodes[0].getIdentifier();
long caseCount = childNodes[0].getCaseCount();
Object prediction = childNodes[0].getPrediction();

モデルのテスト

監視ありモデルを作成したら、テスト操作を使用してそのモデルを評価できます。JDM標準では、入力としてマイニング・モデルをとるテスト操作、および実測値列と予測値列を持つ適用出力表をとるテスト操作の2種類が定義されます。

javax.datamining.supervised.TestTaskはモデルベースのテスト・タスクのベース・クラスで、javax.datamining.supervised.TestMetricsTaskは適用出力表ベースのテスト・タスクのベース・クラスです。

テスト操作により、DMEにテスト・メトリック・オブジェクトが作成され永続化されます。分類モデルのテストの場合は、次のいずれかを使用できます。

javax.datamining.supervised.classification.ClassificationTestTask
javax.datamining.supervised.classification.ClassificationTestMetricsTask

この2つのタスクでは、名前付きオブジェクトjavax.datamining.supervised.classification.ClassificationTestMetricsが作成され、ユーザー・スキーマに表として格納されます。

分類テスト・メトリックの構成要素である、ClassificationTestMetricsオブジェクトに関連付けられた混同マトリックス、リフト結果およびROCは別々の表に格納されます。これらの表の名前には、ClassificationTestMetricsオブジェクトの名前の後にそれぞれ_CFM_LFTまたは_ROCが付きます。これらの表は、ダッシュボード、BIプラットフォーム(Oracle BIなど)、Business Objectsなどでテスト結果を表示するために使用されます。

回帰モデルのテストの場合も、同様に次のいずれかを使用できます。

javax.datamining.supervised.regression.RegressionTestTask
javax.datamining.supervised.regression.RegressionTestMtericsTask

この2つのタスクでは、名前付きオブジェクトjavax.datamining.supervised.regression.RegressionTestMetricsが作成され、このオブジェクトがユーザー・スキーマに表として格納されます。

図7-6のクラス図は、テスト・メトリックのクラス階層を示しています。この図は、図7-4「タスクのクラス図」のテスト・タスクのクラス階層を参照しています。

図7-6 テスト・メトリックのクラス階層

テスト・メトリックのクラス階層
「図7-6 テスト・メトリックのクラス階層」の説明

例7-7では、データセットMINING_DATA_TEST_VでのClassificationTestTaskを使用したツリー・モデルJDM_TREE_MODELのテスト方法を示します。

例7-7 モデルのテスト

//Create & save PhysicalDataSpecification
PhysicalDataSet testData = m_pdsFactory.create(
        "MINING_DATA_TEST_V", false );
PhysicalAttribute pa = m_paFactory.create("cust_id",
        AttributeDataType.integerType, PhysicalAttributeRole.caseId );
testData.addAttribute( pa );
m_dmeConn.saveObject( "JDM_TEST_PDS", testData, true );
//Create ClassificationTestTaskFactory
ClassificationTestTaskFactory testTaskFactory =
  (ClassificationTestTaskFactory)dmeConn.getFactory(
     "javax.datamining.supervised.classification.ClassificationTestTask");
//Create, store & execute Test Task
ClassificationTestTask testTask = testTaskFactory.create(
        "JDM_TEST_PDS", "JDM_TREE_MODEL", "JDM_TREE_TESTMETRICS" );
testTask.setNumberOfLiftQuantiles(10);
testTask.setPositiveTargetValue(new Integer(1));
//Save TestTask object
dmeConn.saveObject("JDM_TEST_TASK", testTask, true);
//Execute test task asynchronously in the database
ExecutionHandle execHandle = dmeConn.execute("JDM_TEST_TASK");
//Wait for completion of the task
ExecutionStatus execStatus = execHandle.waitForCompletion(Integer.MAX_VALUE);
//Explore the test metrics after successful completion of the task
if(ExecutionState.success.equals(execStatus.getState())) {
  //Retrieve the test metrics object
  ClassificationTestMetrics testMetrics =
          (ClassificationTestMetrics)dmeConn.getObject("JDM_TREE_TESTMETRICS");
  //Retrieve confusion matrix and accuracy
  Double accuracy = testMetrics.getAccuracy();
  ConfusionMatrix cfm = testMetrics.getConfusionMatrix();
  //Retrieve lift
  Lift lift = testMetrics.getLift();
  //Retrieve ROC
  ReceiverOperatingCharacterics roc = testMetrics.getROC();
}

例7-7では、テスト・メトリック・オブジェクトはJDM_TREE_TESTMETRICSという名前の表として格納されます。混同マトリックスはJDM_TREE_TESTMETRICS_CFM表に、リフトはJDB_TREE_TESTMETRICS_LFT表に、ROCJDM_TREE_TESTMETRICS_ROC表に格納されます。Oracle DiscovererなどのBIツールを使用すると、これらの表を問い合せてレポートを作成できます。

スコアリング・データへのモデルの適用

監視ありモデルはすべて、データに適用して予測を見つけることができます。クラスタリングや特徴抽出など一部の監視なしモデルでは、新しいレコードのクラスタIDや特徴IDを見つけるための適用操作がサポートされています。

JDM標準のAPIでは、スコアリング結果の出力のタイプを指定するApplySettingsオブジェクトが提供されています。javax.datamining.task.apply.ApplySettingsは、すべての適用設定のベース・クラスです。Oracle Data Mining Java APIのApplySettingsは一時オブジェクトです。このオブジェクトは、データベースではなくConnectionコンテキストに格納されます。

図7-7のクラス図は、Oracle Data Mining Java APIで利用できる適用設定のクラス階層を示しています。

Oracle Data Mining Java APIでは、デフォルトの適用設定により固定形式の適用出力表が生成されます。表7-1に、機能別のデフォルトの出力形式を示します。

表7-1 機能別のデフォルトの出力形式

マイニング機能



分類(コストなし)

ケースID

予測

確率


分類(コストあり)

ケースID

予測

確率

コスト

回帰

ケースID

予測



特徴抽出

ケースID

特徴ID



どのタイプの適用設定でも、ソースと適用先の属性のマッピングがサポートされています。たとえば、元の適用表に顧客名列と年齢列があり、これらの列を適用出力表に対応付ける必要がある場合、適用設定でソースと適用先のマッピングを指定します。

Oracle Data Mining Java APIの分類適用設定では、ランク別マッピング、上位予測、カテゴリ別マッピングおよびすべての予測のマッピングがサポートされています。回帰適用設定では、予測値のマッピングがサポートされています。クラスタリング適用設定では、ランク別、クラスタID別、上位クラスタおよびすべてのクラスタのマッピングがサポートされています。特徴抽出適用設定では、ランク別、特徴ID別、上位の特徴およびすべての特徴のマッピングがサポートされています。

例7-8では、データセットMINING_DATA_APPLY_VでのClassificationApplyTaskを使用したツリー・モデルJDM_TREE_MODELの適用方法を示します。

例7-8 モデルの適用

//Create & save PhysicalDataSpecification
PhysicalDataSet applyData = m_pdsFactory.create( "MINING_DATA_APPLY_V", false );
PhysicalAttribute pa = m_paFactory.create("cust_id",
        AttributeDataType.integerType, PhysicalAttributeRole.caseId );
applyData.addAttribute( pa );
m_dmeConn.saveObject( "JDM_APPLY_PDS", applyData, true );
//Create ClassificationApplySettingsFactory
ClassificationApplySettingsFactory applySettingsFactory =
  (ClassificationApplySettingsFactory)dmeConn.getFactory(
     "javax.datamining.supervised.classification. ClassificationApplySettings");
//Create & save ClassificationApplySettings
ClassificationApplySettings clasAS = applySettingsFactory.create();
m_dmeConn.saveObject( "JDM_APPLY_SETTINGS", clasAS, true);
//Create DataSetApplyTaskFactory
DataSetApplyTaskFactory applyTaskFactory =
  (DataSetApplyTaskFactory)dmeConn.getFactory(
     "javax.datamining.task.apply.DataSetApplyTask");
//Create, store & execute apply Task
DataSetApplyTask applyTask = m_dsApplyFactory.create(
        " JDM_APPLY_PDS ", "JDM_TREE_MODEL", " JDM_APPLY_SETTINGS ",
        "JDM_APPLY_OUTPUT_TABLE");
//Save ApplyTask object
dmeConn.saveObject("JDM_APPLY_TASK", applyTask, true);
//Execute test task asynchronously in the database
ExecutionHandle execHandle = dmeConn.execute("JDM_APPLY_TASK");
//Wait for completion of the task
ExecutionStatus execStatus = execHandle.waitForCompletion(Integer.MAX_VALUE);

コスト・マトリックスの使用方法

javax.datamining.supervised.classification.CostMatrixクラスは、不適切なポジティブ予測および不適切なネガティブ予測のコストを表すために使用します。これは分類問題に使用して、不適切な予測に関連するコストを示します。

Oracle Data Mining Java APIでは、すべての分類モデルの適用操作とテスト操作でコスト・マトリックスがサポートされています。ディシジョン・ツリー・アルゴリズムの場合、コスト・マトリックスは作成時に指定できます。コスト・マトリックスの詳細は、『Oracle Data Mining概要』を参照してください。

例7-9では、ターゲットがYES(1)とNO(0)の2つのクラスを持つコスト・マトリックス・オブジェクトを作成する方法を示します。販促に対する肯定的な反応(YES)では$2が発生するとし、販促のコストを$1とします。その場合、肯定的に反応する顧客を分類ミスした場合のコストは$2、反応がない顧客を分類ミスした場合のコストは$1です。

例7-9 コスト・マトリックスの作成

//Create category set factory & cost matrix factory
CategorySetFactory catSetFactory = (CategorySetFactory)m_dmeConn.getFactory(
      "javax.datamining.data.CategorySet" );
CostMatrixFactory costMatrixFactory = (CostMatrixFactory)m_dmeConn.getFactory(
      "javax.datamining.supervised.classification.CostMatrix");
//Create categorySet
CategorySet catSet = m_catSetFactory.create(AttributeDataType.integerType);
//Add category values
catSet.addCategory(new Integer(0), CategoryProperty.valid);
catSet.addCategory(new Integer(1), CategoryProperty.valid);
//create cost matrix
CostMatrix costMatrix = m_costMatrixFactory.create(catSet);
costMatrix.setCellValue(new Integer(0), new Integer(0), 0);
costMatrix.setCellValue (new Integer(1), new Integer(1), 0);
costMatrix.setCellValue (new Integer(0), new Integer(1), 2);
costMatrix.setCellValue (new Integer(1), new Integer(0), 1);
//Save cost matrix in the DME
dmeConn.saveObject("JDM_COST_MATRIX", costMatrix);

事前確率の使用方法

事前確率は、実際のデータとモデルの作成で提供されたデータでターゲット値の分布が異なる場合に、分類問題で使用します。ユーザーはsetPriorProbabilitiesMapを使用して、分類機能の設定に事前確率を指定できます。事前確率の詳細は、『Oracle Data Mining概要』を参照してください。


注意:

事前確率はディシジョン・ツリーではサポートされていません。

例7-10では、ターゲットがYES(1)とNO(0)の2つのクラスを持ち、YESの確率を0.05、NOの確率を0.95とする際に、PriorProbabilitiesオブジェクトを作成する方法を示します。

例7-10 事前確率の作成

//Set target prior probabilities
Map priorMap = new HashMap();
priorMap.put(new Double(0), new Double(0.7));
priorMap.put(new Double(1), new Double(0.3));
buildSettings.setPriorProbabilitiesMap("affinity_card", priorMap);

組込み変換

11.1のOJDMでは、モデルのメタデータでの組込み変換がサポートされています。モデルに変換を組み込むと、これらの変換は適用データセットおよびテスト・データセットに暗黙的に適用されます。たとえば、ユーザーは、応答属性値の表現を1/0からYes/Noに再コードする変換を組み込むことができます。この変換は、モデルを新しいデータに適用する際に使用されます。

ユーザーはこれらの変換をSQL式として指定したり、第2章で説明しているOJDMの変換を使用して変換シーケンスを作成したりできます。

この項の最初の例では、モデル作成用の入力として指定されたoracle.dmt.jdm.transform.OraExpressionTransformクラスを使用した簡単な式変換について説明します。

2つ目の例では、複雑な変換のシーケンスを作成し、それらの変換を変換シーケンスとして永続化し、モデルに組み込む方法を示します。

単一式変換の組込み

ユーザーはOraTransformationFactoryを使用すると、OraTransformationSequenceOraExpressionTransformOraBinningTransformOraNormalizationTransformおよびOraClippingTransformなどの変換オブジェクトを作成できます。

例7-11では、age属性のシンプルな対数変換、affinity_card属性の再コード化、およびモデル作成からの元のage属性の明示的な除外を定義する式変換を作成します。このコードでは、OJDM APIを使用してこうしたシンプルなSQL式変換をモデルに組み込む方法を示しています。

例7-11 シンプルな式変換

//Create OraTransformationFactory
OraTransformationFactory m_xformFactory = (OraTransformationFactory)m_dmeConn.getFactory(
      "oracle.dmt.jdm.transform.OraTransformation" );
//Create OraExpressionTransform from the transformation factory
OraExpressionTransform exprXform = m_xformFactory.createExpressionTransform();
  //1) Specify log transformation of age attribute and create a new attribute call log_age
  //   that can be used for mining
  exprXform.addAttributeExpression("log_age", //Expression output attribute name
                                  "log(10, age) as log_age", //Expression
                                  "power(10, log_age)" //Reverse expression
                                  );
  //2) Recode 1/0 values of the affinity card attribute with the yes/no values and replace
  //   existing attribute with the new recoded attribute
  exprXform.addAttributeExpression("affinity_card", //Expression output attribute name
                                  "CASE WHEN AFFINITY_CARD = 1 THEN 'YES' ELSE 'NO' END ",
                                  null //No explicit reverse expression
                                  );
  //3) Exclude age attribute from mining
  exprXform.addAttributeExpression("age", //Expression output attribute name
                                  null, //Specify expression as null
                                //to exclude attribute from mining
                                  null
                                  );
//Create transformation sequence object using expression transformation
OraTransformationSequence xformSeq = m_xformFactory.createTransformationSequence(
        "MINING_DATA_BUILD_V", //Input table
        exprXform, //Expressions to be defined
        null //Output transformed view is specified as null as we are trying to
             //embed the transformations to the model
      );
//Save transformation sequence object
m_dmeConn.saveObject("simpleExprXForm_jdm", xformSeq, true);
//Create build Task  with transformation sequence
BuildTask buildTask = m_buildFactory.create(
                     "inputPDS", //Build data specification
                     "inputBuildSettings", //Mining function settings name
                     "outputModel" //Mining model name
                     );
//Specify transformation sequence as one of the input to enable embedding
//of the transformations defined in the sequence with the model
//In this example only expression transformations are specified
((OraBuildTask)buildTask).setTransformationSequenceName("simpleExprXForm_jdm");
//Save and execute the build task
...
//After successful model build specified transformations are embedded with the model
//User can retrieve the transformation details that are embedded with the model by calling
//the following function in OraModel
OraExpressionTransform modelExmbeededTransforms =
                     ((OraModel)model). GetModelTransformations();

複雑な変換シーケンスの組込み

前述の例では、ビジネス上のささいな変換のためにシンプルなSQL式変換を組み込む方法を示しました。この項では、OJDMを使用した複雑な変換シーケンスの作成方法と、これらの変換をモデルに組み込む方法について詳細に説明します。

OJDM 10.2では、ビニング、正規化および外れ値の処理(クリッピング)など、代表的なマイニング関連の個々の変換が提供されています。10.2のユーザーは、モデル作成のプロセスとは別にこれらの変換をメンテナンスし、マイニング操作とは別に、作成、適用およびテスト用の各データセットに対して一貫した変換を行う必要があります。これには、エンド・ユーザーのアプリケーションでコードを大幅に追加し、変換関連オブジェクトをメンテナンスする必要があります。

モデル組込み変換機能を使用すると、前の例で説明したように、最初にビジネス上の変換および新しい属性を追加(式変換を使用)し、次にユーザーが指定したクリッピング定義を使用して外れ値を処理し、最後にユーザーが指定した正規化手法を使用してデータを正規化するなど、複雑な変換シーケンスも組み込むことができます。

OJDMの新しいオブジェクトOraTransformationSequenceでは、変換のシーケンスを指定し、これらの変換を属性ごとのSQL式に変換してモデルに組み込む機能がサポートされています。例7-12では、OJDM APIを使用して、前述の例で作成した式変換を外れ値および正規化のデータ・マイニング変換を使用して拡張した変換シーケンスを作成し、この複雑な変換シーケンスをモデルに組み込む方法を示しています。

例7-12 複雑なシーケンスの変換

//Create a list of transformations to be performed on the input mining data
List xformList = new ArrayList();
xfromList.add( exprXform );     //Expression transformation
xformList.add( clippingXform ); //Clipping transformation to treat outliers
xformList.add( normalizeXform );//Normalization transformation
//Create transformation sequence object using list of transformation
OraTransformationSequence xformSeq = m_xformFactory.createTransformationSequence(
        "MINING_DATA_BUILD_V", //Input table
        xformList, //List of transformations
        null //Output transformed view is specified as null as we are trying to
             //embed the transformations to the model
      );
//Save transformation sequence object
m_dmeConn.saveObject("complexXFormSeq_jdm", xformSeq, true);
//Create transformation task with the transformation sequence
OraTransformationTaskFactory m_xformTaskFactory =
       (OraTransformationTaskFactory)m_dmeConn.getFactory(
                   "oracle.dmt.jdm.task.OraTransformationTask");
OraTransformationTask xformTask =  m_xformTaskFactory .create(
                 "complexXFormSeq_jdm",,
                 false //boolean flag useTransformDefinitionTables
                 );
//Save and execute transformation task to populate transformation sequence with the
//SQL expressions necessary before embedding them to the build task
. . . .
//Create build Task with transformation sequence
. . . .
((OraBuildTask)buildTask).setTransformationSequenceName("complexXFormSeq_jdm ");
//Save and execute the build task with the embedded transformations
...

ここに示した2つの例では、シーケンスの変換を含むデータベース・ビューを作成しなくてもいいように、変換シーケンスの出力ビューをNULLに指定している点に注目してください。ただし、ビュー名を指定して変換が含まれるデータベース・ビューを作成し、そのデータベース・ビューをモデル作成の入力として使用して、モデル作成のプロセスとは別に変換をメンテナンスすることもできます。OJDM APIでは、要件に最適な手法をアプリケーションで柔軟に選択できます。

予測分析タスク(予測、説明およびプロファイル)の使用方法

OJDMには、データ・マイニングの初心者でもデータから予測を取得し、属性評価を説明し、プロファイルを検出できるように、oracle.dmt.jdm.task.OraPredictTaskOraExplainTaskおよびOraProfileTaskが用意されています。

OraPredictTaskを使用すると、データの場所とターゲット列を指定するのみで予測が計算されます。このタスクは、入力表のターゲット列および他の列の既知の値から学習し、ターゲット列の未知の値を予測値に置き換えます。このタスクでは、データベース内で行われるすべてのデータ・マイニング・プロセスが不可視になり、予測および予測の精度が生成されます。

OraExplainTaskを使用すると、説明列に対して属性のランキング/評価が生成されます。このタスクでは、データの場所と説明列を指定するだけで、属性のランキング表が生成されます。

OraProfileTaskを使用すると、特定のターゲット属性について、データからプロファイルが検出されます。たとえば、製品の販促に反応する顧客のプロファイルを見つけるには、顧客属性および販促応答属性を持つ顧客データセットをこのプロファイル・タスクに指定します。プロフィル・タスクでは、アプリケーションで表示可能なプロファイルの定義が含まれる表が出力されます。

どちらのタスクでも、必要な場合には自動的にデータ準備が行われます。

例7-13に、予測、説明およびプロファイルの各タスクを実行する方法を示します。

例7-13 予測分析

//Get Predictive Analytics Task Factory object
   OraPredictiveAnalyticsTaskFactory  m_paFactory =
     (OraPredictiveAnalyticsTaskFactory)m_dmeConn.getFactory(
          "oracle.dmt.jdm.task.OraPredictiveAnalyticsTask");
//Predict task
   //Create predict task object
   OraPredictTask predictTask = m_paFactory.createPredictTask (
                     "MINING_DATA_BUILD_V", //Input table
                     "cust_id", //Case id column
                     "affinity_card", //target column
                     "JDM_PREDICTION_RESULTS"); //prediction output table
   //Save predict task object
   dmeConn.saveObject("JDM_PREDICT_TASK", predictTask, true);
   //Execute test task asynchronously in the database
   ExecutionHandle execHandle1 = dmeConn.execute("JDM_PREDICT_TASK");
   //Wait for completion of the task
   ExecutionStatus execStatus1 = execHandle1.waitForCompletion(Integer.MAX_VALUE);
//Explain task
   //Create explain task object
   OraExplainTask explainTask = m_paFactory.createExplainTask (
                     "MINING_DATA_BUILD_V", //Input table
                     "affinity_card", //explain column
                     "JDM_EXPLAIN_RESULTS"); //explain output table
   //Save predict task object
   dmeConn.saveObject("JDM_EXPLAIN_TASK", explainTask, true);
   //Execute test task asynchronously in the database
   ExecutionHandle execHandle2 = dmeConn.execute("JDM_ EXPLAIN_TASK");
   //Wait for completion of the task
   ExecutionStatus execStatus2 = execHandle2.waitForCompletion(Integer.MAX_VALUE);
//Profile task
   //Create profile task
    OraProfileTask profileTask = m_paFactory.createProfileTask(
                         "MINING_DATA_BUILD_V", //Input table
                         "affinity_card", //Target column
                                 "JDM_PROFILE_RESULTS); //Profile output table
   //Save predict task object
   dmeConn.saveObject("JDM_PROFILE_TASK", profileTask, true);
   //Execute test task asynchronously in the database
   ExecutionHandle execHandle3 = dmeConn.execute("JDM_PROFILE_TASK");
   //Wait for completion of the task
   ExecutionStatus execStatus3 = execHandle3.waitForCompletion(Integer.MAX_VALUE);

データの準備

Oracle Data Mining Java APIでは、モデルを作成、適用またはテストする前にデータを準備する必要があります。oracle.dmt.jdm.task.OraTransformationTaskクラスは、データ・マイニングの一般的な変換(ビニング、正規化、クリッピングおよびテキスト変換)をサポートします。変換の詳細は、『Oracle Data Mining概要』を参照してください。

図7-8のクラス図は、OraTransformationTaskとその他のオブジェクトとの関係を示しています。

図7-8 OraTransformationTaskクラス図

変換オブジェクトのクラス図
「図7-8 OraTransformationTaskクラス図」の説明

ビニング/離散化変換の使用方法

ビニングとは、関連する値をグループ化するプロセスです。これにより、属性の個別値の数を減らします。通常、個別値の数が少なくなるとモデルがコンパクトになり、短時間でモデルを作成できるようになりますが、精度が低下する可能性もあります。

図7-9のクラス図は、ビニング変換クラスを示しています。

図7-9 OraBinningTransformationクラス図

ビニング変換クラス図
「図7-9 OraBinningTransformationクラス図」の説明

このOraBinningTransformationにはビニングに必要なすべての設定が含まれています。Oracle Data Mining Java APIでは、質的属性の上位n個のカスタム・ビニング、および量的属性の等幅ビニング、分位ビニング、カスタム・ビニングをサポートしています。ビニング変換の実行後、1つの変換された表と複数のビニング境界表がユーザーのスキーマに作成されます。ビニング境界表の名前は、ユーザーが指定することも、システムで生成することもできます。これにより、適用データおよびテスト・データに対して、作成データのビニング用に生成されたビニング境界表を容易に再利用できます。

次のコード例では、ビューMINING_BUILD_DATA_Vでのビニング操作を示します。

//Create binning transformation instance
OraBinningTransformFactory binXformFactory =
   (OraBinningTransformFactory)dmeConn.getFactory(
      "oracle.dmt.jdm.transform.binning.OraBinningTransform");
OraBinningTransform binTransform = m_binXformFactory.create(
      "MINING_DATA_BUILD_V", // name of the input data set
      "BINNED_DATA_BUILD_V", // name of the transformation result
      true); // result of the transformation is a view
// Specify the number of numeric bins
binTransform.setNumberOfBinsForNumerical(10);
// Specify the number of categoric bins
binTransform.setNumberOfBinsForCategorical(8);
// Specify the list of excluded attributes
String[] excludedList = new String[]{"CUST_ID", "CUST_GENDER"};
binTransform.setExcludeColumnList(excludedList);
// Specify the type of numeric binning: equal-width or quantile
       ( default is quantile )
binTransform.setNumericalBinningType(binningType);
// Specify the type of categorical binning as Top-N: by default it is none
binTransform.setCategoricalBinningType(OraCategoricalBinningType.top_n);
//Create transformation task
OraTransformationTask xformTask = m_xformTaskFactory.create(binTransform);
//Save transformation task object
dmeConn.saveObject("JDM_BINNING_TASK", xformTask, true);
//Execute transformation task asynchronously in the database
ExecutionHandle execHandle = dmeConn.execute("JDM_ BINNING _TASK");
//Wait for completion of the task
ExecutionStatus execStatus = execHandle.waitForCompletion(Integer.MAX_VALUE);

正規化変換の使用方法

正規化とは、すべての属性値が同じ範囲に収まるように個々の属性値を変換することです。通常、値は0.0〜1.0または-1〜+1の範囲に変換されます。正規化によって、属性は、値の及ぶ範囲の違いによって生じる人為的な重み付けの影響を受けなくなります。

図7-10のクラス図は、正規化変換クラスを示しています。

図7-10 OraNormalizeTransformationクラス図

正規化変換に関連するクラス
「図7-10 OraNormalizeTransformationクラス図」の説明

このOraNormalizeTransformationには正規化に必要なすべての設定が含まれています。Oracle Data Mining Java APIでは、z-スコア、min-maxおよび線形スケール正規化をサポートしています。正規化は、SVM、NMFおよびk-Meansの各アルゴリズムで必須です。

次のコード例では、ビューMINING_BUILD_DATA_Vでの正規化を示します。

//Create OraNormalizationFactory
OraNormalizeTransformFactory normalizeXformFactory =
  (OraNormalizeTransformFactory)m_dmeConn.getFactory(
      "oracle.dmt.jdm.transform.normalize.OraNormalizeTransform");
//Create OraNormalization
OraNormalizeTransform normalizeTransform = m_normalizeXformFactory.create(
      "MINING_DATA_BUILD_V", // name of the input data set
      "NORMALIZED_DATA_BUILD_V", // name of the transformation result
      true, // result of the transformation is a view
      OraNormalizeType.z_Score, //Normalize type
      new Integer(6) ); //Rounding number
// Specify the list of excluded attributes
String[] excludedList = new String[]{"CUST_ID", "CUST_GENDER"};
normalizeTransform.setExcludeColumnList(excludedList);
//Create transformation task
OraTransformationTask xformTask = m_xformTaskFactory.create(normalizeTransform);
//Save transformation task object
dmeConn.saveObject("JDM_NORMALIZE_TASK", xformTask, true);
//Execute transformation task asynchronously in the database
ExecutionHandle execHandle = dmeConn.execute("JDM_NORMALIZE_TASK");
//Wait for completion of the task
ExecutionStatus execStatus = execHandle.waitForCompletion(Integer.MAX_VALUE);

クリッピング変換の使用方法

属性値に基づく計算の一部は、極値により大きな影響を受ける場合があります。頑強な計算を行う1つの方法として、クリッピング変換を使用したデータのウィンザライズまたはトリミングがあります。

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

トリミングでは両端の値が取り除かれ、以降の値では取り除かれた値が無視されます。トリミングでは、末端値をNULLに設定します。

図7-11のクラス図は、クリッピング変換クラスを示しています。

図7-11 OraClippingTransformationクラス図

クリッピング変換クラス図
「図7-11 OraClippingTransformationクラス図」の説明

このOraClippingTransformationにはクリッピングに必要なすべての設定が含まれています。Oracle Data Mining Java APIでは、クリッピングの種類としてウィンザライズおよびトリミングをサポートしています。

次のコード例では、ビューMINING_BUILD_DATA_Vでのクリッピングを示します。

//Create OraClippingTransformFactory
OraClippingTransformFactory clipXformFactory =
  (OraClippingTransformFactory)dmeConn.getFactory(
      "oracle.dmt.jdm.transform.clipping.OraClippingTransform");
//Create OraClippingTransform
OraClippingTransform clipTransform = clipXformFactory.create(
      "MINING_DATA_BUILD_V", // name of the input data set
      "WINSORISED_DATA_BUILD_V", // name of the transformation result
      true );// result of the transformation is a view
//Specify the list of excluded attributes
String[] excludedList = new String[]{"CUST_ID", "CUST_GENDER"};
clipTransform.setExcludeColumnList(excludedList);
//Specify the type of clipping
clipTransform.setClippingType(OraClippingType.winsorize);
// Specify the tail fraction as 3% of values on both ends
clipTransform.setTailFraction(0.03);
//Create and save transformation task
OraTransformationTask xformTask = xformTaskFactory.create(clipTransform);
//Save transformation task object
dmeConn.saveObject("JDM_CLIPPING_TASK", xformTask, true);
//Execute transformation task asynchronously in the database
ExecutionHandle execHandle = dmeConn.execute("JDM_CLIPPING_TASK");
//Wait for completion of the task
ExecutionStatus execStatus = execHandle.waitForCompletion(Integer.MAX_VALUE);

テキスト変換の使用方法

テキスト列でのマイニングを行うには、テキスト列をネストした表の構造に変換する必要があります。この変換では、テキスト列がネストした表の列に変換されます。テキスト変換によって、特徴表が作成されます。正確な結果を得るために、適用タスクおよびテスト・タスクには、モデル作成テキスト・データ列の特徴表を使用する必要があります。

図7-12のクラス図は、テキスト変換クラスを示しています。

図7-12 テキスト変換クラス図

テキスト変換クラス図
「図7-12 テキスト変換クラス図」の説明

このOraTextTransformationは、テキスト列およびテキスト列と関連付けられた特徴表を指定するために使用されます。

次のコード例では、表MINING_BUILD_TEXTでのテキスト変換を示します。

//Create OraTextTransformFactory
OraTextTransformFactory textXformFactory = dmeConn.getFactory(
      "oracle.dmt.jdm.transform.text.OraTextTransform");
//Create OraTextTransform
OraTextTransform txtXform = (OraTextTransformImpl)textXformFactory.create(
      "MINING_BUILD_TEXT", // name of the input data set
      "NESTED_TABLE_BUILD_TEXT ", // name of the transformation result
      "CUST_ID", //Case id column
      new String[] { "COMMENTS" } ); //Text column names
      );
//Create transformation task
OraTransformationTask xformTask = m_xformTaskFactory.create(txtXform);
//Save transformation task object
dmeConn.saveObject("JDM_TEXTXFORM_TASK", xformTask, true);
//Execute transformation task asynchronously in the database
ExecutionHandle execHandle = dmeConn.execute("JDM_TEXTXFORM_TASK");
//Wait for completion of the task
ExecutionStatus execStatus = execHandle.waitForCompletion
     (Integer.MAX_VALUE);