9.17 特異値分解

oml.svdクラスを使用して、特徴抽出用のモデルを構築します。

oml.svdクラスは、特徴抽出に特異値分解(SVD)アルゴリズムを使用するモデルを作成します。SVDは、矩形マトリックスを3つのマトリックス(U、VおよびD)に分解することで、基礎となるデータの分散を取得する直交線形変換です。マトリックスVの列には右特異ベクトルが含まれ、マトリックスUの列には左特異ベクトルが含まれます。マトリックスDは対角マトリックスであり、その特異値は、ベースによって取得されるデータ分散の量を反映しています。

SVDS_MAX_NUM_FEATURES定数は、SVDでサポートされている特徴の最大数を指定します。この定数の値は2500です。

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

特異値分解モデルの設定

表9-15 特異値分解モデルの設定

設定名 設定値 説明
FEAT_NUM_FEATURES

TO_CHAR(numeric_expr >=1)

抽出する特徴の数。

デフォルト値は、アルゴリズムによって概算されます。マトリックスのランクがこの数よりも小さい場合、返される特徴は少なくなります。

SVDS_OVER_SAMPLING

[1, 5000]の範囲。

確率SVDソルバーで使用されるサンプリング・マトリックスの列数を構成します。このマトリックスの列数は、特徴の要求数にオーバーサンプリング設定を加えた数と同じです。TSVDS_SOLVERは、SVDS_SOLVER_SSVDまたはSVDS_SOLVER_STEIGENに設定する必要があります。

SVDS_POWER_ITERATIONS

[0, 20]の範囲。

SSVDソルバーの精度を向上させます。デフォルト値は2です。SVDS_SOLVERは、SVDS_SOLVER_SSVDまたはSVDS_SOLVER_STEIGENに設定する必要があります。

SVDS_RANDOM_SEED

[0 - 4,294,967,296]の範囲

確率SVDソルバーで使用されるサンプリング・マトリックスを初期化するためのランダム・シード値。デフォルト値は0です。SVDS_SOLVERは、SVDS_SOLVER_SSVDまたはSVDS_SOLVER_STEIGENに設定する必要があります

SVDS_SCORING_MODE

SVDS_SCORING_PCA

SVDS_SCORING_SVD

モデルでSVDスコアリングとPCAスコアリングのどちらを使用するかの指定。

ビルド・データがSVDでスコアリングされた場合、予測はUマトリックスと同じです。ビルド・データがPCAでスコアリングされた場合、予測はUマトリックスとDマトリックスの積です。

デフォルト値はSVDS_SCORING_SVDです。

SVDS_SOLVER

SVDS_SOLVER_STEIGEN

SVDS_SOLVER_SSVD

SVDS_SOLVER_TSEIGEN

SVDS_SOLVER_TSSVD

データのSVDの計算に使用されるソルバーを指定します。PCAについては、ソルバー設定は、データのPCAの計算に使用されるSVDソルバーのタイプを示します。この設定を指定しない場合、ソルバー・タイプの選択はデータ駆動で行われます。属性の数が3240を超える場合は、デフォルトのワイド・ソルバーが使用されます。そうでない場合、デフォルトのナロー・ソルバーが選択されます。

次に、ソルバーのグループを示します。

  • ナロー・データ・ソルバー: 最大で11500個の属性(TSEIGEN)または最大で8100個の属性(TSSVD)を持つマトリックス用。

  • ワイド・データ・ソルバー: 最大で100万個の属性を持つマトリックス用。

ナロー・データ・ソルバーの場合:

  • Tall-Skinny SVDでQR計算TSVD (SVDS_SOLVER_TSSVD)が使用されます

  • Tall-Skinny SVDで、ナロー・データのデフォルト・ソルバーである、固有値計算TSEIGEN (SVDS_SOLVER_TSEIGEN)が使用されます。

ワイド・データ・ソルバーの場合:

  • 確率SVDで、ワイド・データ・ソルバーのデフォルト・ソルバーである、QR計算SSVD (SVDS_SOLVER_SSVD)が使用されます。

  • 確率SVDで固有値計算STEIGEN (SVDS_SOLVER_STEIGEN)が使用されます。

SVDS_TOLERANCE

[0, 1]の範囲

プルーニング対象外の最初の固有値の共有部分として、特徴の固有値の最小値を定義します。この設定を使用して特徴をプルーニングします。デフォルト値は、データ駆動で決まります。

SVDS_U_MATRIX_OUTPUT

SVDS_U_MATRIX_ENABLE

SVDS_U_MATRIX_DISABLE

SVDによって作成されたUマトリックスを永続化するかどうかを指定します。

SVDのUマトリックスには、ビルド・データの行と同数の行があります。大規模なモデルの作成を回避するため、Uマトリックスは、SVDS_U_MATRIX_OUTPUTが有効な場合にのみ永続化されます。

SVDS_U_MATRIX_OUTPUTを有効にした場合、ビルド・データにケースIDを含める必要があります。ケースIDが存在しないときにUマトリックスが要求されると、例外が発生します。

デフォルト値はSVDS_U_MATRIX_DISABLEです。

例9-17 oml.svdクラスの使用

この例では、oml.svdクラスのメソッドの一部を使用します。この例のリストでは、省略記号で示されているように、出力の一部が表示されていません。

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_dat = dat[0]
test_dat = dat[1]

# Create an SVD model object.
svd_mod = oml.svd(ODMS_DETAILS = 'ODMS_ENABLE')

# Fit the model according to the training data and parameter
# settings.
svd_mod = svd_mod.fit(train_dat)

