我有一个代表二元类别实例的数据集。特别之处在于只有正类实例,我没有负类实例。或者说,我想从负类中提取那些与正类更接近的实例。
具体来说,假设我们有从我们商店购买商品并主动申请会员卡的客户数据,撇开隐私问题(这只是一个例子),我们有不同的属性,如年龄、邮编等。
另一组客户,按照我们的例子,是那些没有申请卡的客户。
我们希望找到一部分与第一组中申请会员卡的客户最相似的人,以便向他们发送申请会员计划的优惠信息。
这并不是一个传统的分类问题,因为我们试图从“负类”中获取实例。
这也不是典型的无监督聚类,因为我们已经知道了一个聚类(会员卡客户)。
我想过使用kNN算法,但我不确定这里有哪些选择。
我还想知道,如果可能的话,如何使用Weka或其他Java库来实现这个目标,以及我是否应该对所有属性进行标准化处理。
回答:
你可以使用异常检测算法。这些算法可以告诉你新客户是否属于获得会员卡的客户群体,如果不属于,他们将被视为异常情况。
有两个基本思路(来自我下方链接的文章):
-
你可以将标记为正的客户(拥有卡的客户)的特征向量转换到一个较低维度的向量空间中(例如,使用PCA)。然后你可以计算转换后数据的概率分布,并判断一个新客户是否属于相同的统计分布。你也可以计算新客户到转换后数据中心的距离,并使用分布的标准差来决定它是否仍然足够接近。
-
机器学习方法:你可以在拥有卡的客户数据上训练一个自编码器网络。自编码器在其架构中有一个瓶颈。它将输入数据压缩成一个维度较低的新特征向量,然后尝试从这个压缩向量重建输入数据。如果训练正确,对于与拥有卡的客户数据集相似的输入数据,其重建误差应该小于不相似的输入数据(希望这些是不想要卡的客户)。
作为开始,可以查看这个教程:https://towardsdatascience.com/how-to-use-machine-learning-for-anomaly-detection-and-condition-monitoring-6742f82900d7
这两种方法都需要先对属性进行标准化处理。