我的目标是在Python中通过一堆独特的关键词(每个词只出现在每个用户的单词列表中)来硬聚集大量独特用户。输入格式的一个例子是:
直观地说,如果我们选择2个群集,我们会期望Mark和Lisa聚集在一起(' Apple'' Peach'是2个常用关键词,而Johnny和Lisa共享no常见的话,以及Johnny和Mark只分享1;' Cat')和Johnny自己聚集。
获得更多技术,我尝试了一些方法,但我觉得我当前的解决方案不够充分。我已经将KeyWords(通过TF-IDF)矢量化并应用了一个简单的K-Means分析,它产生了看似非常有用和直观的结果。但是,我有一种潜在的感觉,即TF-IDF不相关,因为所有的词都已经定义了。我非常感谢任何人对突出问题或更好方法的见解,观察或建议。我已将示例代码放在下面:
import pandas as pd
from sklearn.feature_extraction import text
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
data = [{'User': 'Johnny', 'KeyWords': 'Dog Cat Bear'},
{'User': 'Mark', 'KeyWords': 'Cat Apple Peach'},
{'User': 'Lisa', 'KeyWords': 'Apple Peach Orange'}]
df = pd.DataFrame(data)
Optimal_k = 2
WordVectorizer = TfidfVectorizer(stop_words='english')
X = WordVectorizer.fit_transform(df['KeyWords'])
model = KMeans(n_clusters=Optimal_k, init='k-means++', max_iter=200, n_init=10)
model.fit(X)
df['Cluster'] = pd.DataFrame(model.labels_)
df
这是来自DataScience的半cross-post,我收到了一些有趣的建议。我想在这里发布更实用的分析,并以基本格式发布,其他有类似问题的人可以从中学习。我在下面提供了更多针对特定情景的信息。
特定数据集信息 - 200万观察/唯一身份用户,约3500个唯一可能的字词。 ~70%的用户只有1个KeyWord(中位数1,平均值1.5),所以我的假设只是在剩余的30%上训练模型。
分析模型 - 我已经研究过K-Means(目前看来最好,无论稳健性较低,用肘法选择K),LDA(软群集,结果没有多大意义),高斯混合(数据集太大而无法将TF-IDF矢量转换为密集)和DBSCAN(使用给定数据选择邻居距离似乎非常困难)。请注意,我仍然只了解大多数的基础知识,因此我可能会监督许多应用程序。