建立 K-means 叢集作業模型的範例
此範例為客戶流失資料集建立叢集作業模型。
SAMPLES.CUSTOMER_CHURN 表格包含此範例所使用的資料。在此範例中,需要有一個包含訓練資料的表格以及一個包含預測資料的表格,例如套用訓練的模型。
下列呼叫顯示如何從 SAMPLES.CUSTOMER_CHURN 表格建立這些表格:
CALL IDAX.SPLIT_DATA('intable=samples.customer_churn, traintable=customer_churn_train, testtable=customer_churn_predict, id=cust_id, fraction=0.35');
下列呼叫顯示如何建立 K-means 叢集作業模型:
CALL IDAX.KMEANS('intable=customer_churn_train, id=cust_id, k=5, maxiter=3, distance=euclidean, model=ci_km5c, outtable=ci_km5m_out');
此呼叫使用 Euclidean 函數作為距離測量。它在最多三次反覆運算中建立五個叢集。它還建立四個模型表格及一個透過 outtable 引數指定的輸出表格。此引數包含 intable 訓練資料集每一個實例的叢集成員資格的相關資訊,以及與叢集中心的距離。
下列 meta 表格是透過 model 引數指定:
<model name>_MODEL
<model name>_CLUSTERS
<model name>_COLUMNS
<model name>_COLUMN_STATISTICS
<model name>_MODEL 包含適用於整個叢集作業模型的下列資訊。
- <model name>_CLUSTERS 包含模型中的所有叢集。它也包含叢集的相關資訊,例如叢集中心、叢集大小,以及叢集成員與中心之間平方距離的總和。
- <model name >_COLUMNS 包含 K-means 叢集作業與評分作業使用的所有直欄。
- <model name>_COLUMN_STATISTICS 包含直欄統計資料資訊。
若要分析已建立的模型,您可以使用 PRINT_KMEANS 程序,如下所示:
CALL IDAX.PRINT_MODEL('model=ci_km5c, mode=clusters');
範例輸出如下所示:
Result set 1
--------------
CLUSTERID NAME SIZE RELSIZE WITHINSS DESCRIPTION
----------- ---------------- -------------------- ------------------------ ------------------------ ---------------
1 1 37 0.211428571428571 2.477881267144491E8 NULL
2 2 28 0.16 3482930.29850247 NULL
3 3 36 0.205714285714286 4.7292148007801384E7 NULL
4 4 27 0.154285714285714 2193463.04765905 NULL
5 5 47 0.268571428571429 8910472.36068028 NULL
5 record(s) selected.
Return Status = 0
若要進一步分析已建立的模型,您可以分析 ci_km5c 叢集表格,如下所示:
SELECT * FROM ci_km5c_clusters ORDER BY clusterid;
在此表格中,每一個叢集各有一列。每一個屬性也各有一個直欄,其用於與連續屬性的平均值屬性值和離散屬性的最常用值形成叢集。
還包括下列其他診斷直欄:
- clusterid
- 叢集的識別碼。
- withinss
- 指派給叢集的叢集實例與叢集中心之間的平方距離總和。
若要改善叢集說明的可讀性,您可以僅選取診斷直欄,並跳過代表叢集中心的直欄,如下所示:
SELECT clusterid, size, withinss FROM ci_km5c_clusters ORDER BY clusterid;
ci_km5m_out 成員表格為每一個訓練實例各提供一列,並包含下列直欄:
- id
- 距離 ID。
- cluster_id
- 實例指派至的叢集 ID。
- distance
- 根據叢集作業的距離測量,實例與叢集中心之間的距離。
您可以使用此資料來計算額外指標。此計算是以叢集的訓練實例指派為基礎。
例如,若要決定 censor 屬性的分佈,透過 0 和 1 來表示所取得叢集內的客戶流失,您可以使用下列查詢:
SELECT cluster_id, censor, count(*)
FROM ci_km5m_out O, customer_churn_train T
WHERE O.id=T.cust_id
GROUP BY cluster_id, censor
ORDER BY cluster_id, censor;
您可以指定較小的 k 值,因為 k=5 所取得的叢集大小並不平均。不平均表示每一個大叢集在其他叢集中擁有優勢。
下列範例顯示如何透過指定 k=2,使叢集達到更好的平衡:
CALL IDAX.KMEANS('intable=customer_churn_train, id=cust_id, k=2, maxiter=3, distance=euclidean, model=ci_km2c, outtable=ci_km2m_out');
SELECT clusterid, size, withinss FROM ci_km2c_clusters ORDER BY clusterid;
SELECT cluster_id, censor, count(*) FROM ci_km2m_out O, customer_churn_train T WHERE O.id=T.cust_id GROUP BY cluster_id, censor ORDER BY cluster_id, censor;
調整 k 值之後,叢集就會平衡。
您可以對新資料套用根據訓練集所建立的叢集作業模型,如下列範例所示。此呼叫使用為 k=5 建立的叢集作業模型,為客戶流失預測集產生叢集成員資格指派。
在評分方面,K-means 叢集作業選項,以及用於建置 K-means 模型的所有直欄及叢集的統計資料,都會儲存在 meta 表格中。此資訊用來評分及預測新叢集。
下列清單顯示 meta 表格:
- <model name>_CLUSTERS
- <model name>_COLUMNS
- <model name>_COLUMN_STATISTICS
CALL IDAX.PREDICT_KMEANS('intable=customer_churn_predict, id=cust_id, outtable=ci_km5m_predict, model=ci_km5c');
此輸出表格為指定的資料集的每一個實例各提供一列,並包含下列直欄:
ID CLUSTER_ID DISTANCE
----------- ----------- ------------------------
您可以使用輸出表格來決定 censor 屬性在預測集的已取得叢集內的分佈,如下所示:
SELECT cluster_id, censor, count(*)
FROM ci_km5m_predict O, customer_churn_predict T
WHERE O.id=T.id
GROUP BY cluster_id, censor
ORDER BY cluster_id, censor;