建立 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;