做了个草图,如data1和2的feature1到5相同,data1和5的feature1,2,5相同,根据所有data特征的相似程度聚类,希望通过聚类找到实际业务中需要解决的那一类数据(从单条数据难以定位出来,所以考虑聚类能否解决问题)。且实际需要解决的数据量较大,特征也比较复杂,多为字元串或列表(特征数量在几十个,特征大部分无需考虑语义,只需考虑两条数据的特征是否相同即可)。

想请各位指点的问题1.此类问题(数据量较大)是否应以聚类解决,以何种演算法比较合适;2.对于字元串列表等特征应如何处理然后用于演算法

小白初次提问,希望各位大佬多多指教,如果认为问题描述不够清楚,我也会及时补充


不考虑特征语义的情况下(字元串和列表都可以看成是类别),把所有的类别特征onehot编码,然后降维聚类。这种方法的缺点是,如果特征的类别取值太多,onehot编码后的特征维度会爆炸,降维之后也会丢失大量的信息。

还有就是word2vector,这种编码方法适合具有序列特性的信息,在不考虑文本序列和语义特性的情况下,使用这种方法会引入不必要的信息。

我觉得可以计算样本两两之间的距离,假设数据如图

两个样本之间的相同特征只比较是否相同。比如,两样本的特征f1,不同计为0,f2特征相同计为1,....,最终相似度为0+1+0+1=2(也可以考虑根据特征重要性考虑加权),最终生成一个相似度矩阵;共计(n*(n-1))/2次相似度计算,每次相似度计算是k个特征的比较运算和比较结果求和,这个复杂度不知道是否能够扛得住。

聚类演算法就那么几样,具体特性和适用性可以看scikit-learn文档:

2.3. Clustering - scikit-learn 0.23.1 documentation?

scikit-learn.org

再有就是根据这句话「实际业务中需要解决的那一类数据」,这可以处理成是一个「0-1分类」问题,你可以通过先标注一定量的数据进行建模,然后对于不准确数据进行补充标注,优化模型。推荐演算法lightgbm和catboost,两种演算法对于类别变数有特殊的处理方式,并且计算速度快。这种方法的工作量在于标注数据。


问题说得太隐晦了,这有点难说。

第一个问题:「实际业务中需要解决的那一类数据「这个你已经有明确定义了么,有的话为什么不直接做二分类就好,如果没有才需要走到聚类的路上来。

第二个问题:特征有多少维,维度对聚类的效果影响有点大,这个决定了是否要做些处理。

第三个问题:字元串或列表的特征有很多的处理思路,比如说编辑距离等传统的思路,也有基于w2v的embedding思路,但这个取决于字元串的长度以及是否有语义,列表也是一样。这个度量有两个问题,一个是各个特征的相似度度量结果是否可以横向对比,一个是是不是要两两遍历导致较高的复杂度。

这些问题都思考清楚了,然后才是演算法的选型之类的。


我会先主成分分析,后聚类。或者基于行业知识,排除一些无意义,对类标签无影响的特征。


如果是这种数据形式的话,可以试试embedding,faiss查相似度

至于embedding的方法,可以根据预训练模型,word2vec啥的

仅供参考


如果你发现特征不足以聚类,那说明特征选的不合适,要么降维要么升维,换一个空间来观测。


个人建议,数据量较大的情况下先明白数据大致的分布,随机抽样一部分小数据集,用散点图看一下大致情况,然后用机器学习模型如kmeans进行聚类,聚类前检测一下异常值并排除出数据集以降低异常值的干扰


数据量大,维度多,就不要聚类了。不妨对高纬度数据进行编码,比如simhash,最后来个排序就行了。


有几个问题需要思考吧

第一是各个特征的权重问题,是均匀考虑还是有所侧重

第二是相似度的度量方式,是相同为1,不相同为0还是考虑一些比较软的方式

第三是要不要把特征映射到低维空间去考量,会降低计算量并使结果更为直观,毕竟高维空间难理解但是一张图上比较比较还是容易的

因为聚类毕竟不是监督学习,如果效果不好,调整的方法也不多


推荐阅读:
相关文章