使用Oracle數(shù)據(jù)挖掘API方法詳解
Oracle 發(fā)布了 PL/SQL 和 Java 應用編程接口 (API) 后,市場上才會推出可利用這一新發(fā)布的 API 的點擊工具或構(gòu)建器,這一般是***的做法。利用這一實踐,開發(fā)人員可將新功能即刻融入其應用程序中以使其企業(yè)從中獲益。
然而,開發(fā)可利用新發(fā)布 API 的專門工具需要投入大量精力。因此,理想情況下,從 API 發(fā)布直至推出利用該 API 的直觀最終用戶工具,至少需要數(shù)個月,而實際上,這一滯后時間通常為一年或兩年。同時,利用 API 可能需要企業(yè)使用自己的工具,或更為常見的是利用即席解決方案,例如在報表生成器和電子表格中嵌入對 API 的調(diào)用。
一種常用方法是將 API 包裝在數(shù)個腳本中,然后使用自定義按鈕和菜單從電子表格訪問這些腳本。但是,這一方法的主要缺點在于如今的電子表格是將單個單元格中的文本和數(shù)字作為值來進行處理的,因此它通常不是處理新功能的合適工具。
本文將介紹如何快速將分析和其他 API 整合至一個最終用戶可從其中輕松訪問新代碼的電子表格平臺。作為指導性示例,其中還將闡釋了如何將Oracle 數(shù)據(jù)挖掘(PL/SQL) API 重新打包為 Java API,以及如何從電子表格調(diào)用的 J Cells 訪問該 API。J Cells 完全以 Oracle JDeveloper 編寫。它不僅可以將文本和數(shù)字作為單元格的值,而且還可將 Java 對象作為值進行處理,并可從其單元格直接訪問任何 Java API,以即刻進行部署。
電子表格平臺
我使用的是電子表格界面,只是其中允許用戶在單元格中創(chuàng)建任何 Java 對象以及使用基元 Java 類型。每個單元格都可用作另一個單元格的變量,用戶可以選擇在單元格中直接編寫 Java 代碼,或使用其他格式。將電子表格界面和對象(而不僅是常規(guī)電子表格中的數(shù)字和文本)使用相結(jié)合是自動進行的:J Cells 為每個適合單元格的對象計算指示值,這一指示值給予用戶有關(guān)顯示對象的充足線索。此外,還會實施一個完整的值系統(tǒng),可根據(jù)需要(例如,當用戶雙擊給定單元格時)以各種其他格式顯示對象。即使在電子表格中,因為公式可能定義比較復雜,所以系統(tǒng)還需識別要創(chuàng)建的對象是否具有相關(guān)的向?qū)АO驅(qū)ǔJ且粋€特定于某個對象類型的圖形化代碼生成器。稍后本文示例將說明如何在 J Cells 中使用向?qū)А?/P>
圖 1 顯示了本文示例的電子表格界面。
圖 1:J Cells 的電子表格界面
#p#
數(shù)據(jù)挖掘 API
Oracle 支持兩種兼容的 API 以訪問數(shù)據(jù)庫中的數(shù)據(jù)挖掘功能。***種是 PL/SQL API,其中包括 DBMS_DATA_MINING 程序包,另一種也是 Java API,稱為 Oracle 數(shù)據(jù)挖掘 Java API。因為 J Cells 目前最適合訪問 Java API,所以需要以可直接從 Java 對其進行訪問的方式打包 PL/SQL API。兩個主要的 Oracle 數(shù)據(jù)挖掘概念是設(shè)置和模型。設(shè)置概念基本圍繞帶有兩列(setting_name 和 setting_value)的設(shè)置表構(gòu)建;其中 setting_name 是挖掘算法使用的屬性名,而 setting_value 是與該屬性相對應的值。
DBMS_DATA_MINING 程序包包含若干過程,包括 CREATE_MODEL 和 APPLY。CREATE_MODEL 過程根據(jù)設(shè)置表(作為過程的參數(shù)之一提供)中的值為給定挖掘函數(shù)和數(shù)據(jù)集創(chuàng)建挖掘模型。該過程簡單且易于使用。實際上,由用戶來為要創(chuàng)建的模型、要使用的挖掘函數(shù)、包含要使用的數(shù)據(jù)的表、要建模的列以及設(shè)置表提供名稱。這一方法的優(yōu)點在于所有不同算法都可以類似的方法調(diào)用。每種算法的微調(diào)都整合至設(shè)置表中,但在很多情況下,各種設(shè)置系數(shù)可由算法本身自動決定。設(shè)置表中條目的復雜性根據(jù)用戶的專業(yè)技術(shù)背景和算法而有所不同。許多專業(yè)用戶可能希望手動設(shè)置所有可能的系數(shù),而我們中的多數(shù)人更可能樂意系統(tǒng)自動給出適用設(shè)置。Oracle 提供了一個要用作設(shè)置鍵的常量列表,以及命名為常量或數(shù)字間隔的值。
表 1:algo_name(算法名)設(shè)置鍵的值
Oracle 的算法名 (algo_name) 鍵的常量值如上所示。對于其中的每一個值,使用了可能鍵和值的不同集等。以下(圖 2)顯示了向?qū)Ш瘮?shù)是如何將這些鍵映射到樹結(jié)構(gòu),并允許用戶通過操縱該設(shè)置樹定義設(shè)置表的。
作為 Oracle 數(shù)據(jù)庫中創(chuàng)建的挖掘模型,DBMS_DATA_MINING.APPLY 過程用于將該模型應用到新數(shù)據(jù)集。而且,這是一個易于使用的過程,要求只輸入挖掘模型名、包含新數(shù)據(jù)集的表名、用于識別新數(shù)據(jù)集中行的列以及結(jié)果數(shù)據(jù)集名。Java 類 OracleMiningModel (below) 在調(diào)用預測、評分或 apply 方法時,都會利用該 APPLY 過程。此外,DBMS_DATA_MINING 程序包包含若干根據(jù)類型將各個模型詳細信息作為結(jié)果集或以 XML 格式返回的函數(shù)。這些細節(jié)函數(shù)也可通過使用 OracleMiningModel 類的實例(代表數(shù)據(jù)庫中的不同模型)進行訪問。
此處可通過創(chuàng)建一個稱為 OracleModelSettings 的 Java 類以 Java 打包 (PL/SQL) 設(shè)置概念,該類具有靈活的構(gòu)造函數(shù)和各種簽名,包括
public OracleModelSettings ( String modelSettingsName, Connection databaseConnection, String[] keyToValueStringMap) throws SQLException |
keyToValueStringMap 只是表單“ -> ”的字符串數(shù)組。該數(shù)組詳細說明了設(shè)置表的行,以及負責在數(shù)據(jù)庫中維護設(shè)置表的類。
類似地,此處也可通過創(chuàng)建一個稱為 OracleMiningModel 的 Java 類以 Java 打包模型概念,該類具有構(gòu)造函數(shù)和各種簽名,包括
public OracleMiningModel ( String modelName, OracleModelSettings oms, String[] keyToValueStringMap) boolean recreate) throws SQLException |
此處使用 keyToValueMappings 數(shù)組來確定在 Oracle 數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)挖掘模型所需的算法以及其他命名屬性。該類的用途就是創(chuàng)建和維護數(shù)據(jù)挖掘模型。此外,OracleMiningModel 類還定義了用于檢索以及將該模型應用到新數(shù)據(jù)集的方法。這些方法包括以下各項,此處只顯示了一小部分。
public OracleResultSet infoAprioriAssociationRules(int topn) public OracleResultSet infoAprioriFrequentItemsets(int topn) public OracleResultSet infoAdaptiveBayesNetwork() public OracleResultSet infoAIMinimumDescLength() public OracleResultSet infoKMeans() public OracleResultSet infoNaiveBayes() public OracleResultSet infoNonnegativeMatrixFactorization() public OracleResultSet infoOCluster() public OracleResultSet infoSupportVectorMachines() public XMLType infoDecisionTree() public Object getPrediction(String[] signature, double[] doubleVal) public HashMap score(String[] signature, double[] doubleVal) public OracleResultSet apply( String dataTable, String caseID, String resultTable, String schema, boolean overwrite) |
除了具有上述簽名外,所有的方法可能都會引發(fā) SQL 意外。一旦可以從兩個簡單類來管理數(shù)據(jù)挖掘功能后,就可調(diào)用該電子表格平臺來訪問任何可用的數(shù)據(jù)挖掘算法,以在 Oracle 數(shù)據(jù)庫中建模數(shù)據(jù)集。
#p#
數(shù)據(jù)挖掘示例
因此,來看一個在該系統(tǒng)中編寫的小數(shù)據(jù)挖掘模型,該模型可通過訪問 Oracle 數(shù)據(jù)庫創(chuàng)建并運行 ODM (Oracle Data Mining) 回歸模型。該回歸模型的用途是根據(jù)輸入(例如血壓、高度和體重)預測心率。使用 J Cells 可直接訪問 Java API 以實例化對象并在對象上調(diào)用方法。首先,連接至 Oracle 數(shù)據(jù)庫。DataSource 對象可通過將以下公式
() = ~ OracleDataSource("agust","agust","dbVaio","vaioFS");
輸入到電子表格的單元格 b3 中進行實例化。Tilde 符號 (~) 表示縮寫符號,允許 J Cells 將(右側(cè))語句轉(zhuǎn)換為構(gòu)造函數(shù)t“new cell.OracleDataSource( "agust", "agust", "dbVaio", "vaioFS");”,使系統(tǒng)能夠以用戶“agust”的身份訪問服務器“vaioFS”上的數(shù)據(jù)庫“dbVaio”。
現(xiàn)在,可通過在 DataSource 對象上調(diào)用正確的方法(例如在單元格 b4 和 b5 中分別輸入以下公式),獲得數(shù)據(jù)庫連接以及檢查數(shù)據(jù)庫中的源數(shù)據(jù):
(*) = b3.getConnection(); (*) = b3.query("select * from pulse_clinical"); |
***個語句將向單元格 b4 中返回一個 java.sql.Connection 對象,第二個語句將向單元格 b5 中返回一個 java.sql.ResultSet 對象。只需通過雙擊單元格 (b5) 就可檢查結(jié)果集,該操作會將結(jié)果表顯示在表格框架中以便查看。
迄今為止,我只在該電子表格中創(chuàng)建了幾個簡單的數(shù)據(jù)對象。現(xiàn)在,可以調(diào)用數(shù)據(jù)挖掘 API 來定義一個設(shè)置對象,然后創(chuàng)建一個簡單的數(shù)據(jù)挖掘模型。首先,通過在單元格 b6 中輸入以下語句來創(chuàng)建一個設(shè)置對象:
(*) = new cell.odm.OracleModelSettings("xyz_settings", b4, new String[]{ "algo_name -> algo_support_vector_machines", "svms_kernel_function -> svms_linear"} ); |
立刻我發(fā)現(xiàn)該公式中的問題是最終用戶友好的,因此,注冊一個帶有 J Cells 的向?qū)В谔崾居脩艉笞詣由稍摴?,可能是個不錯的辦法。一般,電子表格在用戶創(chuàng)建復雜公式時都會給予幫助,因此用戶可以期望在實例化對象時獲得指導。
部署的向?qū)鐖D 2 所示。
圖 2:典型的向?qū)Ы缑?/SPAN>
同樣,數(shù)據(jù)挖掘模型通過使用向?qū)Щ蜉斎牍絹韯?chuàng)建,在這兩種情況中,結(jié)果模型都是在直接指定 API 調(diào)用的單元格 b7 中進行實例化:
(*)= new cell.odm.OracleMiningModel("xyz_model", b6, new String[]{ "data_table_name -> pulse_clinical", "mining_function -> regression", "target_column_name -> pulse", "case_id_column_name -> subject"}, false ); |
使用該公式結(jié)果實例化數(shù)據(jù)挖掘模型將在 Oracle 數(shù)據(jù)庫中生成標準的 Oracle 數(shù)據(jù)挖掘模型。該模型可通過雙擊單元格 b7 進行查看,模型的完整值如圖 3 所示。
圖 3:查看單元格 b7 中的模型
使用上述的 OracleMiningModel 方法,可將該模型應用到 Oracle 數(shù)據(jù)庫中的數(shù)據(jù)集。作為一個簡單的交互式評分模型(一般適用于電子表格應用程序),用戶可能希望輸入血壓、高度和體重值,讓數(shù)據(jù)庫使用剛才定義的模型預測心率。這個在模型對象上定義的 Java API 方法 getPrediction 非常適合這一用途。在單元格 e4、e5、e6 以及 e7 中(以單元格 b8 中簽名數(shù)組指定的順序)鍵入輸入值后,通過輸入以下公式可進行評分:
(*) = b7.getPrediction(b8,new double[]{e4,e5,e6,e7});
同樣,該公式將直接訪問 Java API 以獲取并在單元格 e9 中顯示評分結(jié)果,如圖 4 所示。
圖 4:將模型應用到輸入值
電子表格優(yōu)點
電子表格在最終用戶之間的流行多少有些令人費解。一方面,當今最常用的電子表格系統(tǒng)長期以來令許多開發(fā)人員氣餒,他們習慣于更為靈活、強大的系統(tǒng)。而另一方面,對于非開發(fā)人員而言,使用電子表格系統(tǒng)具有以下一些明顯優(yōu)點:無須構(gòu)建圖形化用戶界面、單獨構(gòu)建和測試每個公式(代碼)以及隱藏公式,看到的是更為簡單的計算結(jié)果。這些優(yōu)點只存在于當今流行的電子表格中,使用公式可將數(shù)字或文本返回到單元格,而許多系統(tǒng)主要受限于此。此處演示了如何移除這一限制并創(chuàng)建更為強大的工具。然后用它來直接訪問 Oracle 的數(shù)據(jù)挖掘模型功能以及其他 API。
結(jié)論
通過利用更為強大的電子表格,可以顯著縮短向最終用戶引入新技術(shù)版本(例如由發(fā)布的 Java API 和 PL/SQL API)的時間。事實上,使用此處的方法,直接將原始 Java API 交給非編程人員,以立即整合至決策制定流程或進行預測和分析是切實可行的。
【編輯推薦】