创建 K 均值聚类模型的示例

此示例为客户流失率数据集创建聚类模型。

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 均值聚类模型:

CALL IDAX.KMEANS('intable=customer_churn_train, id=cust_id, k=5, maxiter=3, distance=euclidean, model=ci_km5c, outtable=ci_km5m_out');

此调用使用 Euclidean 函数作为距离指标。它最多通过 3 次迭代创建 5 个聚类。另外,还会创建 4 个模型表,以及 1 个通过 outtable 自变量指定的输出表。此自变量包含 intable 训练数据集中每个实例的聚类成员关系信息,以及与聚类中心的距离。

以下元表是通过 model 自变量指定:

<model name>_MODEL
<model name>_CLUSTERS
<model name>_COLUMNS
<model name>_COLUMN_STATISTICS

<model name>_MODEL 包含以下应用于整个聚类模型的信息。

  • <model name>_CLUSTERS 包含模型中的所有聚类。另外,还包含有关聚类的信息,例如,聚类中心、聚类大小以及聚类成员与中心之间距离的平方和。
  • <model name >_COLUMNS 包含 K 均值聚类和评分所使用的所有列。
  • <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
距离标识。
cluster_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 均值聚类选项以及列和聚类的统计(全部用于构建 K 均值模型)将保存在元表中。此信息用于对新聚类进行评分和预测。

以下列表显示元表:

  • <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;