8.15 ニューラル・ネットワーク

oml.nnクラスは、分類および回帰用のニューラル・ネットワーク(NN)モデルを作成します。

ニューラル・ネットワーク・モデルを使用すると、入力と出力との間の複雑な非リニアの関係を取得すること、つまりデータのパターンを見つけることができます。

oml.nnクラスのメソッドは、oml.DataFrameのデータに対して回帰用のフィードフォワード・ニューラル・ネットワークを構築します。これは、ノード数を指定可能な複数の非表示層をサポートします。各層には、複数の活性化関数のいずれかを設定できます。

出力層は、単一の数値カテゴリ・ターゲットまたはバイナリのカテゴリ・ターゲットです。出力層には、任意の活性化関数を設定できます。これには、デフォルトで線形活性化関数があります。

ore.nnクラスを使用したモデリングは、センサー・データなどのノイズ・データおよび複合データに適しています。そのようなデータに発生する可能性のある問題は次のとおりです。

  • ピクセル値など、(数値)予測子が多い可能性がある

  • ターゲットが離散値、実数値またはそのような値のベクターである可能性がある

  • トレーニング・データに(ノイズに対して堅牢な)エラーが含まれている可能性がある

  • スコアリングが高速

  • モデルの透過性が不要なため、モデルの解釈が困難

ニューラル・ネットワーク・モデリングの一般的なステップは次のとおりです。

  1. アーキテクチャの指定

  2. データの準備

  3. モデルの構築

  4. 停止条件(反復、許容範囲内の検証セットでのエラー)の指定

  5. モデルの統計結果の表示

  6. モデルの改善

oml.nnクラスの属性およびメソッドの詳細は、help(oml.nn)またはhelp(oml.hist)を呼び出すか、Oracle Machine Learning for Python APIリファレンスを参照してください。

ニューラル・ネットワーク・モデルの設定

次の表は、NNモデルの設定のリストです。

表8-13 ニューラル・ネットワーク・モデルの設定

設定名 設定値 説明
CLAS_COST_TABLE_NAME

table_name

モデルのスコアリングに使用するアルゴリズムのコスト・マトリックスを格納する表の名前。コスト・マトリックスは、分類ミスに関連するコストを指定します。

コスト・マトリックス表は、ユーザーが作成します。表の列の要件は次のとおりです。

  • 列名: ACTUAL_TARGET_VALUE

    データ型: 有効なターゲット・データ型

  • 列名: PREDICTED_TARGET_VALUE

    データ型: 有効なターゲット・データ型

  • 列名: COST

    データ型: NUMBER

CLAS_WEIGHTS_BALANCED

ON

OFF

ターゲットの分布を平均化するモデルをアルゴリズムが作成する必要があるかどうかを示します。分布の平均化では、主要なクラスを重視する全体精度ではなく、平均精度(クラスごとの精度の平均)を向上できるため、この設定は稀なターゲットが存在する場合に最適です。デフォルト値はOFFです。

NNET_ACTIVATIONS

次の文字列のリスト:

  • ''NNET_ACTIVATIONS_ARCTAN''
  • ''NNET_ACTIVATIONS_BIPOLAR_SIG''
  • ''NNET_ACTIVATIONS_LINEAR''
  • ''NNET_ACTIVATIONS_LOG_SIG''
  • ''NNET_ACTIVATIONS_TANH''

非表示層の活性化関数を定義します。たとえば、'''NNET_ACTIVATIONS_BIPOLAR_SIG'', ''NNET_ACTIVATIONS_TANH'''のようにします。

層ごとに異なる活性化関数を用意できます。

デフォルト値は、''NNET_ACTIVATIONS_LOG_SIG''です。

活性化関数の数は、NNET_HIDDEN_LAYERSおよびNNET_NODES_PER_LAYERと一貫性を保つ必要があります。

ノート:

すべての引用符は一重引用符です。2つの一重引用符は、SQL文の一重引用符エスケープするために使用します。
NNET_HELDASIDE_MAX_FAIL

正の整数

