使用DBSCAN标识为员工分组
照片由Ishan @seefromthesky 在 Unsplash拍摄
基于密度的噪声应用空间聚类(DBSCAN)是一种无监督的ML聚类算法。无监督的意思是它不使用预先标记的目标来聚类数据点。聚类是指试图将相似的数据点分组到人工确定的组或簇中。它可以替代KMeans和层次聚类等流行的聚类算法。
在我们的示例中,我们将检查一个包含15,000名员工的人力资源数据集。数据集包含员工的工作特征,如工作满意度、绩效评分、工作量、任职年限、事故、升职次数。
KMeans vs DBSCAN
KMeans尤其容易受到异常值的影响。当算法遍历质心时,在达到稳定性和收敛性之前,离群值对质心的移动方式有显著的影响。此外,KMeans在集群大小和密度不同的情况下还存在数据精确聚类的问题。K-Means只能应用球形簇,如果数据不是球形的,它的准确性就会受到影响。最后,KMeans要求我们首先选择希望找到的集群的数量。下面是KMeans和DBSCAN如何聚类同一个数据集的示例。
另一方面,DBSCAN不要求我们指定集群的数量,避免了异常值,并且在任意形状和大小的集群中工作得非常好。它没有质心,聚类簇是通过将相邻的点连接在一起的过程形成的。
DBSCAN是如何实现的呢?
首先,让我们定义Epsilon和最小点、应用DBSCAN算法时需要的两个参数以及一些额外的参数。
- Epsilon (ɛ):社区的最大半径。如果数据点的相互距离小于或等于指定的epsilon,那么它们将是同一类的。换句话说,它是DBSCAN用来确定两个点是否相似和属于同一类的距离。更大的epsilon将产生更大的簇(包含更多的数据点),更小的epsilon将构建更小的簇。一般来说,我们喜欢较小的值是因为我们只需要很小一部分的数据点在彼此之间的距离内。但是如果太小,您会将集群分割的越来越小。
- 最小点(minPts):在一个邻域的半径内minPts数的邻域被认为是一个簇。请记住,初始点包含在minPts中。一个较低的minPts帮助算法建立更多的集群与更多的噪声或离群值。较高的minPts将确保更健壮的集群,但如果集群太大,较小的集群将被合并到较大的集群中。
如果“最小点”= 4,则在彼此距离内的任意4个或4个以上的点都被认为是一个簇。
其他参数
核心点:核心数据点在其近邻距离内至少有的最小的数据点个数。
我一直认为DBSCAN需要一个名为“core_min”的第三个参数,它将确定一个邻域点簇被认为是聚类簇之前的最小核心点数量。
边界点:边界数据点位于郊区,就像它们属于近邻点一样。(比如w/在epsilon距离内的核心点),但需要小于minPts。
离群点:这些点不是近邻点,也不是边界点。这些点位于低密度地区。
首先,选择一个在其半径内至少有minPts的随机点。然后对核心点的邻域内的每个点进行评估,以确定它是否在epsilon距离内有minPts (minPts包括点本身)。如果该点满足minPts标准,它将成为另一个核心点,集群将扩展。如果一个点不满足minPts标准,它成为边界点。随着过程的继续,算法开始发展成为核心点“a”是“b”的邻居,而“b”又是“c”的邻居,以此类推。当集群被边界点包围时,这个聚类簇已经搜索完全,因为在距离内没有更多的点。选择一个新的随机点,并重复该过程以识别下一个簇。
如何确定最优的Epsilon值
估计最优值的一种方法是使用k近邻算法。如果您还记得的话,这是一种有监督的ML聚类算法,它根据新数据点与其他“已知”数据点的距离来聚类。我们在带标记的训练数据上训练一个KNN模型,以确定哪些数据点属于哪个聚类。当我们将模型应用到新数据时,算法根据与训练过的聚类的距离来确定新数据点属于哪一个聚类。我们必须确定“k”参数,它指定在将新数据点分配给一个集群之前,模型将考虑多少个最邻近点。
为了确定最佳的epsilon值,我们计算每个点与其最近/最近邻居之间的平均距离。然后我们绘制一个k距离,并选择在图的“肘部”处的epsilon值。在y轴上,我们绘制平均距离,在x轴上绘制数据集中的所有数据点。
如果选取的epsilon太小,很大一部分数据将不会被聚类,而一个大的epsilon值将导致聚类簇被合并,大部分数据点将会在同一个簇中。一般来说,较小的值比较合适,并且作为一个经验法则,只有一小部分的点应该在这个距离内。
如何确定最佳minPts
通常,我们应该将minPts设置为大于或等于数据集的维数。也就是说,我们经常看到人们用特征的维度数乘以2来确定它们的minPts值。
就像用来确定最佳的epsilon值的“肘部方法”一样,minPts的这种确定方法并不是100%正确的。
DBSCAN聚类的评价方式
影像法:该技术测量集群之间的可分离性。首先,找出每个点与集群中所有其他点之间的平均距离。然后测量每个点和其他簇中的每个点之间的距离。我们将两个平均值相减,再除以更大的那个平均值。
我们最终想要的是一种较高(比如最接近1)的分数,表明存在较小的簇内平均距离(紧密簇)和较大的簇间平均距离(簇间分离良好)。
集群可视化解释:获得集群之后,解释每个集群非常重要。这通常是通过合并原始数据集和集群并可视化每个集群来完成的。每个集群越清晰越独特越好。我们将在下面实现这个过程。
DBSCAN的优点
- 不需要像KMeans那样预先确定集群的数量
- 对异常值不敏感
- 能将高密度数据分离成小集群
- 可以聚类非线性关系(聚类为任意形状)
DBSCAN的缺点
- 很难在不同密度的数据中识别集群
- 难以聚类高维数据
- 对极小点的参数非常敏感
让我们尝试一下
importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsimportplotly.offlineaspyopyo.init_notebook_mode() importplotly.graph_objsasgofromplotlyimporttoolsfromplotly.subplotsimportmake_subplotsimportplotly.offlineaspyimportplotly.expressaspxfromsklearn.clusterimportDBSCANfromsklearn.neighborsimportNearestNeighborsfromsklearn.metricsimportsilhouette_scorefromsklearn.preprocessingimportStandardScalerfromsklearn.decompositionimportPCAplt.style.use('fivethirtyeight') fromwarningsimportfilterwarningsfilterwarnings('ignore') withopen('HR_data.csv') asf: df=pd.read_csv(f, usecols=['satisfaction_level', 'last_evaluation', 'number_project', 'average_montly_hours', 'time_spend_company', 'Work_accident', 'promotion_last_5years']) f.close()
1. 标准化
由于数据集中的特特征不在相同的范围内,所以我们需要对整个数据集进行标准化。换句话说,我们数据集中的每个特征对于它们的数据都有独特的大小和范围。满意度水平增加一分并不等于最后评价增加一分,反之亦然。由于DBSCAN利用点之间的距离(欧几里得)来确定相似性,未缩放的数据会产生问题。如果某一特征在其数据中具有较高的可变性,则距离计算受该特征的影响较大。通过缩放特征,我们将所有特征对齐到均值为0,标准差为1。
scaler=StandardScaler() scaler.fit(df) X_scale=scaler.transform(df)df_scale=pd.DataFrame(X_scale, columns=df.columns) df_scale.head()