この章では、Oracle Data MiningのJava APIの概要について説明します。このJava APIは、JDM(データ・マイニング用の業界標準であるJava API)に準拠しています。
Java APIは、Oracle Data MiningのPL/SQLおよびSQL言語インタフェースのレイヤーに位置します。このマニュアルで説明するSQLベースの機能もすべて、このJava APIに実装されています。
また、Java APIでは、テキスト変換およびマイニング・タスクの非同期実行など、SQLに実装されていないいくつかの機能がサポートされています。
|
注意: Oracle Data Mining Java APIは、このリリースでは非推奨です。新しいアプリケーションでは、非推奨となった機能を使用しないことをお薦めします。推奨されない機能は、下位互換性を維持する目的のみでサポートされています。 |
|
関連項目: 『Oracle Data Mining Java API Reference』(Javadoc) |
この章には、次の項が含まれます。
Oracle Data Mining Java APIには、Oracle Database 11gリリース2 (11.2)と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つのアプローチを示します。
//Create OraConnectionFactory
javax.datamining.resource.ConnectionFactory connFactory =
oracle.dmt.jdm.resource.OraConnectionFactory();
//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");
この方法は、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();
この方法は、アプリケーションで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);
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の追加メソッドです。様々なオプションのメソッド引数があり、それを使用して引数のリストを絞り込むことができます。
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.testMetricsobjectPattern: NULLminorType_1: MiningFunction.classificationminorType_2: NULLgetObjectNamesメソッドは、指定されたフィルタのタイプに関係なく、次の列で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
通常、単一レコードのスコアリングで使用されるが、他のコンテキストでも使用可能。 |
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の詳細に習熟できるように、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はNaive Bayesアルゴリズム関連クラスのサブパッケージです。OJDMは、拡張についても同じようなパッケージ構造に従います。たとえば、特徴抽出はOJDMによってサポートされる非JDM標準機能です。oracle.dmt.jdm.featureextractionはこの機能のパッケージであり、oracle.dmt.jdm.algorithm.nmfは特徴抽出に使用されるNon-Negative Matrix Factorizationアルゴリズムのパッケージです。
JDM標準には、タスク、モデルの詳細、ルールおよび統計用の共通クラスおよびパッケージを定義するコア・パッケージがいくつかあります。詳細については、JDMのjavadocを参照してください。図7-1のクラス図に、第2章で説明した名前付きマイニング・オブジェクトの継承階層を示します。他のOJDMオブジェクトについては、以降の項のクラス図を参照してください。OracleによるJDM拡張インタフェース/クラスは、灰色で示しています。図7-1のoracle.dmt.jdm.transform.OraTransformationSequenceは、JDM 1.1標準で定義されているマイニング・オブジェクトに対するOracleの拡張機能です。
JDM標準では、データを説明する統計計算のみならず、データのマイニング属性の特徴を記述する物理データ・オブジェクトおよび論理データ・オブジェクトが定義されています。
javax.datamining.dataパッケージには、データ関連クラスがすべて含まれています。図7-2のクラス図は、Oracle Data Mining Java APIでサポートされているデータ・オブジェクトのクラス関係を示しています。
PhysicalDataSetオブジェクトは、マイニング操作に使用されるデータセットの名前と場所を指定するために使用されます。たとえば、DMUSERスキーマ・アカウントでモデル作成の入力データセットMINING_DATA_BUILD_Vを表すには、データURI DMUSER.MINING_DATA_BUILD_Vを使用してPhysicalDataSetオブジェクトを作成します。同じユーザー・アカウントのデータセットにアクセスする場合、スキーマ名の接頭辞はオプションとなります。
図7-2のクラス図では、PhysicalDataSetにPhysicalAttributeオブジェクトがあります。PhysicalAttributeは、入力データセットの列の物理特性を表し、オプションで物理属性には列の役割を指定できます。たとえば、MINING_DATA_BUILD_Vデータセットでは、マイニングに使用される各ケースがCUST_IDによって一意に識別されます。したがって、CUST_ID列の役割はケースIDとして指定されます。
例7-2に、PhysicalDataSetオブジェクトを作成するコード例を示します。PhysicalDataSetオブジェクトが、モデル作成の入力として指定可能な名前JDM_BUILD_PDSで保存されている点に注目してください(「構築設定」を参照)。
図7-2に示したPhysicalDataRecordオブジェクトは、単一レコードのデータセットを指定する際に使用されます。これは単一レコードの適用に使用されます(この章で後述)。SignatureAttributeは、マイニング・モデルのモデル・シグネチャを指定する際に使用されます(この章で後述)。OJDMでは、マイニング属性の種類を暗黙的に示すために属性データ型が使用されます。たとえば、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 ディシジョン・ツリー・アルゴリズムでの分類設定の作成
//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で利用できる様々な種類のタスクと、そのクラス階層を示しています。この図に示されている個々のタスクの詳細は、以降の項で説明します。
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-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
この両方のタスクでは、名前付きオブジェクトjavax.datamining.supervised.classification.ClassificationTestMetricsが作成され、ユーザー・スキーマに表として格納されます。
ClassificationTestMetricsオブジェクトに関連付けられた分類テスト・メトリックのコンポーネント、混同マトリックス、リフト結果およびROCは、ClassificationTestMetricsオブジェクトの名前に接尾辞_CFM、_LFT、_ROCがそれぞれ付いた名前の別個の表に格納されます。これらの表は、ダッシュボード、Oracle BIなどのBIプラットフォーム、ビジネス・オブジェクトなどにテスト結果を表示する目的で使用されます。
回帰モデルのテストの場合も、同様に次のいずれかを使用できます。
javax.datamining.supervised.regression.RegressionTestTask javax.datamining.supervised.regression.RegressionTestMtericsTask
この両方のタスクでは、名前付きオブジェクトjavax.datamining.supervised.regression.RegressionTestMetricsが作成され、このオブジェクトがユーザー・スキーマに表として格納されます。
図7-6のクラス図は、テスト・メトリックのクラス階層を示しています。この図は、図7-4「タスクのクラス図」のテスト・タスクのクラス階層を参照しています。
例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表に、ROCはJDM_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オブジェクトを作成する方法を示します。
11.1のOJDMは、モデル・メタデータを利用した組込み変換をサポートしています。変換がモデル内に組み込まれると、適用に暗黙的に適用されてデータセットがテストされます。たとえば、ユーザーは応答属性値の表現を1/0からYes/Noに再コード化する変換を組み込むことができます。モデルは、モデルを新しいデータに適用するとき、この変換を使用します。
ユーザーはこれらの変換をSQL式として指定したり、第2章で説明しているOJDMの変換を使用して変換シーケンスを作成したりできます。
この項の最初の例では、モデル作成用の入力として指定されたoracle.dmt.jdm.transform.OraExpressionTransformクラスを使用した簡単な式変換について説明します。
2つ目の例では、複雑な変換のシーケンスを作成し、それらの変換を変換シーケンスとして永続化し、モデルに組み込む方法を示します。
ユーザーはOraTransformationFactoryを使用すると、OraTransformationSequence、OraExpressionTransform、OraBinningTransform、OraNormalizationTransformおよび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.OraPredictTask、OraExplainTaskおよび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-9のクラス図は、ビニング変換クラスを示しています。
この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のクラス図は、正規化変換クラスを示しています。
この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のクラス図は、クリッピング変換クラスを示しています。
この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のクラス図は、テキスト変換クラスを示しています。
この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);