9.13 k-Means

oml.kmクラスはk-Means (KM)アルゴリズムを使用します。これは、指定した数のクラスタにデータをパーティション化する、距離ベースの階層クラスタリング・アルゴリズムです。

このアルゴリズムには、次の機能があります。

  • 複数の距離関数(ユークリッド、コサインおよび高速コサインの各距離関数)。デフォルトはユークリッドです。

  • クラスタごとに、アルゴリズムによって、重心、各属性のヒストグラム、およびクラスタに割り当てられるデータの大部分を囲むハイパーボックスを記述するルールが戻されます。重心は、カテゴリ属性については最頻値を、数値属性については平均および分散をレポートします。

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

k-Meansモデルの設定

次の表は、KMモデルに適用される設定のリストです。

表9-11 k-Meansモデルの設定

設定名 設定値 説明
CLUS_NUM_CLUSTERS

TO_CHAR(numeric_expr >= 1)

アルゴリズムによって生成されるリーフ・クラスタの最大数。このアルゴリズムでは、個別のデータ・ポイントの数の方が少ない場合を除き、指定した数のクラスタが生成されます。

デフォルト値は10です。

KMNS_CONV_TOLERANCE

TO_CHAR(0< numeric_expr <1)

k-Meansの最小収束許容値。最小収束許容値を満たすか、KMNS_ITERATIONSで指定された最大反復数に到達するまで、アルゴリズムは反復します。

収束許容値が減少すると、ソリューションはより正確になりますが、実行時間が長くなることがあります。

デフォルトの収束許容値は、0.001です。

KMNS_DETAILS

KMNS_DETAILS_ALL

KMNS_DETAILS_HIERARCHY

KMNS_DETAILS_NONE

構築中に計算されるクラスタ詳細のレベルを決定します。

KMNS_DETAILS_ALL: クラスタ階層、レコード数および記述統計(平均値、分散値、最頻値、ヒストグラムおよびルール)が計算されます。

KMNS_DETAILS_HIERARCHY: クラスタ階層とクラスタ・レコード数が計算されます。これはデフォルト値です。

KMNS_DETAILS_NONE: クラスタ詳細は計算されません。スコアリング情報のみが永続化されます。

KMNS_DISTANCE

KMNS_COSINE

KMNS_EUCLIDEAN

k-Meansの距離関数。

デフォルトの距離ファンクションはKMNS_EUCLIDEANです。

KMNS_ITERATIONS

TO_CHAR(positive_numeric_expr)

k-Meansの最大反復数。最大反復数に到達するか、KMNS_CONV_TOLERANCEで指定された最小収束許容値を満たすまで、アルゴリズムは反復します。

デフォルトの反復回数は20です。

KMNS_MIN_PCT_ATTR_SUPPORT

TO_CHAR(0< = numeric_expr <= 1)

クラスタのルール記述にその属性を含めるために必要な、非NULL値でなければならない属性値の最小パーセント。

データがまばらであったり多くの欠損値を含んでいる場合、最小支持度が高すぎると非常に短いルールまたは空のルールになる可能性があります。

デフォルトの最小支持度は、0.1です。

KMNS_NUM_BINS

TO_CHAR(numeric_expr > 0)

k-Meansで生成される属性ヒストグラムでのビンの数。各属性のビン境界は、トレーニング・データセット全体でグローバルに計算されます。ビニングの方法は等幅です。ただ1つのビンを持つ、単一値が含まれる属性を除き、すべての属性は同じ数のビンを持ちます。

デフォルトのヒストグラム・ビン数は11です。

KMNS_RANDOM_SEED

負でない整数

k-Meansの初期化中に使用されるランダム・ジェネレータのシードを制御します。これは、負でない整数である必要があります。

デフォルト値は0です。

KMNS_SPLIT_CRITERION

KMNS_SIZE

KMNS_VARIANCE

k-Meansの分割基準。分割基準は、新しいk-Meansクラスタの初期化を制御します。アルゴリズムがバイナリ・ツリーを作成し、同時に新しいクラスタを1つ追加します。

分割基準がサイズに基づいている場合、新しいクラスタは現在最も大きなクラスタのある領域に置かれます。分割基準が分散値に基づいている場合、新しいクラスタは最も拡大されたクラスタの領域に置かれます。

デフォルトの分割基準はKMNS_VARIANCEです。

例9-13 oml.kmクラスの使用

この例では、KMモデルを作成し、そのメソッドを使用します。この例のリストでは、省略記号で示されているように、出力の一部が表示されていません。

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]

