【问题标题】:Which algorithm to use for a clustering problem when we have numerical and categorical data?当我们有数值和分类数据时,使用哪种算法来解决聚类问题?
【发布时间】:2020-08-01 07:17:36
【问题描述】:

我对集群几乎是新手,对使用的方法有点困惑。 我有一组建筑物,我想根据它们的能耗、大小、类型和邻域对它们进行聚类。我使用了 k-means 方法,并使用了“get_dummies”方法来处理我的分类数据。

我想问一下这是否是处理分类数据的正确方法? (我还尝试将它们简单地映射到 1、2、3 等数字,并在聚类之前对其进行规范化,但没有收到合适的结果) 如果您建议另一种算法(随机森林、支持向量机或其他任何算法),如果您向我提供一个链接或网站来学习它,我将不胜感激。

另一个问题是,如果我希望我的某个特征对这个聚类产生更大的影响,那么在标准化之后将它乘以 2 然后运行聚类部分是否可以?

谢谢。

** 我所说的“get_dummies”是什么意思?

【问题讨论】:

    标签: python scikit-learn cluster-analysis k-means random-forest


    【解决方案1】:

    我觉得差不多了!使用标签编码器或 one-hot-encoding 将非数字转换为数字。

    import pandas as pd
    import numpy as np
    from sklearn.preprocessing import LabelEncoder# creating initial dataframe
    bridge_types = ('Arch','Beam','Truss','Cantilever','Tied Arch','Suspension','Cable')
    bridge_df = pd.DataFrame(bridge_types, columns=['Bridge_Types'])# creating instance of labelencoder
    labelencoder = LabelEncoder()# Assigning numerical values and storing in another column
    bridge_df['Bridge_Types_Cat'] = labelencoder.fit_transform(bridge_df['Bridge_Types'])
    bridge_df
    

    结果:

      Bridge_Types  Bridge_Types_Cat
    0         Arch                 0
    1         Beam                 1
    2        Truss                 6
    3   Cantilever                 3
    4    Tied Arch                 5
    5   Suspension                 4
    6        Cable                 2
    

    或者……

    import pandas as pd
    import numpy as np# creating initial dataframe
    bridge_types = ('Arch','Beam','Truss','Cantilever','Tied Arch','Suspension','Cable')
    bridge_df = pd.DataFrame(bridge_types, columns=['Bridge_Types'])# generate binary values using get_dummies
    dum_df = pd.get_dummies(bridge_df, columns=["Bridge_Types"], prefix=["Type_is"] )# merge with main df bridge_df on key values
    bridge_df = bridge_df.join(dum_df)
    bridge_df
    

    请记住,如果您有很多标签,那么在您将所有内容都设为数字后,您的数据将会非常稀疏。另外,是的,您可以“游戏”将功能加倍。这是基本示例。

    import numpy as np
    data = np.asarray([np.asarray(DF['Feature1']),np.asarray(DF['Feature1']),np.asarray(DF['Feature2'])])
    

    这似乎有点奇怪,我在实践中从未这样做过,但它应该会给你想要的结果。你知道什么......测试它,看看你如何相处。最后,当您有空闲时间时,请阅读下面链接上的内容。您将从该链接中学到很多东西。

    https://scikit-learn.org/stable/modules/clustering.html

    【讨论】:

    • 感谢您明确回答 ASH。对我来说仍然模糊的一点是实现这两种方法(标签编码器和假人)如何影响结果?我在很多情况下都尝试过,结果总是不同。似乎“傻瓜”为非数字变量创建了更多维度,应该赋予它们更多的决策权,这通常是不利的。但我不确定..
    • 您可以考虑先应用one-hot编码,然后应用一些降维方法(如PCA)或嵌入方法(word2Vec等)来降维,然后再将它们放入任何ML算法.或者,使用特征选择来查看哪些特征对您的因变量具有最高的统计预测能力。有关更多信息,请参阅下面的链接。 blog.yhat.com/tutorials/5-Feature-Engineering.html您不必使用所有功能,您可能不应该这样做。您必须进行不同的实验,看看哪种方法最适合您拥有的数据集。
    猜你喜欢
    • 2016-07-03
    • 2018-10-01
    • 2020-06-23
    • 1970-01-01
    • 2015-12-31
    • 2017-11-21
    • 2020-08-27
    • 2023-01-08
    • 2023-02-19
    相关资源
    最近更新 更多