9.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モデルの設定のリストです。

表9-16 サポート・ベクター・マシンの設定

設定名 設定値 説明
CLAS_COST_TABLE_NAME

table_name

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

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

  • 列名: ACTUAL_TARGET_VALUE

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

  • 列名: PREDICTED_TARGET_VALUE

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

  • 列名: COST

    データ型: NUMBER

CLAS_WEIGHTS_BALANCED

ON

OFF

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

CLAS_WEIGHTS_TABLE_NAME

table_name

GLMロジスティック回帰モデルの個々のターゲット値の重み付け情報を格納する表の名前。アルゴリズムでは、重みを使用して、より高い重み付けのクラスを優先するようにモデルにバイアスをかけます。

クラスの重み表は、ユーザーが作成します。表の列の要件は次のとおりです。

  • 列名: TARGET_VALUE

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

  • 列名: CLASS_WEIGHT

    データ型: NUMBER

SVMS_BATCH_ROWS

正の整数

SGDソルバーのバッチのサイズを設定します。この設定は、線形カーネルを使用するSVMモデルに適用されます。0を入力すると、データ駆動のバッチ・サイズの推定値がトリガーされます。デフォルト値は20000です。

SVMS_COMPLEXITY_FACTOR

TO_CHAR(numeric_expr >0)

新しいデータに対して優れた一般化を実現するための、モデルの堅牢性に対するモデルの複雑性のバランスをとる正則化設定。SVMでは、データ駆動の手法を使用して複雑性要素が検出される。

SVMアルゴリズム(分類と回帰の両方)の複雑度の値。

デフォルト値は、アルゴリズムによってデータから概算されます。

SVMS_CONV_TOLERANCE

TO_CHAR(numeric_expr >0)

SVMアルゴリズムでの収束許容値。

デフォルトは0.0001です。

SVMS_EPSILON

TO_CHAR(numeric_expr >0)

回帰用の正則化設定(複雑性要素と似ている)。イプシロンによって、データ内で許容される残差(ノイズ)が指定される。

SVM回帰のイプシロン係数の値。

デフォルトは0.1です。

SVMS_KERNEL_FUNCTION

SVMS_GAUSSIAN

SVMS_LINEAR

サポート・ベクター・マシンのカーネル。線形またはガウス。

デフォルト値はSVMS_LINEARです。

SVMS_NUM_ITERATIONS

正の整数

SVM反復数の上限を設定します。これはSVMソルバーに依存するため、デフォルトはシステムによって決定されます。

SVMS_NUM_PIVOTS

[1; 10000]の範囲

不完全コレスキー分解で使用されるピボット数の上限を設定します。これは、非線形カーネルにのみ設定できます。デフォルト値は200です。

SVMS_OUTLIER_RATE

TO_CHAR(0< numeric_expr <1)

トレーニング・データでの目標となる外れ値率。1クラスSVMモデル(異常検出)に対してのみ有効です。

デフォルト値は0.01です。

SVMS_REGULARIZER

SVMS_REGULARIZER_L1

SVMS_REGULARIZER_L2

SGD SVMソルバーで使用される正則化のタイプを制御します。この設定は、線形SVMモデルにのみ適用されます。これは潜在的なモデル・サイズに依存するため、デフォルト値はシステムによって決定されます。

SVMS_SOLVER

SVMS_SOLVER_SGD (劣勾配降下)

SVMS_SOLVER_IPM (内点法)

SVMソルバーの選択をユーザーに許可します。カーネルが非線形である場合、SGDソルバーは選択できません。デフォルト値は、システムによって決定されます。

SVMS_STD_DEV

TO_CHAR(numeric_expr >0)

ガウス・カーネル関数の分布を制御する。SVMでは、データ駆動の手法が使用され、通常のケース間の距離と同じスケールにある標準偏差値が検出される。

SVMアルゴリズムの標準偏差の値。

これは、ガウス・カーネルにのみ適用されます。

デフォルト値は、アルゴリズムによってデータから概算されます。

例9-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