2 Oracle Machine Learning for Rについて

次の各トピックでは、Oracle Machine Learning for R (OML4R)およびRユーザーにとってのその利点について説明します。

ノート:

以前のリリースのOML4Rは、Oracle R Enterpriseという名前でした。

2.1 Oracle Machine Learning for Rとは

Oracle Machine Learning for R (OML4R)は、本番環境への迅速なデプロイが可能な、Rでのエンドツーエンド分析プロセス用の包括的なデータベース集中型の環境です。

OML4Rは、Rパッケージおよびデータベース機能のセットで、Rユーザーは、SQLを使用せずにデータベース常駐データを操作でき、そのデータベース環境で稼働する1つ以上の埋込みRエンジンでRスクリプトを実行できます。

OML4RをRセッションから使用すると、データベース・インスタンスのデータに簡単にアクセスできます。データベース表およびビューに対応するRオブジェクト(データベース表ではプロキシ・オブジェクト・データとも呼ばれる)を作成および使用できます。OML4Rには、R操作をデータベース内で実行するSQLに変換するオーバーロードされた関数があります。データベースはSQLを統合し、SQL文の実行時に、問合せの最適化、パラレル処理およびデータベースのスケーラビリティ機能を使用できます。データベースは結果をRオブジェクトとして返します。

OML4R 2.0は、Oracle Autonomous DatabaseインスタンスのOracle Machine Learning NotebooksのRインタプリタで使用できます。詳細は、「データ分析およびデータ視覚化のためのNotebooksスタート・ガイド」を参照してください。この環境には、R、必要なRライブラリ、OML NotebooksのRインタプリタなどの必要なコンポーネントがすべて含まれています。

埋込みRの実行は、OML4Rの使用による最も重要な利点のいくつかを提供します。Embedded R Executionを使用すると、RインタフェースまたはSQLインタフェース、あるいはその両方を介してデータベース内のRスクリプトを格納および実行できます。Embedded Rは、REST APIを使用してAutonomous Databaseで実行できます。Rスクリプトの結果を、構造化データ、Rオブジェクトおよびイメージに対するSQL対応のツールで使用できます。

2.2 Oracle Machine Learning for Rの利点

OML4Rを使用したOracle Databaseインスタンスのデータの準備および分析では、Rユーザーにとって多くの利点があります。

