Verticaでは、機械学習のクラスタリングアルゴリズムとしてk-means(k平均法)を利用できます。
目次
k-meansとは
k-meansは、機械学習における教師なし学習で、クラスタリングを行う際に利用されます。k-meansの利用例は以下の通りです。
・特性に基づいた類似顧客のグルーピング
・スパム検出
・サイバーセキュリティ(不正検知等)
以降では、サンプルデータを例にVerticaでk-meansを利用する手順をご紹介します。
Verticaでk-meansを利用する手順
サンプルスキーマ、データのダウンロード
以下URLよりサンプルファイルをダウンロードします。https://github.com/vertica/Machine-Learning-Examples
画面右上にある「Clone or Download」をクリックします。
展開される画面の右下にある「Download ZIP」をクリックしてファイルを保存します。
サンプルスキーマの作成、データのロード
ダウンロードしたファイルをVerticaサーバ上の任意のディレクトリに転送します。転送後、以下コマンドでファイルを解凍します。
1 2 |
$ cd $ unzip Machine-Learning-Examples-master.zip |
解凍後に以下コマンドでサンプルスキーマとテーブルの作成、データロードを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
$ cd Machine-Learning-Examples-master/data $ /opt/vertica/bin/vsql -d <データベース名> -w <パスワード> -f load_ml_data.sql DROP TABLE DROP TABLE DROP TABLE CREATE TABLE ~途中、省略~ COMMIT CREATE TABLE CREATE TABLE 以下のようなテーブルが作成されます。 dbadmin=> \d List of tables Schema | Name | Kind | Owner | Comment --------+-------------------+-------+---------+--------- public | agar_dish | table | dbadmin | public | agar_dish_1 | table | dbadmin | public | agar_dish_2 | table | dbadmin | public | baseball | table | dbadmin | public | dem_votes | table | dbadmin | public | faithful | table | dbadmin | public | faithful_testing | table | dbadmin | public | faithful_training | table | dbadmin | public | house84 | table | dbadmin | public | house84_clean | table | dbadmin | public | house84_test | table | dbadmin | public | house84_train | table | dbadmin | public | iris | table | dbadmin | public | iris1 | table | dbadmin | public | iris2 | table | dbadmin | public | mtcars | table | dbadmin | public | mtcars_test | table | dbadmin | public | mtcars_train | table | dbadmin | public | rep_votes | table | dbadmin | public | salary_data | table | dbadmin | public | transaction_data | table | dbadmin | (21 rows) |
k-meansモデルの作成
本記事ではk-meansのサンプルデータとしてよく用いられるirisデータを使用します。irisデータには「あやめ」の3品種「setosa」、「versicolor」、「virginica」のSepal(がく片)の長さと幅、及びPetal(花びら)の長さと幅の情報が含まれています。
1 2 3 4 5 6 7 |
dbadmin=> SELECT * FROM iris WHERE id=1 OR id=51 OR id=101; id | Sepal_Length | Sepal_Width | Petal_Length | Petal_Width | Species -----+--------------+-------------+--------------+-------------+------------ 1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa 51 | 7 | 3.2 | 4.7 | 1.4 | versicolor 101 | 6.3 | 3.3 | 6 | 2.5 | virginica (3 rows) |
Sepal(がく片)の長さと幅、及びPetal(花びら)の長さと幅の情報を用いて機械学習を行い、学習データから花の品種を予測するクラスタリングを行います。
サンプルデータセットでは、すでにirisデータを分割した学習データ(iris1)とテストデータ(iris2)が用意されています。そのため、iris1テーブルを用いてk-meansによる機械学習を行います。
※k-meansはランダム要素があるため、本記事と同じようにSQLを実行しても同様の結果にならない場合があります。
k-meansによる機械学習を行うには、KMEANS関数を利用します。
1 2 3 4 5 6 7 8 |
SELECT KMEANS('myKmeansModel', 'iris1', '*', 3 USING PARAMETERS max_iterations=20, output_view='myKmeansView', key_columns='id', exclude_columns='Species, id'); KMEANS --------------------------- Finished in 4 iterations (1 row) |
【参考】パラメータの意味
パラメータ名 | 意味 |
---|---|
myKmeansModel | 任意のモデル名 |
iris1 | 学習データのテーブル名 |
* | 予測に使用する説明変数(*の場合は全ての列) |
3 | 作成したいクラスタの数、花の品種は3種類なので3を指定 |
max_iterations | (オプション) アルゴリズムが実行する最大反復回数 |
output_view | (オプション) 学習データのクラスタリング結果を保存するビュー名 |
key_columns | (オプション) output_viewオプションを利用する場合の主キーとなる列 |
exclude_columns | (オプション) 予測列を*(全列)と指定した場合に、予測列から除外する列 |
サマリを出力
作成したmyKmeansModelモデルのサマリ情報を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
dbadmin=> SELECT GET_MODEL_SUMMARY(USING PARAMETERS model_name='myKmeansModel'); GET_MODEL_SUMMARY ------------------------------------------------- ======= centers ======= sepal_length|sepal_width|petal_length|petal_width ------------+-----------+------------+----------- 5.03667 | 3.44000 | 1.45333 | 0.25333 6.72333 | 3.00667 | 5.57000 | 1.91667 5.77333 | 2.71000 | 4.19000 | 1.34333 ======= metrics ======= Evaluation metrics: Total Sum of Squares: 402.52322 Within-Cluster Sum of Squares: Cluster 0: 7.071 Cluster 1: 20.217 Cluster 2: 18.006333 Total Within-Cluster Sum of Squares: 45.294333 Between-Cluster Sum of Squares: 357.22889 Between-Cluster SS / Total SS: 88.75% Number of iterations performed: 4 Converged: True Call: kmeans('public.myKmeansModel', 'iris1', '*', 3 USING PARAMETERS exclude_columns='Species, id', max_iterations=20, epsilon=0.0001, init_method='kmeanspp', distance_method='euclidean', output_view='myKmeansView', key_columns='id') (1 row) |
作成したモデルの評価
学習データ(iris1)がどのようにクラスタリングされたかを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
dbadmin=> SELECT a.id,a.cluster_id,b.Species FROM myKmeansView AS a INNER JOIN iris1 AS b ON a.id=b.id ORDER BY cluster_id; id | cluster_id | Species -----+------------+------------ 50 | 0 | setosa 49 | 0 | setosa 44 | 0 | setosa 41 | 0 | setosa 40 | 0 | setosa 37 | 0 | setosa 36 | 0 | setosa 31 | 0 | setosa 30 | 0 | setosa 29 | 0 | setosa 28 | 0 | setosa 27 | 0 | setosa 26 | 0 | setosa 23 | 0 | setosa 20 | 0 | setosa 19 | 0 | setosa 18 | 0 | setosa 17 | 0 | setosa 16 | 0 | setosa 13 | 0 | setosa 12 | 0 | setosa 11 | 0 | setosa 9 | 0 | setosa 8 | 0 | setosa 7 | 0 | setosa 6 | 0 | setosa 4 | 0 | setosa 3 | 0 | setosa 2 | 0 | setosa 1 | 0 | setosa 150 | 1 | virginica 149 | 1 | virginica 147 | 1 | virginica 144 | 1 | virginica 140 | 1 | virginica 138 | 1 | virginica 137 | 1 | virginica 135 | 1 | virginica 132 | 1 | virginica 131 | 1 | virginica 130 | 1 | virginica 128 | 1 | virginica 126 | 1 | virginica 125 | 1 | virginica 124 | 1 | virginica 123 | 1 | virginica 121 | 1 | virginica 117 | 1 | virginica 116 | 1 | virginica 112 | 1 | virginica 111 | 1 | virginica 109 | 1 | virginica 108 | 1 | virginica 106 | 1 | virginica 105 | 1 | virginica 103 | 1 | virginica 84 | 1 | versicolor ★ 78 | 1 | versicolor ★ 77 | 1 | versicolor ★ 53 | 1 | versicolor ★ 139 | 2 | virginica ★ 122 | 2 | virginica ★ 114 | 2 | virginica ★ 100 | 2 | versicolor 99 | 2 | versicolor 98 | 2 | versicolor 95 | 2 | versicolor 94 | 2 | versicolor 93 | 2 | versicolor 92 | 2 | versicolor 88 | 2 | versicolor 86 | 2 | versicolor 85 | 2 | versicolor 83 | 2 | versicolor 81 | 2 | versicolor 80 | 2 | versicolor 79 | 2 | versicolor 76 | 2 | versicolor 74 | 2 | versicolor 72 | 2 | versicolor 70 | 2 | versicolor 69 | 2 | versicolor 68 | 2 | versicolor 67 | 2 | versicolor 61 | 2 | versicolor 60 | 2 | versicolor 58 | 2 | versicolor 56 | 2 | versicolor 55 | 2 | versicolor 52 | 2 | versicolor (90 rows) |
★のデータについては、間違ったクラスタリングを行っていますが、それ以外は期待したクラスタリングが行われていることが確認できます。今回は以下のようにクラスタリングされました。
値 | 品種 |
---|---|
0 | setosa |
1 | virginica |
2 | versicolor |
次に、学習時に利用していないテストデータ(iris2)を利用して、作成したモデルの精度を評価します。
モデルの評価はAPPLY_KMEANS関数を利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
dbadmin=> SELECT id, dbadmin-> APPLY_KMEANS(sepal_length,sepal_width,petal_length,petal_width dbadmin(> USING PARAMETERS dbadmin(> MODEL_NAME='myKmeansModel') AS cluster_id, dbadmin-> Species AS 品種 dbadmin-> FROM iris2 ORDER BY cluster_id; id | cluster_id | 品種 -----+------------+------------ 48 | 0 | setosa 47 | 0 | setosa 46 | 0 | setosa 45 | 0 | setosa 43 | 0 | setosa 42 | 0 | setosa 39 | 0 | setosa 38 | 0 | setosa 35 | 0 | setosa 34 | 0 | setosa 33 | 0 | setosa 32 | 0 | setosa 25 | 0 | setosa 24 | 0 | setosa 22 | 0 | setosa 21 | 0 | setosa 15 | 0 | setosa 14 | 0 | setosa 10 | 0 | setosa 5 | 0 | setosa 148 | 1 | virginica 146 | 1 | virginica 145 | 1 | virginica 142 | 1 | virginica 141 | 1 | virginica 136 | 1 | virginica 134 | 1 | virginica 133 | 1 | virginica 129 | 1 | virginica 119 | 1 | virginica 118 | 1 | virginica 115 | 1 | virginica 113 | 1 | virginica 110 | 1 | virginica 104 | 1 | virginica 101 | 1 | virginica 87 | 1 | versicolor ★ 51 | 1 | versicolor ★ 143 | 2 | virginica ★ 127 | 2 | virginica ★ 120 | 2 | virginica ★ 107 | 2 | virginica ★ 102 | 2 | virginica ★ 97 | 2 | versicolor 96 | 2 | versicolor 91 | 2 | versicolor 90 | 2 | versicolor 89 | 2 | versicolor 82 | 2 | versicolor 75 | 2 | versicolor 73 | 2 | versicolor 71 | 2 | versicolor 66 | 2 | versicolor 65 | 2 | versicolor 64 | 2 | versicolor 63 | 2 | versicolor 62 | 2 | versicolor 59 | 2 | versicolor 57 | 2 | versicolor 54 | 2 | versicolor (60 rows) |
★のデータについては、間違ったクラスタリングを行っていますが、それ以外は期待したクラスタリングが行われていることが確認できます。
【参考】APPLY_KMEANS関数のパラメータの意味
パラメータ名 | 意味 |
---|---|
sepal_length,sepal_width,petal_length,petal_width | 予測に使用する列(モデル作成時に指定した説明変数) |
MODEL_NAME | 予測に使用するモデル名 |
実装
作成したk-meansモデルを実装する場合も、評価時に利用したAPPLY_KMEANS関数を利用できます。
1 2 3 4 5 6 |
SELECT id, APPLY_KMEANS(sepal_length,sepal_width,petal_length,petal_width USING PARAMETERS MODEL_NAME='myKmeansModel') AS cluster_id, Species AS 品種 FROM <予測したいデータがあるテーブル> ORDER BY cluster_id; |
参考情報
Clustering Data Using k-meanshttps://my.vertica.com/docs/9.0.x/HTML/index.htm#Authoring/AnalyzingData/MachineLearning/Kmeans/ClusteringDataUsingkmeans.htm