测试无监督 KMeans

Posted

技术标签:

【中文标题】测试无监督 KMeans【英文标题】:Testing unsupervised KMeans 【发布时间】:2016-09-20 16:08:36 【问题描述】:

我在文本聚类中使用sklearn tutorials 来查找有关啤酒评论的任何有趣分组。到目前为止,它对我来说效果很好,但是当涉及到测试或找到正确的参数时,我尝试循环遍历不同的簇号:

for clusters in range(3, 10):
    km = KMeans(n_clusters = clusters, init="k-means++", max_iter=100, n_init=1)
    km.fit(vectorizer_fit)
    order_centroids = km.cluster_centers_.argsort()[:, ::-1]
    for i in range(clusters):
        print("Cluster %d:" %i, end="")
        for ind in order_centroids[i, :10]:
            print(" %s"%terms[ind],end=",")
        print()

它有助于清除一些明显的选择(6+ 类)开始变得奇怪,或者包含啤酒的名称:

Cluster 1: julius, th, treehouse, ego, alter, papaya, dipa, melon, canned, dankness
Cluster 7: citra, farmstead, dipa, hf, apa, passion, abner, nelson, mosaic, papaya 

然后尝试使用不同的 max/min_df:

for x in range(40):
    tfidf_vector = TfidfVectorizer(max_df = (.8-(x * .01)), min_df = .2, \
                                    stop_words = "english", use_idf = True)
    tfidf_matrix = tfidf_vector.fit_transform(documents)
    km = KMeans(5)
    km.fit(tfidf_matrix)
    order_centroids = km.cluster_centers_.argsort()[:, ::-1]

    print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
    print("With max_df @ %d% " % ()(.80 - (x*.01))*100))
    for i in range(5):
        print("cluster %d words: " % i, end = "") 
        for ind in order_centroids[i, :10]:               #top N number of words
            print("%s "% vocab.ix[ind].values, end = ",") #lookup centroid number as vocab index
    print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")

这有助于找到消除大部分停用词的优点:

With max_df @ 80%: ['the'] ,['here'] ,['a'] ,['true'] ,['roasted'] ,['imparted'] ,['some'] ,['through'] ,['beer'] ,['such']
With max_df @ 60%: ['do'] ,['coffee'] ,['is'] ,['alcohol'] ,['retention'] ,['dry'] ['with'] ,['regular'] ,['little'] ,['speedway']

假设我可以尝试同时循环遍历两者,但在某些时候阅读并做出最佳的人工判断似乎不是......计算机科学家的方式。是否有任何方法可以评估无监督方法,而无需考虑确切的业务问题?

【问题讨论】:

问题在于,在我看来,k-means 在文本上根本不能很好地工作。它对异常值不鲁棒,文本数据充满异常值。单词列表对人类来说总是很好,因为我们很擅长尝试从胡言乱语中“理解”......另见:“阅读茶叶:人类如何解释主题模型” 我刚刚有空闲时间阅读了那篇论文,现在我更好地理解了定性挖掘任务缺乏定量指标。然而这篇文章只是让我觉得 LDA 是万恶之源,而不是提出解决方案。我没有带走其他东西吗? 另一个要点可能是这很难,并且可能根本不起作用(但在查看最热门的单词时显示为“好的”) 感谢您的建议,我正在努力寻找一些有趣的项目来构建简历,因此我一定会将这些要点纳入我的结论文件中。去学习 LDA! 【参考方案1】:

我没有代码,但您可以查看此存档文件:https://arxiv.org/abs/1905.05667 及其参考文献

以及 sklearn https://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html上的 dbscan 算法的演示代码

我在寻找无监督聚类评估指标时遇到了这些

编辑:这篇文章也很有用 - https://stats.stackexchange.com/questions/79028/performance-metrics-to-evaluate-unsupervised-learning

【讨论】:

以上是关于测试无监督 KMeans的主要内容,如果未能解决你的问题,请参考以下文章

无监督学习 聚类算法代码+原理+对比分析

如何打印字符串以替换无监督学习中的标签值

无监督算法

无监督学习

机器学习-聚类KMeans

分类与监督学习,朴素贝叶斯分类算法