OML4Rを使用して、次のことを実行できます。

  • SQLを使用せずにデータベース常駐データを操作。OML4Rは、多くの標準R関数をSQLに透過的に変換します。OML4Rを使用すると、データベースに常駐するデータに対するアクセス、分析および操作を行うRプロキシ・オブジェクトを作成できます。OML4Rでは、列索引、問合せの最適化、表のパーティション化およびデータベースの並列性を利用して、SQLを自動的に最適化できます。

    OML4Rでオーバーロードされた関数は、インデータベース実行のためのRデータ・フレームに対するものを含め、一般的に使用される多くのR関数に使用できます。

  • データの移動を最小化。可能なかぎり常にデータをデータベースに保持することによって、クライアントのRエンジンへのデータの転送にかかる時間およびデータをローカルに格納する必要性をなくします。また、ローカルに格納したデータの管理(データ・ファイルの適切な場所への配布、本番データベースで行われた変更とのデータの同期などのタスクが含まれます)を必要なくします。

  • データをセキュアに保持。データをデータベースに保持することによって、データ管理用のOracle Databaseのセキュリティ、スケーラビリティ、信頼性およびバックアップの各機能を利用できます。

  • データベースの能力を使用。データベース内のデータを直接操作することによって、データベース環境のメモリーおよび処理能力を使用でき、クライアントのRエンジンのメモリーの制約を回避できます。

  • 最新のデータを使用。データはデータベースでリフレッシュされるため、最新のデータにただちにアクセスできます。

  • データベースでデータを準備。透過層関数を使用して、順序付け、集計、フィルタ処理、記録などの操作を介した予測分析用、およびSQLコードを記述することなく総括的サンプリング手法を使用するための、大規模なデータベース常駐データ・セットを準備します。

  • データベースにRオブジェクトを保存。Rセッション全体で使用し、他のユーザーと共有するために、ネイティブRオブジェクトおよびOML4Rプロキシ・オブジェクトをOML4Rデータストアに保存できます。RオブジェクトおよびOML4RオブジェクトをOracle Databaseインスタンスが管理するOML4Rデータストアに格納できます。

  • データベースにモデルを構築。OML4SQLのインデータベースのパラレル化および分散型機械学習アルゴリズムを使用して、より多くのデータに基づいてより多くのモデルを構築し、大量のデータをより迅速にスコアリングします。十分に統合されたR APIを介してOML4SQLからのインデータベース・アルゴリズムを使用します(これには現在、ニューラル・ネットワーク、ランダム・フォレスト、指数平滑化およびXGBoost用のインデータベース・アルゴリズムが含まれます)。インデータベース・アルゴリズムの自動データ準備、パーティション化されたモデル、統合テキスト・マイニング機能により、生産性が向上します。

    CRAN (包括的なRアーカイブ・ネットワーク)からダウンロードするパッケージ内の関数を使用して、アンサンブル・モデリングなどの手法を使用するモデルを構築できます。

  • 埋込みRエンジンでユーザー定義R関数を実行。OML4R Embedded R Execution機能を使用すると、ユーザー定義R関数をOML4Rスクリプト・リポジトリに格納し、データベース環境によって生成されたRエンジンでそれらの関数を実行できます。ユーザー定義R関数が実行されると、パラレルに実行できる1つ以上のRエンジンがデータベースによって生成および管理されます。Embedded R Execution機能を使用すると、次のことを実行できます。

    • Embedded Rエンジンで実行されるユーザー定義関数で、選択したRパッケージのセットを使用する。

    • Embedded Rエンジンで実行されるユーザー定義R関数で他のRパッケージを使用する。

    • 本番アプリケーションで使用するためにユーザー定義R関数を操作できるようにし、他の言語へのRコードおよびモデルの移植を回避する。Rの結果を既存のアプリケーションに統合するためにコードを作成しなおさなくても済みます。

    • Oracleデータベース・インスタンスをユーザー定義R関数の高パフォーマンス・コンピューティング環境としてシームレスに利用し、データ・パラレル処理とリソース管理を実現する。

    • システムでサポートされているタスク・パラレル化を使用して、モンテカルロ分析などのシミュレーションを実行する。

    • R、SQLおよびREST APIからユーザー定義R関数をコールする。

    • 構造化data.frame結果およびPNGイメージをユーザー定義R関数から表として返す他、構造化コンテンツとイメージ・コンテンツの両方が含まれるXMLも返す。

  • Oracleテクノロジ・スタックと統合。Oracleテクノロジ・スタックのあらゆる側面を利用して、ビジネス・インテリジェンスや科学調査といった、より大規模なフレームワーク内に、独自のデータ分析を統合できます。たとえば、OML4R分析の結果をOracle Analytics CloudおよびOracle APEXに統合するには、SQLを使用してR機能をコールします。

2.3 Oracle Machine Learning for Rのクラス、関数およびメソッドのオンライン・ヘルプの取得

OML4Rのクラス、関数およびメソッドに関するヘルプを取得するには、helpshowMethodsなどのR関数を使用します。クラスまたは関数の名前にore接頭辞が付いている場合は、help関数にその名前を指定できます。オープン・ソースR関数のオーバーロードされたメソッドに関するヘルプを取得するには、メソッドの名前およびoreクラスの名前を指定します。

例2-1 OML4Rのクラス、関数およびメソッドに関するヘルプの取得

この例では、OML4Rのクラス、関数およびメソッドに関する情報を取得するための様々な方法を示します。例の後にあるリストでは、一部のコードは結果の一部のみを表示するために変更されていて、一部の関数の出力は表示されていません。

# List the contents of the OREbase package.
ls("package:OREbase")

# Get help for the OREbase package.
help("OREbase")

# Get help for the ore virtual class.
help("ore-class")

# Show the subclasses of the ore virtual class.
showClass("ore")

# Get help on the ore.frame class.
help("ore.frame")