NNET_REGULARIZER_HELDASIDEでは、検証データのネットワーク・パフォーマンスが行内のNNET_HELDASIDE_MAX_FAILエポックについて改善されない場合や同じままの場合、トレーニング・プロセスは早期に停止されます。

デフォルト値は6です。

NNET_HELDASIDE_RATIO

0 <= numeric_expr <= 1

除外メソッドの保持比率を定義します。

デフォルト値は0.25です。

NNET_HIDDEN_LAYERS

負でない整数

非表示レイヤーの数によってトポロジを定義します。

デフォルト値は1です。

NNET_ITERATIONS

正の整数

ニューラル・ネットワーク・アルゴリズムにおける最大反復数を指定します。

デフォルト値は200です。

NNET_NODES_PER_LAYER

正の整数のリスト

レイヤー当たりのノード数によってトポロジを定義します。様々なレイヤーに様々な数のノードを含めることができます。

この値は、負でない整数のカンマ区切りリストである必要があります。たとえば、'10, 20, 5'のようになります。設定値は、NNET_HIDDEN_LAYERSと一致する必要があります。層ごとのレイヤーのデフォルト数は、属性の数または50 (属性の数> 50の場合)です。

NNET_REG_LAMBDA

TO_CHAR(numeric_expr >= 0)

L2正則化パラメータ・ラムダを定義します。これは、NNET_REGULARIZER_HELDASIDEと一緒に設定することはできません。

デフォルト値は1です。

NNET_REGULARIZER

NNET_REGULARIZER_HELDASIDE

NNET_REGULARIZER_L2

NNET_REGULARIZER_NONE

ニューラル・ネットワーク・アルゴリズムの正則化設定。トレーニング行の合計数が50000より大きい場合、デフォルトはNNET_REGULARIZER_HELDASIDEです。トレーニング行の合計数が50000以下の場合、デフォルトはNNET_REGULARIZER_NONEです。

NNET_SOLVER

NNET_SOLVER_ADAM

NNET_SOLVER_LBFGS

最適化の方法を指定します。

デフォルト値はNNET_SOLVER_LBFGSです。

NNET_TOLERANCE

TO_CHAR(0 < numeric_expr < 1)

ニューラル・ネットワーク・アルゴリズムの収束許容値の設定を定義します。

デフォルト値は0.000001です。

NNET_WEIGHT_LOWER_BOUND

実数

重みがランダムに初期化されるリージョンの下限を指定します。NNET_WEIGHT_LOWER_BOUNDNNET_WEIGHT_UPPER_BOUNDを一緒に設定する必要があります。一方を設定し、もう一方を設定しない場合、エラーが発生します。NNET_WEIGHT_LOWER_BOUNDNNET_WEIGHT_UPPER_BOUNDより大きくすることはできません。デフォルト値は–sqrt(6/(l_nodes+r_nodes))です。l_nodesの値は次のようになります。
  • 入力レイヤー密属性では、(1+密属性の数)

  • 入力レイヤー・スパース属性では、スパース属性の数

  • 各非表示レイヤーでは、(1+その非表示レイヤーのノードの数)

r_nodesの値は、重みが接続するレイヤー内のノードの数です。

NNET_WEIGHT_UPPER_BOUND

実数

重みが初期化されるリージョンの上限を指定します。NNET_WEIGHT_LOWER_BOUNDとペアで設定する必要があり、値をNNET_WEIGHT_LOWER_BOUNDの値より小さくすることはできません。指定されていない場合、NNET_WEIGHT_LOWER_BOUNDおよびNNET_WEIGHT_UPPER_BOUNDの値はシステムによって決定されます。

デフォルト値はsqrt(6/(l_nodes+r_nodes))です。「NNET_WEIGHT_LOWER_BOUND」を参照してください。

ODMS_RANDOM_SEED

負でない整数

均一な分布で乱数を生成するためにハッシュ関数で使用される乱数シードを制御します。デフォルト値は0です。

例8-15 ニューラル・ネットワーク・モデルの構築

この例では、NNモデルを作成し、oml.nnクラスのメソッドの一部を使用します。

import oml
import pandas as pd
from sklearn import datasets

