非監督學習(英語:unsupervised learning)是機器學習中十分重要的乙個分支。這是本實驗課程的第 2 章節,將帶你了解如何對聚類效果進行評估。
本課程難度為一般,屬於初級級別課程,適合具有 python 基礎和線性代數基礎,並對機器學習中分類問題感興趣的使用者。
# 肘部法則
$ wget
# 輪廓係數
$ wget
在第 1 小節的例子中,我們已經將樣本資料聚合成 3 類。但是,你又沒有發現乙個問題?那就是我們為什麼要聚成 3 類?為什麼不可以將資料聚成像下圖呈現的 10 類?
難道是因為,這裡的樣本資料在空間分布上,看上去有點像 3 種類別嗎?那麼,當我們遇到肉眼看起來不太好確定類別,或者是高維資料時怎麼辦呢?
所以,這一系列問題最終可以歸結為乙個問題,那就是:當我們在使用 k-means 聚類時,我們該如何確定 k 值?
這裡,介紹一種啟發式學習演算法,被稱之為肘部法則。在上文談到用print model
語句時,它會輸出三個陣列。其中,前兩個陣列在進行聚類繪圖時已經用到了,但是我們一直沒有使用第三個陣列(紅框標識)。
第三個陣列,準確說來只是乙個數值。它代表著樣本距離最近中心點距離的總和。你可以在大腦裡想一下,當我們的 k 值增加時,也就是類別增加時,這個數值應該是會降低的。直到聚類類別的數量和樣本的總數相同時,也就是說乙個樣本就代表乙個類別時,這個數值會變成 0。
from matplotlib import pyplot as plt # 載入繪圖模組
from sklearn.cluster import k_means # 載入聚類模組
import pandas as pd # 載入資料處理模組
# 讀取資料
file = pd.read_csv("cluster_data.csv", header=0)
index = # 橫座標陣列
inertia = # 縱座標陣列
# k 從 1~ 10 聚類
for i in range(9):
model = k_means(file, n_clusters=i + 1)
# 繪製折線圖
plt.plot(index, inertia, "-o")
plt.show()
我們可以看到,和預想的一樣,樣本距離最近中心點距離的總和會隨著 k 值的增大而降低。
其中,畸變程度最大的點被稱之為「肘部」。我們可以看到,這裡的「肘部」明顯是 k = 3。這也說明,將樣本聚為 3 類的確是最佳選擇。
當我們完成一項聚類任務之後,我們需要對聚類效果進行評估。其實,上面提到的肘部法則也算是一種評估方法,它讓我們知道當 k 值為多少時,整體聚類的結果更理想。
除了,肘部法則。聚類中還有一種評估方法,叫輪廓係數。輪廓係數綜合了聚類後的兩項因素:內聚度和分離度。內聚度就指乙個樣本在簇內的不相似度,而分離度就指乙個樣本在簇間的不相似度。
在 scikit-learn 種,同樣也提供了直接計算輪廓係數的方法。下面,繪製出輪廓係數與聚類 k 值變化的折線圖。
from sklearn.metrics import silhouette_score # 匯入輪廓係數計算模組
index2 = # 橫座標
silhouette = # 輪廓係數列表
# k 從 2 ~ 10 聚類
for i in range(8):
model = k_means(file, n_clusters=i + 2)
print silhouette # 輸出不同聚類下的輪廓係數
# 繪製折線圖
plt.plot(index2, silhouette, "-o")
plt.show()
輪廓係數越接近於 1,代表聚類的效果越好。我們可以很清楚的看出,k=3 對應的輪廓係數陣列最大,也更接近於 1 。
本次試驗中,我們通過肘部法則和輪廓係數驗證了如何選擇 k 值。只是 k-means 聚類實施過程中的第一步。除了 k-means 之外,還有很多演算法都需要提前確定 k 值,會在下乙個章節中出現。
scikit learn 實戰之非監督學習
非監督學習 英語 unsupervised learning 是機器學習中十分重要的乙個分支。這是實驗課程的第一章節,將帶你了解什麼是非監督學習?並學會用 k means 演算法完成乙個聚類實驗。什麼是非監督學習?籠統來講,它和監督學習是乙個相對的概念。在監督學習的過程中,我們需要對訓練資料打上標籤...
Scikit learn實戰之聚類 Kmeans
在scikit learn中,對於未標記資料的執行聚類需要使用 sklearn.cluster 模組。每乙個聚類演算法有兩個變數組成 乙個是類,它實現了fit方法從未標記的訓練資料中學習類簇 還有乙個就是函式,該函式的功能就是給它一批訓練資料,它能夠返回與每一批訓練資料相對應的類標的結果的整數集合。...
《scikit learn》隨機森林之回歸
今天我們學習下隨機森林做回歸的用法 話不多說直接上測試 看的更加清晰,總體上和回歸樹是一樣的使用流程 from sklearn.datasets import load boston from sklearn.model selection import cross val score from s...