# Get help on the ore.vector class.
help("ore.vector")

# Show the arguments for the aggregate method.
showMethods("aggregate")

# Get help on the aggregate method for an ore.vector object.
help("aggregate,ore.vector-method")

# Show the signatures for the merge method.
showMethods("merge")

# Get help on the merge method for an ore.frame object.
help("merge,ore.frame,ore.frame-method")

showMethods("scale")

# Get help on the scale method for an ore.number object.
help("scale,ore.number-method")

# Get help on the ore.connect function.
help("ore.connect")
例2-1のリスト
R> options(width = 80)
# List the contents of the OREbase package.
R> head(ls("package:OREbase"), 12)
 [1] "%in%"          "Arith"         "Compare"       "I"            
 [5] "Logic"         "Math"          "NCOL"          "NROW"         
 [9] "Summary"       "as.data.frame" "as.env"        "as.factor"
R>
R># Get help for the OREbase package.
R> help("OREbase")      # Output not shown.
R>
R> # Get help for the ore virtual class.
R> help("ore-class")    # Output not shown.
R>
R># Show the subclasses of the ore virtual class.
R> showClass("ore")
Virtual Class "ore" [package "OREbase"]
 
No Slots, prototype of class "ore.vector"
 
Known Subclasses: 
Class "ore.vector", directly
Class "ore.frame", directly
Class "ore.matrix", directly
Class "ore.number", by class "ore.vector", distance 2
Class "ore.character", by class "ore.vector", distance 2
Class "ore.factor", by class "ore.vector", distance 2
Class "ore.date", by class "ore.vector", distance 2
Class "ore.datetime", by class "ore.vector", distance 2
Class "ore.difftime", by class "ore.vector", distance 2
Class "ore.logical", by class "ore.vector", distance 3
Class "ore.integer", by class "ore.vector", distance 3
Class "ore.numeric", by class "ore.vector", distance 3
Class "ore.tblmatrix", by class "ore.matrix", distance 2
Class "ore.vecmatrix", by class "ore.matrix", distance 2
R>
# Get help on the ore.frame class.
R> help("ore.frame")       # Output not shown.

R># Get help on the ore.vector class.
R> help("ore.vector")    # Output not shown.
R>
R># Show the arguments for the aggregate method.
R> showMethods("aggregate")
Function: aggregate (package stats)
x="ANY"
x="ore.vector"

# Get help on the aggregate method for an ore.vector object.
R> help("aggregate,ore.vector-method")      # Output not shown.

# Show the signatures for the merge method.
R> showMethods("merge")
Function: merge (package base)
x="ANY", y="ANY"
x="data.frame", y="ore.frame"
x="ore.frame", y="data.frame"
x="ore.frame", y="ore.frame

# Get help on the merge method for an ore.frame object.
R> help("merge,ore.frame,ore.frame-method")  # Output not shown.

R> showMethods("scale")
Function: scale (package base)
x="ANY"
x="ore.frame"
x="ore.number"
x="ore.tblmatrix"
x="ore.vecmatrix"

# Get help on the scale method for an ore.number object.
R> help("scale,ore.number-method")    # Output not shown.

# Get help on the ore.connect function.
R> help("ore.connect")                # Output not shown.

2.4 Oracle DatabaseのデータでのRの透過的な使用について

OML4Rには、Oracle DatabaseインスタンスおよびOracle Autonomous Databaseインスタンスのデータを直接操作するために使用できるオーバーロードされたオープン・ソースR関数があります。

このメソッドおよび関数は、R関数をSQLに変換する透過層を実装するパッケージに含まれています。

OML4Rの透過層パッケージおよびRをSQLに変換する際の制限について、次の各項で説明します。

2.4.1 透過層について

Oracle Machine Learning for Rの透過層は、OREbaseOREgraphicsOREdplyrおよびOREstatsのパッケージで実装されます。

これらのOML4Rパッケージには、オープン・ソースRのbasegraphicsおよびstatsのパッケージの関数のオーバーロードされたメソッドがそれぞれ含まれています。