# Load the iris data set and create a pandas.DataFrame for it.
iris = datasets.load_iris()
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'])

try:
    oml.drop('IRIS')
except:
    pass

# Create the IRIS database table and the proxy object for the table.
oml_iris = oml.create(pd.concat([x, y], axis=1), table = 'IRIS')

# Create training and test data.
dat = oml.sync(table = 'IRIS').split()
train_x = dat[0].drop('Species')
train_y = dat[0]['Species']
test_dat = dat[1]

# Create a Neural Network model object.
nn_mod = oml.nn(nnet_hidden_layers = 1, 
                nnet_activations= "'NNET_ACTIVATIONS_LOG_SIG'", 
                NNET_NODES_PER_LAYER= '30')

# Fit the NN model according to the training data and parameter
# settings.
nn_mod = nn_mod.fit(train_x, train_y)

# Show details of the model.
nn_mod

# Use the model to make predictions on test data.
nn_mod.predict(test_dat.drop('Species'), 
    supplemental_cols = test_dat[:, ['Sepal_Length', 'Sepal_Width', 
                                     'Petal_Length', 'Species']])

nn_mod.predict(test_dat.drop('Species'), 
    supplemental_cols = test_dat[:, ['Sepal_Length', 'Sepal_Width', 
                                 'Species']], proba = True)

nn_mod.predict_proba(test_dat.drop('Species'), 
    supplemental_cols = test_dat[:, ['Sepal_Length', 
      'Species']]).sort_values(by = ['Sepal_Length', 'Species',
         'PROBABILITY_OF_setosa', 'PROBABILITY_OF_versicolor'])

nn_mod.score(test_dat.drop('Species'), test_dat[:, ['Species']])

# Change the setting parameter and refit the model.
new_setting = {'NNET_NODES_PER_LAYER': '50'}
nn_mod.set_params(**new_setting).fit(train_x, train_y)

この例のリスト

>>> import oml
>>> import pandas as pd
>>> from sklearn import datasets
>>>
>>> # Load the iris data set and create a pandas.DataFrame for it.
... iris = datasets.load_iris()
>>> 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'])
>>>
>>> try:
...    oml.drop('IRIS')
... except:
...    pass
>>>
>>> # Create the IRIS database table and the proxy object for the table.
... oml_iris = oml.create(pd.concat([x, y], axis=1), table = 'IRIS')
>>>
>>> # Create training and test data.
... dat = oml.sync(table = 'IRIS').split()
>>> train_x = dat[0].drop('Species')
>>> train_y = dat[0]['Species']
>>> test_dat = dat[1]
>>> 
>>> # Create a Neural Network model object.
... nn_mod = oml.nn(nnet_hidden_layers = 1, 
...                 nnet_activations= "'NNET_ACTIVATIONS_LOG_SIG'", 
...                 NNET_NODES_PER_LAYER= '30')
>>> 
>>> # Fit the NN model according to the training data and parameter
... # settings.
... nn_mod = nn_mod.fit(train_x, train_y)
>>>
>>> # Show details of the model.
... nn_mod

Algorithm Name: Neural Network

Mining Function: CLASSIFICATION

Target: Species

Settings: 
                    setting name               setting value
0                      ALGO_NAME         ALGO_NEURAL_NETWORK
1          CLAS_WEIGHTS_BALANCED                         OFF
2       LBFGS_GRADIENT_TOLERANCE                  .000000001
3            LBFGS_HISTORY_DEPTH                          20
4            LBFGS_SCALE_HESSIAN  LBFGS_SCALE_HESSIAN_ENABLE
5               NNET_ACTIVATIONS  'NNET_ACTIVATIONS_LOG_SIG'
6        NNET_HELDASIDE_MAX_FAIL                           6
7           NNET_HELDASIDE_RATIO                         .25
8             NNET_HIDDEN_LAYERS                           1
9                NNET_ITERATIONS                         200
10          NNET_NODES_PER_LAYER                          30
11                NNET_TOLERANCE                     .000001
12                  ODMS_DETAILS                 ODMS_ENABLE
13  ODMS_MISSING_VALUE_TREATMENT     ODMS_MISSING_VALUE_AUTO
14              ODMS_RANDOM_SEED                           0
15                 ODMS_SAMPLING       ODMS_SAMPLING_DISABLE
16                     PREP_AUTO                          ON

