K-means-:在聚类时发现异常

11月4日和5日,BigML加入哈马德滨哈利法大学卡塔尔计算研究所(QCRI),将机器学习学校带到卡塔尔的多哈我们很高兴有机会与QCRI合作。

在会议期间,Sanjay Chawla博士讨论了他的异常聚类算法,k-means-我们认为使用我们的特定领域语言实现机器学习工作流程WhizzML的变体来实现它的变体是一种有趣的练习 

k均值算法的通常过程如下。它从一些数据集,一些数量的簇k和一些预期的异常值l开始它随机选取k个质心,并根据哪一个最接近,将数据集的每个点分配给这些质心中的一个。到目前为止,它就像香草k-means一样。在vanilla k-means中,您现在可以找到每个聚类的均值并将其设置为新的质心。然而,在k-means中,你首先找到l离指定质心最远的点,并从数据集中过滤它们。使用剩余点找到新的质心。通过去除这些点,我们将发现不受异常值影响的质心,因此不同(并且希望更好)质心。

我们已经在BigML(集群资源)中实现了k-means但这不是香草k-means。不是通过平均集群中的所有点来找到新的质心,而是通过对点进行采样并使用梯度下降方法来更快地实现BigML。BigML也比vanilla k-means选择更好的初始条件。我们将改编Chawla的k-means,而不是失去这些好处,在核心迭代中使用完整的BigML集群资源。

这个WhizzML脚本是我们实现的核心。

(定义(得到- 异常 DS - ID  过滤- DS  ķ  升)
  (让(集群- ID(创建- 和- 等待- 集群 { “K”  ķ
                                             “数据集”已 过滤- ds })
        batchcentroid - id(create - and - wait - batchcentroid
                            { “cluster”  cluster - id
                             “dataset”  ds - id
                             “all_fields”是 真的
                             “距离”是 真的
                             “output_dataset”  true })
        batchcentroid(获取 batchcentroid - id)
        centroid - ds(batchcentroid  “output_dataset_resource”)
        sample - id(create - and - wait - sample  centroid - ds)
        field - id(((fetch  centroid - ds)“objective_field”)“id”)
        异常(获取 样本- id { “row_order_by”(str  “ - ”  field - id)
                                    “模式”  “线性”
                                    “行”  l
                                    “index”  true }))
    (删除* [ batchcentroid - id  sample - id ])
    { “cluster-id”  cluster - id
     “centroid-ds”  centroid - ds
     “实例”((异常 “样本”)“行”)}))

让我们逐行检查。在移除我们的异常之前,让我们运行整个k-mean序列,而不是在算法的每个步骤中移除l个异常值。

cluster - id(创建- 和- 等待- 集群 { “k”  k  “数据集”  过滤- ds })

然后很容易创建一个批量质心,其中输出数据集与附加的质心之间的距离。

batchcentroid - id(create - and - wait - batchcentroid { “cluster”  cluster - id
                                                 “dataset”  ds - id
                                                 “all_fields”是 真的
                                                 “距离”是 真的
                                                 “output_dataset”
                                                   真的 })

要获得特定点,我们需要使用BigML示例资源来获取最远的点。

sample - id(create - and - wait - sample  centroid - ds)

我们现在可以找到与第l个实例关联的距离,然后过滤掉距离原始数据集的距离大于所有距离的所有点。

异常(获取 样本- id { “row_order_by”(str  “ - ”  field - id)
                            “模式”  “线性”
                            “行”  l
                            “index”  true }))

我们重复这个过程,直到质心稳定,这是通过在算法的后续迭代中通过异常值组之间的Jaccard系数的阈值来确定的,或者直到我们达到用户设置的某个最大迭代次数。

您可以在GitHub或BigML库中找到完整的代码

那么当我们运行这个脚本时会发生什么?让我们尝试红葡萄酒质量数据集。这是使用13的k(使用BigML g-means集群选择)和10的l的结果。

我们可以导出集群摘要报告,并将其与具有相同k的vanilla BigML集群进行比较正如您所期望的那样,通过去除外围点,k-均值减去两个结果时质心标准差的平均值更小:0.00128对0.00152。

我们作为异常值删除的点数怎么样?我们知道它们是否真的异常吗?当我们通过BigML异常探测器运行葡萄酒数据集时,我们可以根据隔离森林获得前十个异常。与脚本找到的十个异常值相比,我们看到共有六个实例。这是一个体面的协议,我们已经删除了真正的异常值。

我们希望您喜欢BigML如何使用研究来轻松定制ML算法的演示。


猜你喜欢

转载自blog.51cto.com/14009535/2325494