この章では、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.testMetrics
objectPattern
: NULLminorType_1
: MiningFunction.classification
minorType_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);