【问题标题】:How to deal with categorical data in K-means clustering method when we have mixed data?当我们有混合数据时,如何处理 K-means 聚类方法中的分类数据?
【发布时间】:2020-08-27 09:47:04
【问题描述】:

我正在使用 k-means 方法根据建筑物的能耗、面积(平方米)和所在位置的气候区对一些建筑物进行聚类。气候带是一个分类变量。值可以是 A、B、C 或 D。应将其转换为数字值,因此有两种选择。首先是 LabelEncoder,其次是 get_dummies。当我使用其中的每一个时,结果完全不同。请问用哪种方法比较正确?

我猜是因为“get_dummies”为每个分类变量创建了更多维度,应该赋予分类变量更多的决策权,这通常是不利的。另一方面,似乎使用 LabelEncoder 也不完全正确。因为我们可以说 "A=1, B=2, C=3, D=4" 或 "A=3, B=2, C=4, D=1" 或许多其他选项。即使结果无动于衷,这也可能会改变结果。所以我不确定哪个更好用。

感谢任何统计或数学解释。

谢谢

**get_dummies 是什么意思?

【问题讨论】:

    标签: python scikit-learn cluster-analysis k-means categorical-data


    【解决方案1】:

    如果类别的逻辑顺序(即Color Red比To Category Green)更类似于Green),您可以将加权值应用于类别。但这是一个典型的“假”类别特征(因为它可以在数字特征的向量中分解,您所示的方式)。

    如果问题与真实的分类特征有关,则每个类别之间的距离相同。您可以根据该类别的逻辑重要性(权重)为任何类别特征设置固定距离以进行聚类。

    如果您的所有功能都是分类的或混合,请看看k-mode or k-prototype算法。

    【讨论】:

      【解决方案2】:

      由于各种原因,标准 k-means 算法并不直接适用于分类数据。分类数据的样本空间是离散的,并且没有自然来源。在这样一个空间上的欧几里得或曼哈顿距离函数并没有真正的意义。红色、黄色、橙色、蓝色和绿色之间的“距离”是多少?您可能需要考虑使用一种称为“余弦相似度”的技术。余弦相似度是一种度量标准,用于衡量多个文本字符串甚至整个文档的相似程度,与它们的大小无关。在数学上,它测量投影在多维空间中的两个向量之间夹角的余弦值。余弦相似度是有利的,因为即使两个相似的文档相距很远欧几里得距离(由于文档的大小),它们仍然可能更靠近在一起。角度越小,余弦相似度越高。

      这里有几个链接可以帮助你。

      https://www.machinelearningplus.com/nlp/cosine-similarity/

      https://sites.temple.edu/tudsc/2017/03/30/measuring-similarity-between-texts-in-python/

      【讨论】:

        【解决方案3】:

        我将在这里添加另一个答案。我认为我的第一个答案非常正确。不过,我确实找到了一种使用 K-means 对文本进行聚类的方法,所以我将在这里分享,因为我正在寻找有关这种技术“正确性”的反馈。

        from sklearn.feature_extraction.text import TfidfVectorizer
        from sklearn.cluster import KMeans
        from sklearn.metrics import adjusted_rand_score
        
        documents = ["This little kitty came to play when I was eating at a restaurant.",
                     "Merley has the best squooshy kitten belly.",
                     "Google Translate app is incredible.",
                     "If you open 100 tab in google you get a smiley face.",
                     "Best cat photo I've ever taken.",
                     "Climbing ninja cat.",
                     "Impressed with google map feedback.",
                     "Key promoter extension for Google Chrome."]
        
        vectorizer = TfidfVectorizer(stop_words='english')
        X = vectorizer.fit_transform(documents)
        
        true_k = 8
        model = KMeans(n_clusters=true_k, init='k-means++', max_iter=1000, n_init=1)
        model.fit(X)
        
        print("Top terms per cluster:")
        order_centroids = model.cluster_centers_.argsort()[:, ::-1]
        terms = vectorizer.get_feature_names()
        for i in range(true_k):
            print("Cluster %d:" % i),
            for ind in order_centroids[i, :10]:
                print(' %s' % terms[ind]),
            print
        
        print("\n")
        print("Prediction")
        
        Y = vectorizer.transform(["chrome browser to open."])
        prediction = model.predict(Y)
        print(prediction)
        
        Y = vectorizer.transform(["My cat is hungry."])
        prediction = model.predict(Y)
        print(prediction)
        

        结果:

        Top terms per cluster:
        Cluster 0:
         eating
         kitty
         little
         came
         restaurant
         play
         ve
         feedback
         face
         extension
        Cluster 1:
         translate
         app
         incredible
         google
         eating
         impressed
         feedback
         face
         extension
         ve
        Cluster 2:
         climbing
         ninja
         cat
         eating
         impressed
         google
         feedback
         face
         extension
         ve
        Cluster 3:
         kitten
         belly
         squooshy
         merley
         best
         eating
         google
         feedback
         face
         extension
        Cluster 4:
         100
         open
         tab
         smiley
         face
         google
         feedback
         extension
         eating
         climbing
        Cluster 5:
         chrome
         extension
         promoter
         key
         google
         eating
         impressed
         feedback
         face
         ve
        Cluster 6:
         impressed
         map
         feedback
         google
         ve
         eating
         face
         extension
         climbing
         key
        Cluster 7:
         ve
         taken
         photo
         best
         cat
         eating
         google
         feedback
         face
         extension
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-04
          • 2013-02-07
          • 2014-01-04
          • 2019-12-27
          • 1970-01-01
          • 1970-01-01
          • 2017-04-27
          • 1970-01-01
          相关资源
          最近更新 更多