# Show the model details.
svd_mod

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

# Perform dimensionality reduction and return values for the two
# features that have the highest topN values.
svd_mod.transform(test_dat, 
  supplemental_cols = test_dat[:, ['Sepal_Length']], 
    topN = 2).sort_values(by = ['Sepal_Length', 
                                'TOP_1',
                                'TOP_1_VAL'])

この例のリスト

>>> 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_dat = dat[0]
>>> test_dat = dat[1]
>>>
>>> # Create an SVD model object.
... svd_mod = oml.svd(ODMS_DETAILS = 'ODMS_ENABLE')
>>>
>>> # Fit the model according to the training data and parameter
... # settings.
>>> svd_mod = svd_mod.fit(train_dat)
>>>
>>> # Show the model details.
... svd_mod

Algorithm Name: Singular Value Decomposition
 	
Mining Function: FEATURE_EXTRACTION

Settings: 
	           setting name               setting value
0                     ALGO_NAME  ALGO_SINGULAR_VALUE_DECOMP
1                  ODMS_DETAILS                 ODMS_ENABLE
2  ODMS_MISSING_VALUE_TREATMENT     ODMS_MISSING_VALUE_AUTO
3                 ODMS_SAMPLING       ODMS_SAMPLING_DISABLE
4                     PREP_AUTO                          ON
5             SVDS_SCORING_MODE            SVDS_SCORING_SVD
6          SVDS_U_MATRIX_OUTPUT       SVDS_U_MATRIX_DISABLE

Computed Settings: 
        setting name                    setting value
0  FEAT_NUM_FEATURES                                8
1        SVDS_SOLVER              SVDS_SOLVER_TSEIGEN
2     SVDS_TOLERANCE  .000000000000024646951146678475

Global Statistics: 
    attribute name  attribute value
0   NUM_COMPONENTS                8
1         NUM_ROWS              111
2 SUGGESTED_CUTOFF                1

Attributes: 
Petal_Length
Petal_Width
Sepal_Length
Sepal_Width
Species

Partition: NO

Features: 

   FEATURE_ID ATTRIBUTE_NAME ATTRIBUTE_VALUE     VALUE
0           1             ID            None  0.996297
1           1   Petal_Length            None  0.046646
2           1    Petal_Width            None  0.015917
3           1   Sepal_Length            None  0.063312
... ... ... ... ...
60           8   Sepal_Width            None -0.030620
61           8       Species          setosa  0.431543
62           8       Species      versicolor  0.566418
63           8       Species       virginica  0.699261

[64 rows x 4 columns]

D: 

   FEATURE_ID      VALUE
0           1  886.737809
1           2   32.736792
2           3   10.043389
3           4    5.270496
4           5    2.708602
5           6    1.652340
6           7    0.938640
7           8    0.452170

V: 

        '1'       '2'       '3'       '4'       '5'       '6'       '7' \
0  0.001332  0.156581 -0.317375  0.113462 -0.154414 -0.113058  0.799390
1  0.003692  0.052289  0.316295  0.733040  0.190746  0.022285 -0.046406
2  0.005267 -0.051498 -0.052111  0.527881 -0.066995  0.046461 -0.469396
3  0.015917  0.008741  0.263614  0.244811  0.460445  0.767503  0.262966
4  0.030208  0.550384 -0.358277  0.041807  0.689962 -0.261815 -0.143258
5  0.046646  0.189325  0.766663  0.326363  0.079611 -0.479070  0.177661
6  0.063312  0.790864  0.097964 -0.051230 -0.490804  0.312159 -0.131337
7  0.996297 -0.076079 -0.035940 -0.017429 -0.000960 -0.001908  0.001755
        '8'
0  0.431543
1  0.566418
2  0.699261
3  0.005000
4 -0.030620
5 -0.016932
6 -0.052185
7 -0.001415

>>> # Use the model to make predictions on the test data.
>>> svd_mod.predict(test_dat, 
                    supplemental_cols = test_dat[:, 
...                                              ['Sepal_Length', 
...                                               'Sepal_Width', 
...                                               'Petal_Length', 
...                                               'Species']])
    Sepal_Length  Sepal_Width  Petal_Length     Species  FEATURE_ID
0            5.0          3.6           1.4    setosa           2
1            5.0          3.4           1.5    setosa           2
2            4.4          2.9           1.4    setosa           8
3            4.9          3.1           1.5    setosa           2
... ... ... ... ... ...
35           6.9          3.1           5.4 virginica           1
36           5.8          2.7           5.1 virginica           1
37           6.2          3.4           5.4 virginica           5
38           5.9          3.0           5.1 virginica           1

>>> # Perform dimensionality reduction and return values for the two
... # features that have the highest topN values.
>>> svd_mod.transform(test_dat, 
...   supplemental_cols = test_dat[:, ['Sepal_Length']], 
...     topN = 2).sort_values(by = ['Sepal_Length',
...                                 'TOP_1',
...                                 'TOP_1_VAL']) 
    Sepal_Length  TOP_1  TOP_1_VAL  TOP_2  TOP_2_VAL
0            4.4      7   0.153125      3  -0.130778
1            4.4      8   0.171819      2   0.147070
2            4.8      2   0.159324      6  -0.085194
3            4.8      7   0.157187      3  -0.141668
... ... ... ... ... ...
35           7.2      6  -0.167688      1   0.142545
36           7.2      7  -0.176290      6  -0.175527
37           7.6      4   0.205779      3   0.141533
38           7.9      8  -0.253194      7  -0.166967