Computed Settings: 
       setting name          setting value
0  NNET_REGULARIZER  NNET_REGULARIZER_NONE

Global Statistics: 
   attribute name  attribute value
0       CONVERGED              YES
1      ITERATIONS             60.0
2      LOSS_VALUE              0.0
3        NUM_ROWS            102.0


Attributes: 
Sepal_Length
Sepal_Width
Petal_Length
Petal_Width

Partition: NO

Topology: 

    HIDDEN_LAYER_ID  NUM_NODE       ACTIVATION_FUNCTION
 0                0        30  NNET_ACTIVATIONS_LOG_SIG

Weights: 

      LAYER  IDX_FROM  IDX_TO ATTRIBUTE_NAME ATTRIBUTE_SUBNAME ATTRIBUTE_VALUE  \
 0        0       0.0       0   Petal_Length              None            None   
 1        0       0.0       1   Petal_Length              None            None   
 2        0       0.0       2   Petal_Length              None            None   
 3        0       0.0       3   Petal_Length              None            None   
 ...    ...       ...     ...            ...               ...             ...   
 239      1      29.0       2           None              None            None   
 240      1       NaN       0           None              None            None   
 241      1       NaN       1           None              None            None   
 242      1       NaN       2           None              None            None   

     TARGET_VALUE     WEIGHT  
 0           None -39.836487  
 1           None  32.604824  
 2           None   0.953903  
 3           None   0.714064  
 ...          ...        ... 
 239    virginica -22.650606  
 240       setosa   2.402457  
 241   versicolor   7.647615  
 242    virginica  -9.493982  

[243 rows x 8 columns]



>>> # Use the model to make predictions on test data.
... nn_mod.predict(test_dat.drop('Species'), 
...     supplemental_cols = test_dat[:, ['Sepal_Length', 'Sepal_Width', 
...                                      'Petal_Length', 'Species']])
     Sepal_Length  Sepal_Width  Petal_Length     Species  PREDICTION
 0            4.9          3.0           1.4      setosa      setosa
 1            4.9          3.1           1.5      setosa      setosa
 2            4.8          3.4           1.6      setosa      setosa
 3            5.8          4.0           1.2      setosa      setosa
...           ...          ...           ...         ...         ...
 44           6.7          3.3           5.7   virginica   virginica
 45           6.7          3.0           5.2   virginica   virginica
 46           6.5          3.0           5.2   virginica   virginica
 47           5.9          3.0           5.1   virginica   virginica

>>> nn_mod.predict(test_dat.drop('Species'), 
...     supplemental_cols = test_dat[:, ['Sepal_Length', 'Sepal_Width', 
...                                  'Species']], proba = True)
     Sepal_Length  Sepal_Width     Species  PREDICTION  PROBABILITY
 0            4.9          3.0      setosa      setosa     1.000000
 1            4.9          3.1      setosa      setosa     1.000000
 2            4.8          3.4      setosa      setosa     1.000000
 3            5.8          4.0      setosa      setosa     1.000000
...           ...          ...         ...        ...          ...
 44           6.7          3.3   virginica   virginica     1.000000
 45           6.7          3.0   virginica   virginica     1.000000
 46           6.5          3.0   virginica   virginica     1.000000
 47           5.9          3.0   virginica   virginica     1.000000

>>> nn_mod.predict_proba(test_dat.drop('Species'), 
...     supplemental_cols = test_dat[:, ['Sepal_Length', 
...       'Species']]).sort_values(by = ['Sepal_Length', 'Species',
...         'PROBABILITY_OF_setosa', 'PROBABILITY_OF_versicolor'])
     Sepal_Length     Species  PROBABILITY_OF_SETOSA  \
 0            4.4      setosa           1.000000e+00   
 1            4.4      setosa           1.000000e+00   
 2            4.5      setosa           1.000000e+00   
 3            4.8      setosa           1.000000e+00   
