【问题标题】:sklearn categorical data clusteringsklearn 分类数据聚类
【发布时间】:2023-03-24 13:24:01
【问题描述】:

我正在使用 sklearn 和凝聚聚类功能。我有一个混合数据,其中包括数字和名义数据列。我的标称列具有“早上”、“下午”、“晚上”、“晚上”等值。如果我通过分配像 0,1,2,3 这样的整数值将我的标称数据转换为数字;欧式距离将在“夜间”和“早晨”之间计算为 3,但返回值应为 1。

X = pd.read_csv("mydata.csv", sep=",", header=0, encoding="utf-8")
X = StandardScaler().fit_transform(X)
print("n_samples: %d, n_features: %d" % X.shape)

km = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='average')
km.fit(X)

print("k = %d,  Silhouette Coefficient: %0.3f" % (x,
   metrics.silhouette_score(X, km.labels_, sample_size=None)))

这是我的代码。

如何在 sklearn 中自定义距离函数或将我的标称数据转换为数字?

【问题讨论】:

  • 可以使用自带的sklearn labelencoder吗?
  • 你实际上想使用 OneHotEncoder。

标签: python scikit-learn cluster-analysis


【解决方案1】:

此问题在机器学习应用程序中很常见。您需要将一个类别定义为基本类别(不管是哪个类别),然后为每个其他类别定义指标变量(0 或 1)。换句话说,创建 3 个新变量,分别称为“Morning”、“Afternoon”和“Evening”,并为每个观测值的类别分配一个。如果是夜间观察,请将这些新变量中的每一个都保留为 0。

【讨论】:

    【解决方案2】:

    我认为您有 3 个选项可以将分类特征转换为数值:

    1. 使用OneHotEncoder。您会将分类特征转换为四个新列,其中只有一个 1 和其他 0。这里的问题是“早上”和“下午”之间的区别与“早上”和“晚上”相同。
    2. 使用OrdinalEncoder。您将分类特征转换为一列。 “早上”到 1,“下午”到 2 等等。“早上”和“下午”之间的差异会小于“早上”和“晚上”,这很好,但“早上”和“晚上”之间的差异会做到最好,但可能不是你想要的。
    3. 使用我称之为 two_hot_encoder 的转换。它类似于 OneHotEncoder,行中只有两个 1。 “早上”和“下午”之间的差异将与“早上”和“晚上”之间的差异相同,并且小于“早上”和“晚上”之间的差异。我认为这是最好的解决方案。检查代码。

    代码:

    def two_hot(x):
        return np.concatenate([
            (x == "morning") | (x == "afternoon"),
            (x == "afternoon") | (x == "evening"),
            (x == "evening") | (x == "night"),
            (x == "night") | (x == "morning"),
        ], axis=1).astype(int)
    
    x = np.array([["morning", "afternoon", "evening", "night"]]).T
    print(x)
    x = two_hot(x)
    print(x)
    

    输出:

    [['morning']
     ['afternoon']
     ['evening']
     ['night']]
    [[1 0 0 1]
     [1 1 0 0]
     [0 1 1 0]
     [0 0 1 1]]
    

    然后我们可以测量距离:

    from sklearn.metrics.pairwise import euclidean_distances
    euclidean_distances(x)
    

    输出:

    array([[0.        , 1.41421356, 2.        , 1.41421356],
           [1.41421356, 0.        , 1.41421356, 2.        ],
           [2.        , 1.41421356, 0.        , 1.41421356],
           [1.41421356, 2.        , 1.41421356, 0.        ]])
    

    【讨论】:

    • 例如,虽然按时间顺序,早上应该比晚上更接近下午,但在数据中定性可能没有理由假设是这种情况。一种热编码留给机器计算哪些类别最相似。我喜欢您的两种热门编码方法背后的想法,但它可能会将自己的假设强加于数据。
    • 你说得对,这取决于任务。对于某些任务,最好以不同的方式考虑每一天。但是“一个热编码让机器来计算哪些类别最相似”的说法对于聚类来说是不正确的。聚类根据样本的距离计算聚类,这是基于特征的。所以我们应该设计特征到相似的例子应该有短距离的特征向量。
    猜你喜欢
    • 2023-03-12
    • 2016-07-29
    • 2017-07-23
    • 2017-12-03
    • 2020-12-28
    • 2017-03-31
    • 2018-04-29
    • 2020-02-28
    • 2020-04-14
    相关资源
    最近更新 更多