# Specify settings.
setting = {'kmns_iterations': 20}

# Create a KM model object and fit it.
km_mod = oml.km(n_clusters = 3, **setting).fit(train_dat)

# Show model details.
km_mod

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

km_mod.transform(test_dat)

km_mod.score(test_dat)

この例のリスト

>>> 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]
>>>
>>> # Specify settings.
... setting = {'kmns_iterations': 20}
>>>
>>> # Create a KM model object and fit it.
... km_mod = omlkm(n_clusters = 3, **setting).fit(train_dat)
>>>
>>> # Show model details.
... km_mod
    
Algorithm Name: K-Means

Mining Function: CLUSTERING

Settings: 
                    setting name            setting value
0                      ALGO_NAME              ALGO_KMEANS
1              CLUS_NUM_CLUSTERS                        3
2            KMNS_CONV_TOLERANCE                     .001
3                   KMNS_DETAILS   KMNS_DETAILS_HIERARCHY
4                  KMNS_DISTANCE           KMNS_EUCLIDEAN
5                KMNS_ITERATIONS                       20
6      KMNS_MIN_PCT_ATTR_SUPPORT                       .1
7                  KMNS_NUM_BINS                       11
8               KMNS_RANDOM_SEED                        0
9           KMNS_SPLIT_CRITERION            KMNS_VARIANCE
10                  ODMS_DETAILS              ODMS_ENABLE
11  ODMS_MISSING_VALUE_TREATMENT  ODMS_MISSING_VALUE_AUTO
12                 ODMS_SAMPLING    ODMS_SAMPLING_DISABLE
13                     PREP_AUTO                       ON
 
Global Statistics: 
   attribute name  attribute value
0       CONVERGED              YES
1        NUM_ROWS            104.0


Attributes: Petal_Length
Petal_Width
Sepal_Length
Sepal_Width
Species

Partition: NO

Clusters: 

   CLUSTER_ID  ROW_CNT  PARENT_CLUSTER_ID  TREE_LEVEL  DISPERSION
0           1      104                NaN           1    0.986153
1           2       68                1.0           2    1.102147
2           3       36                1.0           2    0.767052
3           4       37                2.0           3    1.015669
4           5       31                2.0           3    1.205363

Taxonomy: 

   PARENT_CLUSTER_ID  CHILD_CLUSTER_ID
0                  1               2.0
1                  1               3.0
2                  2               4.0
3                  2               5.0
4                  3               NaN
5                  4               NaN
6                  5               NaN

Leaf Cluster Counts: 

   CLUSTER_ID  CNT
0           3   50
1           4   53
2           5   47
>>>
>>> # Use the model to make predictions on the test data.
... km_mod.predict(test_dat, ['Sepal_Length', 'Sepal_Width',
...                           'Petal_Length', 'Species']])
    Sepal_Length  Sepal_Width  Petal_Length     Species  CLUSTER_ID
0            4.9          3.0           1.4      setosa           3
1            4.9          3.1           1.5      setosa           3
2            4.8          3.4           1.6      setosa           3
3            5.8          4.0           1.2      setosa           3
...          ...          ...           ...         ...         ...
38           6.4          2.8           5.6   virginica           5
39           6.9          3.1           5.4   virginica           5
40           6.7          3.1           5.6   virginica           5
41           5.8          2.7           5.1   virginica           5
>>>
>>> km_mod.predict_proba(test_dat, 
...                      supplemental_cols = 
...                        test_dat[:, ['Species']]).sort_values(by = 
...                                      ['Species', 'PROBABILITY_OF_3']) 
       Species  PROBABILITY_OF_3  PROBABILITY_OF_4  PROBABILITY_OF_5
0       setosa          0.791267          0.208494          0.000240
1       setosa          0.971498          0.028350          0.000152 
2       setosa          0.981020          0.018499          0.000481
3       setosa          0.981907          0.017989          0.000104
...        ...               ...               ...               ...
42   virginica          0.000655          0.316671          0.682674
43   virginica          0.001036          0.413744          0.585220
44   virginica          0.001036          0.413744          0.585220
45   virginica          0.002452          0.305021          0.692527
>>>
>>> km_mod.transform(test_dat)
    CLUSTER_DISTANCE
0           1.050234
1           0.859817
2           0.321065
3           1.427080
...              ...
42          0.837757
43          0.479313
44          0.448562
45          1.123587
>>>
>>> km_mod.score(test_dat)
-47.487712