设想
我有一个关于欺诈检测的项目,我需要通过 kmeans 查找异常值。
我有一个关于银行信用长度为 1000 的数据集。
有 21 列(14 个分类列,7 个数字列)。
问题
我想通过聚类数据来查找异常值,我需要将所有异常值放在同一个集群中。我怎样才能用 R 实现这一点。
我的尝试
我试过了"lofactor",但是分类列给我带来了错误。
我删除了分类列,然后它起作用了。
结果
但我不应该删除分类列,因为它们对于确定异常值也很重要。
那么我怎样才能在 R 中找到异常值模式呢?
设想
我有一个关于欺诈检测的项目,我需要通过 kmeans 查找异常值。
我有一个关于银行信用长度为 1000 的数据集。
有 21 列(14 个分类列,7 个数字列)。
问题
我想通过聚类数据来查找异常值,我需要将所有异常值放在同一个集群中。我怎样才能用 R 实现这一点。
我的尝试
我试过了"lofactor",但是分类列给我带来了错误。
我删除了分类列,然后它起作用了。
结果
但我不应该删除分类列,因为它们对于确定异常值也很重要。
那么我怎样才能在 R 中找到异常值模式呢?
让我们首先看一下欺诈检测中异常值的标准定义(从Han et al. Data Mining, 2012转述):
客户生成的交易大致遵循高斯分布,例如,考虑例如一天购买一份较大的午餐,另一天购买一份较小的午餐,依此类推。异常值是一个数据对象,它与其余对象显着偏离,就好像遵循不同的分布一样。
即,当绘制一个数值变量时,那些偏离高斯分布的点是您的异常值(可以使用例如 QQ 图、标准分数或其他方法)。
进行中。
使用无监督学习,例如聚类,实际上正如 mkemp6 所注意到的那样,形成了明显不同的数据点的有效子组。然而,没有理由不将这些声明为一组异常值。
但是,在使用混合类型变量时,您会面临 3 个问题:
问题 #3 是将无监督学习方法应用于异常值检测的教科书问题,但这是你必须忍受的。
根据每个分类变量的表达式数量,您的问题或多或少是计算密集型的。如果不是专家,也没有考虑过所有这些,这里有一些想法。
此选项是聚类的一种特殊情况,您不需要正式的算法。您可以找到分类变量 ( unique(data[,your_categorical_variables])) 的所有唯一组合,如果您考虑的话,它会为您提供最大数量的可能的唯一集群。通过观察与之相关的数值变量的分布,您可以继续识别那些不适合基础(可能是高斯)分布的数据点。但是,考虑到您的数据集的大小,可能不会有太多重复,即每个分类变量的独特组合我怀疑只有很少的数据点,这将使这种方法过时。
这实际上使用了聚类。你选择一个分层的 k 原型算法。由于您几乎无法进行图形观察,因此您可以使用选项 1 中的判断来“猜测”集群,尽管对于异常值检测这可能不适合。相反,您可以使用 F 检验作为停止标准。F 检验基本上告诉您,无论是否基于集群中的偏差平方和,划分为在统计上显着优于划分为集群。聚类完成后,您继续类似于选项 1 来识别稀有分类变量组合,并查看它们的数值分布以检测异常值。
您只选择您的数字变量。您绘制分布。通过图形检查,您可以记下每个变量可能的聚类中心。您使用包中的标准 k-means 算法cluster。您将预期的聚类中心作为预期的起点传递给聚类算法。您在完整数据集(包括分类数据)上使用输出索引列表,并确定每个集群的分类变量的罕见组合。在您的情况下,我会特别调查非常小的集群。在将任何集群声明为异常值集群时,您必须做出一些假设。
k-prototypes 算法将聚类中心定义为数字和分类数据点的混合。它遵循层次聚类的标准过程:
根据结果的复杂程度,您可能还想研究遗传算法,以免在这里陷入局部最优;我相信这是一个案例,对此可能特别有意义。
这取自聚类分析,Everitt 等人,2011 年。比较是否聚类成集群优于集群集群,您可以通过以下方式计算 F 统计量:
在哪里
=簇数
=簇数
= 数据对象的数量
= 变量数
= 您划分的聚类中心的平方偏差总和集群
= 您划分的聚类中心的平方偏差总和集群
你的分工对象进入如果 F 统计量超过 F 分布的临界值,则集群明显更好和自由程度。