これらのパッケージのメソッドおよび関数を使用すると、Oracle Databaseインスタンスの表およびビューに対応するdata.frameおよびその他のRプロキシ・オブジェクトを作成できます。そのようなオブジェクトを使用するR式を実行すると、メソッドおよび関数はSQL問合せを透過的に生成してデータベースに送信します。その後、データベースは問合せを実行し、通常は結果もプロキシ・オブジェクトとして返して、データとクライアント間のデータ移動を最小限に抑えます。これは、結果によっては大きくなる可能性があるためです。

データベース表またはビューは、data.frameのサブクラスであるore.frameオブジェクトで表されます。その他のOML4Rクラスは、vectorから継承されるore.vectorなど、対応するRクラスから継承されます。OML4Rは、Oracle Databaseのデータ型をOML4Rのクラスに(たとえば、NUMBERを完全なマップ・リストに)マップします。

透過層メソッドおよび関数を使用して、分析用のデータベース常駐データを準備できます。次に、他のOML4Rパッケージの関数を使用してモデルを構築し、それを使用してデータをスコアリングできます。

例2-2 Rでの種ごとの花弁の長さの平均の調査

この例では、Rデータ・フレームirisからIRIS_TABLEという表を作成します。次に、オーバーロードされた集計関数を使用して、種ごとに花弁の長さの平均を計算します。

ore.create(iris, table = 'IRIS_TABLE')
aggplen = aggregate(IRIS_TABLE$Petal.Length,
                    by = list(species = IRIS_TABLE$Species),
                    FUN = mean)
aggplen
この例のリスト
R> ore.create(iris, table = 'IRIS_TABLE')
R> aggplen = aggregate(IRIS_TABLE$Petal.Length,
                       by = list(species = IRIS_TABLE$Species),
                       FUN = mean)
R> aggplen
              species     x
setosa         setosa 1.462
versicolor versicolor 4.260
virginica   virginica 5.552

例2-3 前の例に対応するSQL

この例では、前の例のaggregate関数に対応するSQLを示します。

SELECT "Species", AVG("Petal.Length")
FROM IRIS_TABLE
GROUP BY "Species"
ORDER BY "Species";
 
Species     AVG("PETAL.LENGTH") 
----------- ------------------- 
setosa       1.4620000000000002 
versicolor   4.26
virginica    5.552

2.4.2 Rのデータ型およびクラスの透過層サポート

Oracle Machine Learning for Rの透過層には、Rデータ型をOracle Databaseデータ型にマップするクラスおよびデータ型があります。

これらのクラスおよびデータ型について、次の各項で説明します。

2.4.2.1 Oracle Machine Learning for Rのデータ型およびクラスについて

OML4Rには、Rデータ型をSQLデータ型にマップするデータ型があります。

Rセッションでは、Rオブジェクトからデータベース・オブジェクトを作成するか、データベース・データからRオブジェクトを作成すると、OML4RはRデータ型をSQLデータ型に変換し、可能な場合はその逆を実行します。

OML4Rは、OML4Rのクラスのインスタンスであるオブジェクトを作成します。OML4Rは、多くの標準のR関数をオーバーロードし、それらでOML4Rのクラスおよびデータ型を使用できるようにします。R言語の構造および構文は、Oracle Databaseオブジェクトにマップされているオブジェクトでサポートされます。

表2-1 R、OML4RおよびSQLのデータ型のマッピング

Rデータ型 OML4Rデータ型 SQLデータ型

キャラクタ・モードのvector

ore.character

VARCHAR2

INTERVALYEARTOMONTH

整数モードのvector

ore.integer

NUMBER

論理モードのvector

ore.logical

NUMBERFALSEの場合は0、TRUEの場合は1

数値モードのvector

ore.number

BINARY_DOUBLE

BINARY_FLOAT

FLOAT

NUMBER

Date

ore.date

DATE

POSIXct

POSIXlt

ore.datetime

TIMESTAMP

TIMESTAMPWITHTIMEZONE

TIMESTAMPWITHLOCALTIMEZONE

difftime

ore.difftime

INTERVALDAYTOSECOND

なし

サポートなし

LONG

LONG RAW

RAW

ユーザー定義のデータ型

