gpt4 book ai didi

python - sklearn 分类数据聚类

转载 作者:行者123 更新时间:2023-12-04 01:21:12 25 4
gpt4 key购买 nike

我正在使用 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 中自定义距离函数或将我的名义数据转换为数字?

最佳答案

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

  • 使用 OneHotEncoder .您将分类特征转换为四个新列,其中只有一个 1 和另一个 0。这里的问题是“早上”和“下午”之间的区别与“早上”和“晚上”之间的区别相同。
  • 使用 OrdinalEncoder .您将分类特征转换为一列。 “早上”到1,“下午”到2等等。“早上”和“下午”之间的差异会比“早上”和“晚上”要小,这很好,但“早上”和“晚上”之间的差异会是最好的,这可能不是你想要的。
  • 使用我称之为 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. ]])

    关于python - sklearn 分类数据聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53289329/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com