9.15 ニューラル・ネットワーク
oml.nn
クラスは、分類および回帰用のニューラル・ネットワーク(NN)モデルを作成します。
ニューラル・ネットワーク・モデルを使用すると、入力と出力との間の複雑な非リニアの関係を取得すること、つまりデータのパターンを見つけることができます。
oml.nn
クラスのメソッドは、oml.DataFrame
のデータに対して回帰用のフィードフォワード・ニューラル・ネットワークを構築します。これは、ノード数を指定可能な複数の非表示層をサポートします。各層には、複数の活性化関数のいずれかを設定できます。
出力層は、単一の数値カテゴリ・ターゲットまたはバイナリのカテゴリ・ターゲットです。出力層には、任意の活性化関数を設定できます。これには、デフォルトで線形活性化関数があります。
oml.nn
クラスを使用したモデリングは、センサー・データなどのノイズ・データおよび複合データに適しています。そのようなデータに発生する可能性のある問題は次のとおりです。
-
ピクセル値など、(数値)予測子が多い可能性がある
-
ターゲットが離散値、実数値またはそのような値のベクターである可能性がある
-
トレーニング・データに(ノイズに対して堅牢な)エラーが含まれている可能性がある
-
スコアリングが高速
-
モデルの透過性が不要なため、モデルの解釈が困難
ニューラル・ネットワーク・モデリングの一般的なステップは次のとおりです。
-
アーキテクチャの指定
-
データの準備
-
モデルの構築
-
停止条件(反復、許容範囲内の検証セットでのエラー)の指定
-
モデルの統計結果の表示
-
モデルの改善
oml.nn
クラスの属性およびメソッドの詳細は、help(oml.nn)
またはhelp(oml.hist)
を呼び出すか、Oracle Machine Learning for Python APIリファレンスを参照してください。
ニューラル・ネットワーク・モデルの設定
次の表は、NNモデルの設定のリストです。
表9-13 ニューラル・ネットワーク・モデルの設定
設定名 | 設定値 | 説明 |
---|---|---|
CLAS_COST_TABLE_NAME |
table_name |
モデルのスコアリングに使用するアルゴリズムのコスト・マトリックスを格納する表の名前。コスト・マトリックスは、分類ミスに関連するコストを指定します。 コスト・マトリックス表は、ユーザーが作成します。表の列の要件は次のとおりです。
|
CLAS_WEIGHTS_BALANCED |
|
ターゲットの分布を平均化するモデルをアルゴリズムが作成する必要があるかどうかを示します。分布の平均化では、主要なクラスを重視する全体精度ではなく、平均精度(クラスごとの精度の平均)を向上できるため、この設定は稀なターゲットが存在する場合に最適です。デフォルト値は |
|
次の文字列のリスト:
|
非表示層の活性化関数を定義します。たとえば、''' 層ごとに異なる活性化関数を用意できます。 デフォルト値は、'' 活性化関数の数は、 ノート: すべての引用符は一重引用符です。2つの一重引用符は、SQL文の一重引用符エスケープするために使用します。 |
NNET_HELDASIDE_MAX_FAIL |
正の整数 |
デフォルト値は |
NNET_HELDASIDE_RATIO |
|
除外メソッドの保持比率を定義します。 デフォルト値は |
|
負でない整数 |
非表示レイヤーの数によってトポロジを定義します。 デフォルト値は |
|
正の整数 |
ニューラル・ネットワーク・アルゴリズムにおける最大反復数を指定します。 デフォルト値は |
|
正の整数のリスト |
レイヤー当たりのノード数によってトポロジを定義します。様々なレイヤーに様々な数のノードを含めることができます。 この値は、負でない整数のカンマ区切りリストである必要があります。たとえば、'10, 20, 5'のようになります。設定値は、 |
|
|
L2正則化パラメータ・ラムダを定義します。これは、 デフォルト値は |
|
|
ニューラル・ネットワーク・アルゴリズムの正則化設定。トレーニング行の合計数が50000より大きい場合、デフォルトは |
|
|
最適化の方法を指定します。 デフォルト値は |
|
|
ニューラル・ネットワーク・アルゴリズムの収束許容値の設定を定義します。 デフォルト値は |
|
|
重みがランダムに初期化されるリージョンの下限を指定します。
NNET_WEIGHT_LOWER_BOUND とNNET_WEIGHT_UPPER_BOUND を一緒に設定する必要があります。一方を設定し、もう一方を設定しない場合、エラーが発生します。NNET_WEIGHT_LOWER_BOUND をNNET_WEIGHT_UPPER_BOUND より大きくすることはできません。デフォルト値は–sqrt(6/(l_nodes+r_nodes)) です。l_nodes の値は次のようになります。
|
|
|
重みが初期化されるリージョンの上限を指定します。 デフォルト値は |
ODMS_RANDOM_SEED |
負でない整数 |
均一な分布で乱数を生成するためにハッシュ関数で使用される乱数シードを制御します。デフォルト値は |
関連項目:
例9-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]