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 |
|
アルゴリズムによって生成されるリーフ・クラスタの最大数。このアルゴリズムでは、個別のデータ・ポイントの数の方が少ない場合を除き、指定した数のクラスタが生成されます。 デフォルト値は |
|
|
k-Meansの最小収束許容値。最小収束許容値を満たすか、 収束許容値が減少すると、ソリューションはより正確になりますが、実行時間が長くなることがあります。 デフォルトの収束許容値は、 |
|
|
構築中に計算されるクラスタ詳細のレベルを決定します。
|
|
|
k-Meansの距離関数。 デフォルトの距離ファンクションは |
|
|
k-Meansの最大反復数。最大反復数に到達するか、 デフォルトの反復回数は |
|
|
クラスタのルール記述にその属性を含めるために必要な、非NULL値でなければならない属性値の最小パーセント。 データがまばらであったり多くの欠損値を含んでいる場合、最小支持度が高すぎると非常に短いルールまたは空のルールになる可能性があります。 デフォルトの最小支持度は、 |
|
|
k-Meansで生成される属性ヒストグラムでのビンの数。各属性のビン境界は、トレーニング・データセット全体でグローバルに計算されます。ビニングの方法は等幅です。ただ1つのビンを持つ、単一値が含まれる属性を除き、すべての属性は同じ数のビンを持ちます。 デフォルトのヒストグラム・ビン数は |
KMNS_RANDOM_SEED |
負でない整数 |
k-Meansの初期化中に使用されるランダム・ジェネレータのシードを制御します。これは、負でない整数である必要があります。 デフォルト値は |
|
|
k-Meansの分割基準。分割基準は、新しいk-Meansクラスタの初期化を制御します。アルゴリズムがバイナリ・ツリーを作成し、同時に新しいクラスタを1つ追加します。 分割基準がサイズに基づいている場合、新しいクラスタは現在最も大きなクラスタのある領域に置かれます。分割基準が分散値に基づいている場合、新しいクラスタは最も拡大されたクラスタの領域に置かれます。 デフォルトの分割基準は |
関連項目:
例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