8.18 サポート・ベクター・マシン
oml.svm
クラスは、分類、回帰または異常検出用のサポート・ベクター・マシン(SVM)モデルを作成します。
SVMは、Vapnik-Chervonenkis理論に基づいた強固な理論的基礎を持つ最新の強力なアルゴリズムです。SVMは、強力な正則化プロパティを持ちます。正則化とは、新しいデータへのモデルの一般化を指します。
SVMモデルは、一般的な機械学習手法であるニューラル・ネットワークおよび動径基底関数に似た関数形式を持ちます。
SVMは、次のような問題の解決に使用できます。
-
分類: SVM分類は、決定境界を定義する決定面の概念に基づいています。決定面は、異なるクラスのメンバーシップを持つオブジェクト・セットを区別するものです。SVMは、クラスの最も広範な区切りを与えるセパレータを定義するベクター(サポート・ベクター)を検出します。
SVM分類では、2項および多クラスの両ターゲットがサポートされます。
-
回帰: SVMでは、回帰問題を解決するために、イプシロン非感受性損失関数が使用されます。
SVM回帰では、データ・ポイントの最大数がイプシロン幅の非感受性チューブ内に収まるような連続関数の検出が試行されます。真のターゲット値のイプシロン距離内におさまる予測は、誤差として解釈されません。
-
異常検出: 異常検出は、一見同質なデータ内に存在する特異なケースを識別します。異常検出は、重大な意味を持ちながら検出することが難しい、不正行為、ネットワークへの侵入などの発生頻度の低いイベントを検出するための重要なツールです。
異常検出は、1クラスSVM分類として実装されます。異常検出モデルでは、あるデータ・ポイントが特定の分布に対して典型的かどうかを予測します。
oml.svm
クラスは、これらの3つの異なるタイプのモデルをそれぞれ構築します。一部、分類モデルにのみ適用される引数、回帰モデルにのみ適用される引数、異常検出モデルにのみ適用される引数があります。
oml.svm
クラスの属性およびメソッドの詳細は、help(oml.svm)
を呼び出すか、Oracle Machine Learning for Python APIリファレンスを参照してください。
サポート・ベクター・マシン・モデルの設定
次の表は、SVMモデルの設定のリストです。
表8-16 サポート・ベクター・マシンの設定
設定名 | 設定値 | 説明 |
---|---|---|
CLAS_COST_TABLE_NAME |
table_name |
モデルのスコアリングに使用するアルゴリズムのコスト・マトリックスを格納する表の名前。コスト・マトリックスは、分類ミスに関連するコストを指定します。 コスト・マトリックス表は、ユーザーが作成します。表の列の要件は次のとおりです。
|
CLAS_WEIGHTS_BALANCED |
|
ターゲットの分布を平均化するモデルをアルゴリズムが作成する必要があるかどうかを示します。分布の平均化では、主要なクラスを重視する全体精度ではなく、平均精度(クラスごとの精度の平均)を向上できるため、この設定は稀なターゲットが存在する場合に最適です。デフォルト値は |
CLAS_WEIGHTS_TABLE_NAME |
table_name |
GLMロジスティック回帰モデルの個々のターゲット値の重み付け情報を格納する表の名前。アルゴリズムでは、重みを使用して、より高い重み付けのクラスを優先するようにモデルにバイアスをかけます。 クラスの重み表は、ユーザーが作成します。表の列の要件は次のとおりです。
|
|
正の整数 |
SGDソルバーのバッチのサイズを設定します。この設定は、線形カーネルを使用するSVMモデルに適用されます。0を入力すると、データ駆動のバッチ・サイズの推定値がトリガーされます。デフォルト値は |
|
|
新しいデータに対して優れた一般化を実現するための、モデルの堅牢性に対するモデルの複雑性のバランスをとる正則化設定。SVMでは、データ駆動の手法を使用して複雑性要素が検出される。 SVMアルゴリズム(分類と回帰の両方)の複雑度の値。 デフォルト値は、アルゴリズムによってデータから概算されます。 |
|
|
SVMアルゴリズムでの収束許容値。 デフォルトは |
|
|
回帰用の正則化設定(複雑性要素と似ている)。イプシロンによって、データ内で許容される残差(ノイズ)が指定される。 SVM回帰のイプシロン係数の値。 デフォルトは |
|
|
サポート・ベクター・マシンのカーネル。線形またはガウス。 デフォルト値はSVMS_LINEAR です。
|
|
正の整数 |
SVM反復数の上限を設定します。これはSVMソルバーに依存するため、デフォルトはシステムによって決定されます。 |
|
[ |
不完全コレスキー分解で使用されるピボット数の上限を設定します。これは、非線形カーネルにのみ設定できます。デフォルト値は |
|
|
トレーニング・データでの目標となる外れ値率。1クラスSVMモデル(異常検出)に対してのみ有効です。 デフォルト値は |
|
|
SGD SVMソルバーで使用される正則化のタイプを制御します。この設定は、線形SVMモデルにのみ適用されます。これは潜在的なモデル・サイズに依存するため、デフォルト値はシステムによって決定されます。 |
|
|
SVMソルバーの選択をユーザーに許可します。カーネルが非線形である場合、SGDソルバーは選択できません。デフォルト値は、システムによって決定されます。 |
|
|
ガウス・カーネル関数の分布を制御する。SVMでは、データ駆動の手法が使用され、通常のケース間の距離と同じスケールにある標準偏差値が検出される。 SVMアルゴリズムの標準偏差の値。 これは、ガウス・カーネルにのみ適用されます。 デフォルト値は、アルゴリズムによってデータから概算されます。 |
関連項目:
例8-18 oml.svmクラスの使用方法
この例では、oml.svm
クラスの様々なメソッドの使用方法を示します。この例のリストでは、省略記号で示されているように、出力の一部が表示されていません。
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 an SVM model object.
svm_mod = oml.svm('classification',
svms_kernel_function =
'dbms_data_mining.svms_linear')
# Fit the SVM Model according to the training data and parameter
# settings.
svm_mod.fit(train_x, train_y)
# Use the model to make predictions on test data.
svm_mod.predict(test_dat.drop('Species'),
supplemental_cols = test_dat[:, ['Sepal_Length',
'Sepal_Width',
'Petal_Length',
'Species']])
# Return the prediction probability.
svm_mod.predict(test_dat.drop('Species'),
supplemental_cols = test_dat[:, ['Sepal_Length',
'Sepal_Width',
'Species']],
proba = True)
svm_mod.predict_proba(test_dat.drop('Species'),
supplemental_cols = test_dat[:, ['Sepal_Length',
'Sepal_Width',
'Species']],
topN = 1).sort_values(by = ['Sepal_Length', 'Sepal_Width'])
svm_mod.score(test_dat.drop('Species'), test_dat[:, ['Species']])
この例のリスト
>>> 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 an SVM model object.
... svm_mod = oml.svm('classification',
... svms_kernel_function =
... 'dbms_data_mining.svms_linear')
>>>
>>> # Fit the SVM model according to the training data and parameter
... # settings.
>>> svm_mod.fit(train_x, train_y)
Algorithm Name: Support Vector Machine
Mining Function: CLASSIFICATION
Target: Species
Settings:
setting name setting value
0 ALGO_NAME ALGO_SUPPORT_VECTOR_MACHINES
1 CLAS_WEIGHTS_BALANCED OFF
2 ODMS_DETAILS ODMS_ENABLE
3 ODMS_MISSING_VALUE_TREATMENT ODMS_MISSING_VALUE_AUTO
4 ODMS_SAMPLING ODMS_SAMPLING_DISABLE
5 PREP_AUTO ON
6 SVMS_CONV_TOLERANCE .0001
7 SVMS_KERNEL_FUNCTION SVMS_LINEAR
Computed Settings:
setting name setting value
0 SVMS_COMPLEXITY_FACTOR 10
1 SVMS_NUM_ITERATIONS 30
2 SVMS_SOLVER SVMS_SOLVER_IPM
Global Statistics:
attribute name attribute value
0 CONVERGED YES
1 ITERATIONS 14
2 NUM_ROWS 104
Attributes:
Petal_Length
Petal_Width
Sepal_Length
Sepal_Width
Partition: NO
COEFFICIENTS:
TARGET_VALUE ATTRIBUTE_NAME ATTRIBUTE_SUBNAME ATTRIBUTE_VALUE COEF
0 setosa Petal_Length None None -0.5809
1 setosa Petal_Width None None -0.7736
2 setosa Sepal_Length None None -0.1653
3 setosa Sepal_Width None None 0.5689
4 setosa None None None -0.7355
5 versicolor Petal_Length None None 1.1304
6 versicolor Petal_Width None None -0.3323
7 versicolor Sepal_Length None None -0.8877
8 versicolor Sepal_Width None None -1.2582
9 versicolor None None None -0.9091
10 virginica Petal_Length None None 4.6042
11 virginica Petal_Width None None 4.0681
12 virginica Sepal_Length None None -0.7985
13 virginica Sepal_Width None None -0.4328
14 virginica None None None -5.3180
>>> # Use the model to make predictions on test data.
... svm_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
>>> # Return the prediction probability.
... svm_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 0.761886
1 4.9 3.1 setosa setosa 0.805510
2 4.8 3.4 setosa setosa 0.920317
3 5.8 4.0 setosa setosa 0.998398
... ... ... ... ... ...
44 6.7 3.3 virginica virginica 0.927706
45 6.7 3.0 virginica virginica 0.855353
46 6.5 3.0 virginica virginica 0.799556
47 5.9 3.0 virginica virginica 0.688024
>>> # Make predictions and return the probability for each class
... # on new data.
>>> svm_mod.predict_proba(test_dat.drop('Species'),
... supplemental_cols = test_dat[:, ['Sepal_Length',
... 'Sepal_Width',
... 'Species']],
... topN = 1).sort_values(by = ['Sepal_Length', 'Sepal_Width'])
Sepal_Length Sepal_Width Species TOP_1 TOP_1_VAL
0 4.4 3.0 setosa setosa 0.698067
1 4.4 3.2 setosa setosa 0.815643
2 4.5 2.3 setosa versicolor 0.605105
3 4.8 3.4 setosa setosa 0.920317
... ... ... ... ... ...
44 6.7 3.3 virginica virginica 0.927706
45 6.9 3.1 versicolor versicolor 0.378391
46 6.9 3.1 virginica virginica 0.881118
47 7.0 3.2 versicolor setosa 0.586393
>>> svm_mod.score(test_dat.drop('Species'), test_dat[:, ['Species']])
0.895833