無監督學習-K-means演算法

靠譜楊發表於2022-04-05

無監督學習-K-means演算法

1、 什麼是無監督學習

  • 一家廣告平臺需要根據相似的人口學特徵和購買習慣將美國人口分成不同的小組,以便廣告客戶可以通過有關聯的廣告接觸到他們的目標客戶。
  • Airbnb 需要將自己的房屋清單分組成不同的社群,以便使用者能更輕鬆地查閱這些清單。
  • 一個資料科學團隊需要降低一個大型資料集的維度的數量,以便簡化建模和降低檔案大小。

我們可以怎樣最有用地對其進行歸納和分組?我們可以怎樣以一種壓縮格式有效地表徵資料?這都是無監督學習的目標,之所以稱之為無監督,是因為這是從無標籤的資料開始學習的。

2、 無監督學習包含演算法

  • 聚類
    • K-means(K均值聚類)
  • 降維
    • PCA

3、 K-means原理

我們先來看一下一個K-means的聚類效果圖

3.1 K-means聚類步驟

  • 1、隨機設定K個特徵空間內的點作為初始的聚類中心
  • 2、對於其他每個點計算到K箇中心的距離,未知的點選擇最近的一個聚類中心點作為標記類別
  • 3、接著對著標記的聚類中心之後,重新計算出每個聚類的新中心點(平均值)
  • 4、如果計算得出的新中心點與原中心點一樣,那麼結束,否則重新進行第二步過程

4、K-meansAPI

  • sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
    • k-means聚類
    • n_clusters:開始的聚類中心數量 比如 n_clusters=4
    • init:初始化方法,預設為'k-means ++’
    • labels_:預設標記的型別,可以和真實值比較(不是值比較)

5、 案例:k-means對Instacart Market使用者聚類

5.1 分析

  • 1、降維之後的資料
  • 2、k-means聚類
  • 3、聚類結果顯示

5.2 程式碼

# 取500個使用者進行測試
# 如果b_i>>a_i:趨近於1效果越好, b_i<<a_i:趨近於-1,效果不好。輪廓係數的值是介於 [-1,1] ,越趨近於1代表內聚度和分離度都相對較優。
cust = data[:500]
km = KMeans(n_clusters=4)
km.fit(cust)
pre = km.predict(cust)
print(silhouette_score(cust, pre))

返回結果:
0.466014214896049

問題:如何去評估聚類的效果呢?

6、Kmeans效能評估指標

6.1 輪廓係數

注:對於每個點i 為已聚類資料中的樣本 ,b_i 為i 到其它族群的所有樣本的距離最小值,a_i 為i 到本身簇的距離平均值。最終計算出所有的樣本點的輪廓係數平均值

6.2 輪廓係數值分析

  • 分析過程(我們以一個藍1點為例)
    • 1、計算出藍1離本身族群所有點的距離的平均值a_i
    • 2、藍1到其它兩個族群的距離計算出平均值紅平均,綠平均,取最小的那個距離作為b_i
    • 根據公式:極端值考慮:如果b_i >>a_i: 那麼公式結果趨近於1;如果a_i>>>b_i: 那麼公式結果趨近於-1

6.3 結論

如果b_i>>a_i:趨近於1效果越好, b_i<<a_i:趨近於-1,效果不好。輪廓係數的值是介於 [-1,1] ,越趨近於1代表內聚度和分離度都相對較優。

6.4 輪廓係數API

  • sklearn.metrics.silhouette_score(X, labels)
    • 計算所有樣本的平均輪廓係數
    • X:特徵值
    • labels:被聚類標記的目標值

6.5 使用者聚類結果評估

silhouette_score(cust, pre)

7、K-means總結

  • 特點分析:採用迭代式演算法,直觀易懂並且非常實用
  • 缺點:容易收斂到區域性最優解(多次聚類)

注意:聚類一般做在分類之前


案例:

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

# 1、獲取資料集
# ·商品資訊- products.csv:
# Fields:product_id, product_name, aisle_id, department_id
# ·訂單與商品資訊- order_products__prior.csv:
# Fields:order_id, product_id, add_to_cart_order, reordered
# ·使用者的訂單資訊- orders.csv:
# Fields:order_id, user_id,eval_set, order_number,order_dow, order_hour_of_day, days_since_prior_order
# ·商品所屬具體物品類別- aisles.csv:
# Fields:aisle_id, aisle
from sklearn.metrics import silhouette_score

products = pd.read_csv("../instacart/products.csv")
order_products = pd.read_csv("../instacart/order_products__prior.csv")
orders = pd.read_csv("../instacart/orders.csv")
aisles = pd.read_csv("../instacart/aisles.csv")

# 2、合併表,將user_id和aisle放在一張表上
# 1)合併orders和order_products on=order_id tab1:order_id, product_id, user_id
tab1 = pd.merge(orders, order_products, on=["order_id", "order_id"])
# 2)合併tab1和products on=product_id tab2:aisle_id
tab2 = pd.merge(tab1, products, on=["product_id", "product_id"])
# 3)合併tab2和aisles on=aisle_id tab3:user_id, aisle
tab3 = pd.merge(tab2, aisles, on=["aisle_id", "aisle_id"])

# 3、交叉表處理,把user_id和aisle進行分組
table = pd.crosstab(tab3["user_id"], tab3["aisle"])

# 4、主成分分析的方法進行降維
# 1)例項化一個轉換器類PCA
transfer = PCA(n_components=0.95)
# 2)fit_transform
data = transfer.fit_transform(table)

print(data.shape)

# 取500個使用者進行測試
# 如果b_i>>a_i:趨近於1效果越好, b_i<<a_i:趨近於-1,效果不好。輪廓係數的值是介於 [-1,1] ,越趨近於1代表內聚度和分離度都相對較優。
cust = data[:500]
km = KMeans(n_clusters=4)
km.fit(cust)
pre = km.predict(cust)
print(silhouette_score(cust, pre))

返回結果:

(206209, 44)
0.466014214896049

幾個問題:

1、線性迴歸的引數求解的方法是什麼?

答案: 正規方程和梯度下降

2、什麼是過擬合? 原因有哪些?

答案: 過擬合就是訓練誤差很小,但是測試誤差很大

原因有: 樣本偏差, 模型過於複雜

3、分類問題, 迴歸問題, 聚類問題的評估方法分別是什麼?

答案: 分類問題的評估方法是準確率, 精確率和召回率

迴歸問題的評估方法是均方差

聚類問題的評估方法是輪廓係數

相關文章