参照データ型

ノート:

  • タイプore.datetimeのオブジェクトはタイム・ゾーン設定をサポートしていないため、かわりに、システム・タイム・ゾーンSys.timezoneが使用可能な場合はそれを使用し、Sys.timezoneを使用できない場合はGMTを使用します。

  • SQL VARCHAR2データ型は、埋込みRの入力データ引数を介してR文字データ型にマップされます。ユーザーは、as.factor()を使用して、必要に応じて文字変数をRファクタに変換できます。

2.4.2.2 ore.frameクラスについて

これはdata.frameに相当するOML4Rのオブジェクトです。通常は、データベース表のプロキシであるore.frameオブジェクトを取得します。次に、ore.frameプロキシ・オブジェクトに新しい列を追加するか、他の変更を行います。そのような変更は、基礎となる表には影響しません。その後でore.frameオブジェクトのソース表からデータをリクエストした場合は、透過層関数が選択リストに追加の列があるSQL問合せを生成しますが、その表は変更されません。

Rでは、data.frameの要素に明示的な順序付けがあります。整数索引付けを使用して要素を指定できます。一方、リレーショナル・データベース表では行の順序が定義されないため、Rデータ構造に直接マップできません。

OML4Rには、ore.frameオブジェクトの順序付けられたものと順序付けられていないものの両方があります。表に主キー(行内で個別のタプルを形成する1つ以上の列のセット)がある場合は、SELECT文でORDER BY句を使用することで順序付けられた結果を生成できます。ただし、リレーショナル・データの順序付けは負荷が高く、多くの場合、透過層操作では不要です。たとえば、ore.framesummary関数を呼び出す場合、サマリー統計の計算に順序付けは必要ありません。

関連項目:

ore.createの詳細は、「一時データベース表の作成」を参照してください。

例2-4 data.frameおよび対応するore.frameのクラス

この例では、様々なデータ型を含む列があるdata.frameを作成し、data.frameの構造を表示します。この例では次に、ore.push関数をコールして、data.frameのデータのコピーが含まれるデータベースに一時表を作成します。ore.pushの呼出しでは、その表のプロキシであるore.frameオブジェクトも生成されます。この例では、ore.frameオブジェクトとdata.frameオブジェクトおよびore.frameオブジェクトにある列のクラスを表示します。

df <- data.frame(a="abc",
                 b=1.456,
                 c=TRUE,
                 d=as.integer(1),
                 e=Sys.Date(),
                 f=as.difftime(c("0:3:20", "11:23:15")))
ore.push(df)
class(df$a)
class(df$b)
class(df$c)
class(df$d)
class(df$e)
class(df$f)
例のリスト
R> df <- data.frame(a="abc",
+                   b=1.456,
+                   c=TRUE,
+                   d=as.integer(1),
+                   e=Sys.Date(),
+                   f=as.difftime(c("0:3:20", "11:23:15")))
R> ore.push(df)
R> class(df$a)
[1] "character"
R> class(df$b)
[1] "numeric"
R> class(df$c)
[1] "logical"
R> class(df$d)
[1] "integer"
R> class(df$e)
[1] "Date"
R> class(df$f)
[1] "difftime"
2.4.2.3 Rのネーミング規則のサポート

OML4Rは、ore.frame列に対して、より制限的なOracle Databaseのネーミング規則ではなくRのネーミング規則を使用します。

ore.frameの列には、30バイトより長く、二重引用符を含む、一意でない名前を付けることができます。

2.4.2.4 RおよびOracle Machine Learning for Rのクラス・タイプの強制変換について

OML4R関数の一部は、Rオブジェクトおよびクラス・タイプをOML4Roreオブジェクトおよびタイプに強制変換します。

汎用のas.ore関数は、インメモリーRオブジェクトをoreオブジェクトに強制変換します。より厳密なas.ore.characterなどの関数は、オブジェクトを特定の型に強制変換します。ore.push関数は、Rクラス・タイプをoreクラス・タイプに暗黙的に強制変換し、ore.pull関数は、oreクラス・タイプをRクラス・タイプに強制変換します。これらの関数の詳細は、「一時データベース表の作成」を参照してください。

