详解DBSCAN聚类( 二 )


如果选取的epsilon太小,很大一部分数据将不会被聚类,而一个大的epsilon值将导致聚类簇被合并,大部分数据点将会在同一个簇中 。一般来说,较小的值比较合适,并且作为一个经验法则,只有一小部分的点应该在这个距离内 。
如何确定最佳minPts通常,我们应该将minPts设置为大于或等于数据集的维数 。也就是说,我们经常看到人们用特征的维度数乘以2来确定它们的minPts值 。
就像用来确定最佳的epsilon值的"肘部方法"一样,minPts的这种确定方法并不是100%正确的 。
DBSCAN聚类的评价方式影像法:该技术测量集群之间的可分离性 。首先,找出每个点与集群中所有其他点之间的平均距离 。然后测量每个点和其他簇中的每个点之间的距离 。我们将两个平均值相减,再除以更大的那个平均值 。
我们最终想要的是一种较高(比如最接近1)的分数,表明存在较小的簇内平均距离(紧密簇)和较大的簇间平均距离(簇间分离良好) 。
集群可视化解释:获得集群之后,解释每个集群非常重要 。这通常是通过合并原始数据集和集群并可视化每个集群来完成的 。每个集群越清晰越独特越好 。我们将在下面实现这个过程 。
DBSCAN的优点· 不需要像KMeans那样预先确定集群的数量
· 对异常值不敏感
· 能将高密度数据分离成小集群
· 可以聚类非线性关系(聚类为任意形状)
DBSCAN的缺点· 很难在不同密度的数据中识别集群
· 难以聚类高维数据
· 对极小点的参数非常敏感
让我们尝试一下import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport plotly.offline as pyopyo.init_notebook_mode()import plotly.graph_objs as gofrom plotly import toolsfrom plotly.subplots import make_subplotsimport plotly.offline as pyimport plotly.express as pxfrom sklearn.cluster import DBSCANfrom sklearn.neighbors import NearestNeighborsfrom sklearn.metrics import silhouette_scorefrom sklearn.preprocessing import StandardScalerfrom sklearn.decomposition import PCAplt.style.use('fivethirtyeight')from warnings import filterwarningsfilterwarnings('ignore')with open('HR_data.csv') as f: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()

详解DBSCAN聚类

文章插图
 
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()
详解DBSCAN聚类

文章插图
 
2. 特征降维在一些算法如KMeans中,如果数据集的特征维度太大,就很难精确地构建聚类 。高维数并不一定意味着成百上千维度的特征 。甚至10个维度的特征也会造成准确性问题 。
特征降维背后的理论是将原始特征集转换为更少的人工派生特征,这些特征仍然保留了原始特征中包含的大部分信息 。
最流行的特征降维技术之一是主成分分析(PCA) 。PCA将原始数据集缩减为指定数量的特征,并将这些特征称为主成分 。我们必须选择我们希望看到的主成分的数量 。我们在我关于KMeans集群的文章中讨论了减少特性,我强烈建议您看一看() 。
首先,我们需要确定适当的主成分数量 。3个主成分似乎占了大约75%的方差 。
pca = PCA(n_components=7)pca.fit(df_scale)variance = pca.explained_variance_ratio_ var=np.cumsum(np.round(variance, 3)*100)plt.figure(figsize=(12,6))plt.ylabel('% Variance Explained')plt.xlabel('# of Features')plt.title('PCA Analysis')plt.ylim(0,100.5)plt.plot(var)
详解DBSCAN聚类

文章插图
 
现在我们知道了维持一个特定百分比的方差所需的主成分的数量,让我们对原始数据集应用一个3成分的主成分分析 。请注意,第一个主成分占到与原始数据集方差的26% 。在本文的其余部分中,我们将使用"pca_df"数据框架 。


推荐阅读