文章目錄
- 一、資料集探索
- 二、資料預處理
- 三、構模組化型擷取結果
- 四、聚類結果可視化
- 五、聚類模型評估
- ① 輪廓系數
- ② 卡林斯基 - 哈拉巴斯指數
- ③ FMI評價法
一、資料集探索
iris資料集是常用的分類實驗資料集,由Fisher,1936收集整理。iris也稱鸢尾花卉資料集,是一類多重變量分析的資料集。資料集包含150個資料樣本,分為3類,每類50個資料,每個資料包含4個屬性。可通過
花萼長度
,
花萼寬度
,
花瓣長度
,
花瓣寬度
4個屬性預測鸢尾花卉屬于(Setosa,Versicolour,Virginica)三個種類中的哪一類。
# 1.加載資料集
iris_data = load_iris()
x = iris_data.data
y = iris_data.target
# 特征
columns = iris_data.feature_names # ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
X:
Y:
傳回頂部
二、資料預處理
- 不同特征之間往往具有不同的量綱,由此所造成的數值間的差異可能很大,在涉及空間距離計算或梯度下降法等情況的時候不對其進行處理會影響到資料分析結果的準确性。為了消除特征之間的量綱和取值範圍差異可能會造成的影響,需對資料進行标準化處理,也可以稱為規範化處理。
- 在這裡我們對資料集進行标準差标準化處理。
# 2.資料預處理 --- 标準差标準化
MMS = MinMaxScaler().fit(x)
data = MMS.transform(x)
處理後的資料集:
傳回頂部
三、構模組化型擷取結果
# 3.建構KMeans模型訓練資料
cluster = KMeans(n_clusters=3,random_state=123).fit(data)
# 3.1 擷取聚類結果
y_pred = cluster.labels_
# 3.2 擷取質心
centers = cluster.cluster_centers_
# [[0.70726496 0.4508547 0.79704476 0.82478632],
# [0.19611111 0.595 0.07830508 0.06083333],
# [0.44125683 0.30737705 0.57571548 0.54918033]]
# 3.3 檢視簇内平方和
inertia = cluster.inertia_ # 6.982216473785234
傳回頂部
四、聚類結果可視化
- 這裡我們的資料集是四維(包含四個特征),我們需要對其進行降維處理,降到二維平面使用散點圖來進行展示。
- 這裡的降維采用TSNE。t-SNE(t-distributed stochastic neighbor embedding)是用于降維的一種機器學習算法,是由 Laurens van der Maaten 等在08年提出來。此外,
。t-SNE 是一種非線性降維算法,非常适用于高維資料降維到2維或者3維,進行可視化
# 4.聚類結果可視化
from sklearn.manifold import TSNE
# 進行資料降維處理
tsne = TSNE(n_components=2,init='random',random_state=177).fit(data)
df = pd.DataFrame(tsne.embedding_)
df['labels'] =
- 降維後的資料集
df1 = df[df['labels']==0]
df2 = df[df['labels']==1]
df3 = df[df['labels']==2]
# 繪制畫布
fig = plt.figure(figsize=(9,6))
plt.plot(df1[0],df1[1],'bo',df2[0],df2[1],'r*',df3[0],df3[1],'gD')
plt.show()
傳回頂部
五、聚類模型評估
KMeans聚類模型評估名額參見:【skLearn 聚類算法】KMeans
① 輪廓系數
# 5.1 使用輪廓系數法評價K-Means聚類模型 --- 畸變程度
from sklearn.metrics import silhouette_score
silhouetteScore = []
for i in range(2,15):
# 建構并訓練模型
kmeans = KMeans(n_clusters=i,random_state=123).fit(data)
score = silhouette_score(data,kmeans.labels_)
silhouetteScore.append(score)
plt.figure(figsize=(10,6))
plt.plot(range(2,15),silhouetteScore,linewidth=1.5,linestyle='-')
plt.show()
- 在這裡我們擷取輪廓系數
,如果要擷取每個樣本的輪廓系數應當使用score是所有樣本的輪廓系數均值
。這裡是silhouette_samples
,是以采用輪廓系數均值進行評估。針對超參數k(n_cluster)
- 聚類數目為2、3和4、5的時候,圖形的畸變程度最大。本身資料集就是關于3種鸢尾花的,側面說明了聚類為3的時候效果較好。
傳回頂部
② 卡林斯基 - 哈拉巴斯指數
# 5.2 卡林斯基-哈拉巴斯指數
from sklearn.metrics import calinski_harabasz_score
chs = []
for i in range(2,15):
# 建構聚類模型
kmeans = KMeans(n_clusters=i,random_state=112).fit(data)
chsScore = calinski_harabasz_score(data,kmeans.labels_)
chs.append(chsScore)
plt.figure(figsize=(10, 8))
plt.plot(range(2, 15), chs, linewidth=1.5, linestyle='-')
plt.show()
- 由圖可以看出,當
的時候,FMI評分最高,聚類效果較好。n_cluster=3
傳回頂部
③ FMI評價法
# 5.3 FMI評價法 --- 需要有真實标簽
from sklearn.metrics import fowlkes_mallows_score
fms = []
for i in range(2,15):
# 建構聚類模型
kmeans = KMeans(n_clusters=i,random_state=112).fit(data)
fmsScore = fowlkes_mallows_score(y,kmeans.labels_)
fms.append(fmsScore)
plt.figure(figsize=(10, 8))
plt.plot(range(2, 15), fms, linewidth=1.5, linestyle='-')
plt.show()
- 由圖可以看出,當
的時候,FMI評分最高,聚類效果較好。n_cluster=3