還記得我們所說的,監督式機器學習是需要「正確答案」的,因此反過來說,非監督式機器學習就是不需要給定一個正確答案,那沒有正確答案要預測什麼呢?
當你在各式各樣的場合,例如廣告行銷、推薦系統等等並沒有絕對標準答案的預測目標,這時候需要找到的目標就是相似的對象了,像是廣告的客群可以有類似的屬性,因此可以藉由這個達到更精準的廣告投放等等。
分群最著名的就是K-means演算法,透過樣本點之間的距離來計算相似程度,從而將樣本點分為同一群,此外還有克服特殊圖形的DBscan等等特殊的算法。
首先最重要的部分,由於非監督式機器學習使用距離作為分群,因此標準化是最重要的預處理。
from sklearn.preprocessing import StandardScaler # 標準化套件
sc = StandardScaler() # 創建一個標準化的物件
sc.fit(dummies) # 針對df的資料進行計算
dummies_std = sc.transform(df) # 生成標準化資料
你可能會問,原本的資料不是已經標準化了,再標準化一次不會出錯嗎?
由於標準化是讓平均為0標準差為1,因此之後再執行標準化並不會影響到已經標準化的列。
from sklearn.cluster import KMeans # 匯入kMeans套件
km = KMeans(n_clusters=3) # 產生kmean
y_pred = km.fit_predict(dummies_std)
產生分群結果之後我們可以簡單的將答案視覺化來觀察分群的效果,並使用分群結果進行上色。
import matplotlib.pyplot as plt
plt.rcParams['font.family']='SimHei' # 顯示中文字體
plt.figure(figsize=(10,8))
plt.scatter(df["s3"],df['bmi'],c=y_pred)
plt.xlabel('s3', fontsize=20)
plt.ylabel('bmi', fontsize=20)
以肉眼直觀來看可能會覺得分的不是非常的好,但這是因為在其他資料上也有著不同的影響,我們可以等之後使用特徵降維,將多個數據呈現在二維平面上。