K 表示结果不佳

数据挖掘 机器学习 Python 聚类 k-均值 scikit-学习
2022-02-17 13:09:25

我有几个用户名和他们的薪水。现在我需要根据他们的薪水对用户进行聚类。我正在使用 KMeans 聚类,以下是我的代码

from sklearn.cluster import KMeans
from sklearn.preprocessing import LabelEncoder
import pandas as pd

le = LabelEncoder()
data = pd.read_csv('kmeans.data',header=None, names =['user', 'salary'])

# Numerical conversion
data['user'] = le.fit_transform(data['user'])
km = KMeans(n_clusters=4, random_state= 10, n_init=10, max_iter=500)
km.fit(data)

data['labels'] = le.inverse_transform(data['user'])
data['cluster'] = km.labels_

print data

但是我的成绩很差,而且有很多重叠的薪水。

代码有什么问题吗?如何提高成绩?

或者集群在这里是否不是正确的方法?那么如何仅根据薪水对用户进行聚类呢?

 km.fit(data['salary'])

编辑:

我想出了一种使用numpy.reshape解决问题的方法

km.fit(data['salary'].reshape(-1,1))
3个回答

K-means 基于数据是“平移不变”的假设(更准确地说:方差确实如此,k-means 是方差最小化)。

换句话说,它假设 d=(xy)^2 的差异在任何地方都具有相同的重要性。因此,k-means 不适用于倾斜数据此外,由于平方,它对异常值和其他极值很敏感

对于工资和其他货币价值,这通常不成立。0美元和 1000美元之间的差异是巨大的,与100000美元到 101000美元的工资差异不同。工资通常相当倾斜,而且你经常有一些极端值。

将“用户”属性转换为数值是彻头彻尾的统计废话这个属性的方差值是多少?K-means 仅适用于连续数值数据,转换数据不会改变性质,只会改变编码 - 它仍然不合适。

这不是一个“聚类”问题,而是一个“间隔”问题,因为你只有一维。

您可以使用像Jenk 的自然中断优化这样的迭代过程来确定间隔有多大。

正如其他海报所说,不要将用户名作为聚类维度,除非您真的认为名称字母的变化在某种程度上是有意义的(您真的认为所有 Dan 的报酬都相同吗?)。

我认为这里的问题是使用名称作为维度。可以,但必须在名称(字符串)之间使用更强大的距离度量。据我所知, LabelEncoder 只是分配一个 int 考虑元素在唯一列表中的出现顺序。您可以尝试不同的散列(字符串到整数)或Levenshtein_distance作为距离度量