...           ...         ...                    ...   
 44           6.7   virginica          4.567318e-218   
 45           6.9  versicolor          3.028266e-177   
 46           6.9   virginica          1.203417e-215   
 47           7.0  versicolor          3.382837e-148   

     PROBABILITY_OF_VERSICOLOR  PROBABILITY_OF_VIRGINICA  
 0                3.491272e-67             3.459448e-283  
 1                8.038930e-58             2.883999e-288  
 2                5.273544e-64             2.243282e-293  
 3                1.332150e-78             2.040723e-283  
...                        ...                       ... 
 44               1.328042e-36              1.000000e+00  
 45               1.000000e+00              5.063405e-55  
 46               4.000953e-31              1.000000e+00  
 47               1.000000e+00             2.593761e-121  

>>> nn_mod.score(test_dat.drop('Species'), test_dat[:, ['Species']])
 0.9375

>>> # Change the setting parameter and refit the model.
... new_setting = {'NNET_NODES_PER_LAYER': '50'}
>>> nn_mod.set_params(**new_setting).fit(train_x, train_y)

Algorithm Name: Neural Network

Mining Function: CLASSIFICATION

Target: Species

Settings: 
                    setting name               setting value
0                      ALGO_NAME         ALGO_NEURAL_NETWORK
1          CLAS_WEIGHTS_BALANCED                         OFF
2       LBFGS_GRADIENT_TOLERANCE                  .000000001
3            LBFGS_HISTORY_DEPTH                          20
4            LBFGS_SCALE_HESSIAN  LBFGS_SCALE_HESSIAN_ENABLE
5               NNET_ACTIVATIONS  'NNET_ACTIVATIONS_LOG_SIG'
6        NNET_HELDASIDE_MAX_FAIL                           6
7           NNET_HELDASIDE_RATIO                         .25
8             NNET_HIDDEN_LAYERS                           1
9                NNET_ITERATIONS                         200
10          NNET_NODES_PER_LAYER                          50
11                NNET_TOLERANCE                     .000001
12                  ODMS_DETAILS                 ODMS_ENABLE
13  ODMS_MISSING_VALUE_TREATMENT     ODMS_MISSING_VALUE_AUTO
14              ODMS_RANDOM_SEED                           0
15                 ODMS_SAMPLING       ODMS_SAMPLING_DISABLE
16                     PREP_AUTO                          ON

Computed Settings: 
       setting name          setting value
0  NNET_REGULARIZER  NNET_REGULARIZER_NONE

Global Statistics: 
   attribute name  attribute value
0       CONVERGED              YES
1      ITERATIONS             68.0
2      LOSS_VALUE              0.0
3        NUM_ROWS            102.0

Attributes: 
Sepal_Length
Sepal_Width
Petal_Length
Petal_Width

Partition: NO

Topology: 

    HIDDEN_LAYER_ID  NUM_NODE       ACTIVATION_FUNCTION
 0                0        50  NNET_ACTIVATIONS_LOG_SIG

Weights: 

      LAYER  IDX_FROM  IDX_TO ATTRIBUTE_NAME ATTRIBUTE_SUBNAME ATTRIBUTE_VALUE  \
 0        0       0.0       0   Petal_Length              None            None   
 1        0       0.0       1   Petal_Length              None            None   
 2        0       0.0       2   Petal_Length              None            None   
 3        0       0.0       3   Petal_Length              None            None   
 ...    ...       ...     ...            ...               ...             ...   
 399      1      49.0       2           None              None            None   
 400      1       NaN       0           None              None            None   
 401      1       NaN       1           None              None            None   
 402      1       NaN       2           None              None            None   

     TARGET_VALUE     WEIGHT  
 0           None  10.606389  
 1           None -37.256485  
 2           None -14.263772  
 3           None -17.945173  
 ...          ...        ...  
 399    virginica -22.179815  
 400       setosa  -6.452953  
 401   versicolor  13.186332  
 402    virginica  -6.973605  

[403 rows x 8 columns]