例2-5 RおよびOML4Rのクラス・タイプの強制変換

この例では、oreオブジェクトへのRオブジェクトの強制変換を示します。Rのintegerオブジェクトを作成した後、汎用メソッドas.oreを使用してore.integerであるoreオブジェクトに強制変換します。この例では、Rオブジェクトを他の様々なoreクラス・タイプに強制変換します。Embedded R Execution関数でのas.factorの使用例は、例10-9を参照してください。

x <- 1:10
class(x)
X <- as.ore(x)
class(X)
Xn <- as.ore.numeric(x)
class(Xn)
Xc <- as.ore.character(x)
class(Xc)
Xc
Xf <- as.ore.factor(x)
Xf
例2-5のリスト
R> x <- 1:10
R> class(x)
[1] "integer"
R> X <- as.ore(x)
R> class(X)
[1] "ore.integer"
attr(,"package")
[1] "OREbase"
R> Xn <- as.ore.numeric(x)
R> class(Xn)
[1] "ore.numeric"
attr(,"package")
[1] "OREbase"
R> Xc <- as.ore.character(x)
R> class(Xc)
[1] "ore.character"
attr(,"package")
[1] "OREbase"
R> Xc
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"
R> Xf <- as.ore.factor(x)
R> Xf
 [1] 1  2  3  4  5  6  7  8  9  10
Levels: 1 10 2 3 4 5 6 7 8 9

2.5 Oracle Machine Learning for Rのグローバル・オプション

OML4Rには、様々な関数に適用されるグローバル・オプションがあります。

表2-2に、OML4Rのグローバル・オプションおよび説明を示します。

表2-2 OML4Rのグローバル・オプション

グローバル 説明

ore.envAsEmptyenv

Oracle Databaseへのシリアライズ中にオブジェクト内の参照される環境を空の環境で置き換えるかどうかを指定する論理値。TRUEの場合、オブジェクト内の参照される環境は親が.GlobalEnvである空の環境で置き換えられ、参照される元の環境内のオブジェクトはシリアライズされません。これにより、シリアライズされるオブジェクトのサイズを大幅に削減できる場合があります。FALSEの場合、参照される環境内のすべてのオブジェクトがシリアライズされますが、シリアライズを解除したりメモリーにロードすることもできます。このオプションのデフォルト値はFALSEです。

このグローバル・オプションは次のOML4R関数で使用されます。

  • シリアライズされたlistオブジェクトをデータベースに保存するためのore.push

  • オブジェクトをOML4Rデータストアに保存するためのore.save

  • ore.doEvalと、listタイプのパラメータをシリアライズするための、かつ、埋込みR実行時にR関数によって返されたオブジェクトをシリアライズするためのその他のEmbedded R Execution関数

ore.na.extract

ore.frameオブジェクトまたはore.vectorオブジェクトの論理サブスクリプト中に使用される論理値。TRUEが指定されると、NA論理サブスクリプトを含む行または要素は、NA値を含む行または要素を生成しますが、これは、Rによるdata.frame値およびvector値の欠損値の論理サブスクリプトの処理方法を模倣します。

FALSEが指定されると、NA論理サブスクリプトはFALSE値として解釈されるため、対応する行または要素が削除されます。デフォルト値はFALSEです。

ore.parallel

Embedded R Executionで使用する優先並列度。次のうちの1つ。

  • 特定の並列度では、2以上の正の整数

  • パラレル化しない場合は、FALSEまたは1

  • data引数のデフォルトのパラレル化の場合はTRUE

  • 操作に対するデータベースのデフォルトはNULL

デフォルト値はNULLです。

ore.sep

ore.frameの複数列の行名間で使用するセパレータを指定する文字列。デフォルト値は|です。

ore.trace

OML4Rの反復関数が反復ごとに出力を印刷するかどうかを指定する論理値。デフォルト値はFALSEです。

ore.warn.order

順序付けが必要な関数で行名がないore.frameまたは要素名がないore.vectorを使用したときにOML4Rが警告メッセージを表示するかどうかを指定する論理値。デフォルト値はTRUEです。