データベース内での機械学習の実践(オラクルの場合)
データベース内機械学習はどのように利用するのかをオラクルの例を挙げたいと思います。オラクルでは言語的なインターフェースとして、SQLとPythonとR(Python)が用意されています。ここでは、Python(OML4Py:Oracle Machine Learning for Python)を利用して機械学習を行ってみます。データは、アヤメの花の「種類(Species)」と「花弁(Petal)」の長さ(Length)と幅(Width)、「萼片(Sepal)」の長さと幅の5列のIRISデータセットを利用します。このデータをsklearnからデータベースの表として取り込み、自動機械学習の機能を用いて、最適と思われるアルゴリズムを取得して、そのモデルを作成し、評価するまでのプロセスを記載します。
下準備:IRISデータのロードとデータベースへの取り込み
こちらの作業は本来データベース内データの分析作業では不要な項目ですが、サンプルとしての完全性のために記載したものになります
# sklearnのIRISデータセットをデータベースの表として取り込む import oml from sklearn import datasets import pandas as pd ## IRISデータのロード iris = datasets.load_iris() # sklearn内のirisデータセットの読み込み ## IRISデータの表構造化(sklearnからロードされるirisデータは表構造ではなくBunch型のため) x = pd.DataFrame(iris.data, columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width']) y = pd.DataFrame( list(map(lambda x: {0: 'setosa', 1: 'versicolor', 2:'virginica'}[x], iris.target)), columns = ['Species']) # IRISデータをデータベース内の表として生成 # (これ以降の操作ではデータはデータベース内から移動しない実装になっています) iris_on_oracle = oml.create(pd.concat([x, y], axis=1), table = 'IRIS')
データセットの分割
データセットを学習用と評価用データに分割します
# 学習用データとテスト用データに分割 (oml.dataframeのsplit関数を利用) ## dat[0]を学習用、dat[1]をテスト用として分割 dat = iris_on_oracle.split() ## 目的変数(Species) と 説明変数(Specie以外) に分割 train_x = dat[0].drop('Species') train_y = dat[0]['Species']
自動機械学習(AutoML)のアルゴリズム選択の利用
# AutoMLの自動モデル選択 import oml from oml import automl ## アルゴリズム選択の設定 ( 分類モデルでaccuracyを評価軸として4並列で動作) algosel = automl.AlgorithmSelection(mining_function='classification', score_metric='accuracy', parallel=4) ## アルゴリズム選択の実行 best_model = algosel.select( train_x, train_y) ## 結果の表示 rf(ランダムフォレスト)が最も高いスコア best_model [('rf', 0.9423280423280425), ('dt', 0.9402116402116402), ('nn', 0.932804232804233)]
ランダムフォレストのモデル作成
# ランダムフォレストモデルの作成 from oml import rf rf_model =rf() rf_model = rf_model.fit(train_x, train_y)
予測結果の取得と評価
# モデル適用結果の取得 (予測結果に加えて supplemental_colsで評価用列を追加して出力 ) pred = rf_model.predict( dat[1].drop('Species') , supplemental_cols = dat[1] [:,['Sepal_Length','Species']] ) # 結果の出力 pred Sepal_Length Species PREDICTION 0 5.5 versicolor versicolor 1 5.5 versicolor versicolor 2 5.7 virginica virginica …. # クロス表での評価 res_ct = pred.crosstab( 'Species','PREDICTION',pivot=True) res_ct.sort_values(by='Species') Species count_(setosa) count_(versicolor) count_(virginica) 0 setosa 14 0 0 1 versicolor 0 14 1 2 virginica 0 0 17
データベース内機械学習の展望
クラウドの登場によって実現したデータ量がスケールする世界への対応策の1つとして、各社で実装が進んでいるデータベース内機械学習の現在地とオラクルの実装について述べてきました。クラウド化によって、これまで以上に蓄積されるデータは増加の一途をたどっていますし、データが大量になることで起こるデータ移動の問題自体は不可避なものと思われますので、今後もこういったデータベース、データの在処でデータを活用する実装というトレンドは続くものと思われます。
また、機械学習という観点では、より平易に誰でも使えるようにという流れもあります。前述の例ではアルゴリズムの自動選択機能を利用しましたが、オラクルの場合にはOracle Labsで研究開発している自働機械学習を実装したOracle AutoMLという機能があります。この機能をクラウド上のAutonomous Databaseと統合し、シンプルなUIで機械学習の利用が可能なOracle AutoML UIというツールも提供しています。こちらもご興味がありましたら以下のURLにて簡単なチュートリアルをご用意してありますので、ご覧いただけましたら幸いです。
さて、活用手段としての機械学習、AI技術に関しては平易なものが出てくる流れだけではなく、GPTのようなより高度で大規模なものが生み出され、活用できる幅が大きく前進しつつあるように見受けられます。ある種、二極化しているようはありますが、これらはデータが非常に重要という意味では共通しており、データの在処、移動、利用というジレンマを宿命的に内包しているように見えます。
つまり、今後もデータはより多く蓄積され、より多く活用されるようになる流れは加速していくものと思われます。そのため、データの所在、移動の問題は今後も解決すべき課題として、今後も様々な実装がでてくるのではないかと思います。