如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)

資料派THU發表於2019-05-14

目前,BigQueryML支援無監督學習-可以利用K均值演算法對資料進行分組。與預測分析的監督機器學習不同,無監督學習側重於描述性分析-在理解資料的基礎之上做出資料驅動的決策。

如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)

聚類什麼內容?

首先,需要確定聚類的內容,為什麼要這樣做?假設你是一個擁有客戶交易資料的零售商,有多種方法可以對此資料集進行聚類,這取決於你想要對聚類做什麼操作。

  • 我們可以在顧客中找到自然群體,這就是所謂的客戶細分。用於客戶細分的資料可能包括客戶訪問的商店、他們購買的商品、支付的費用等等。首先將嘗試瞭解這些客戶組的喜好(這些人稱為人物角色),這樣便可以設計出針對其中一個組的成員有吸引力的專案。

  • 我們也可以在購買的物品中發現自然群體,這可以稱為產品組。可以根據購買物件、購買時間、購買地點等對專案進行聚類。同時可以嘗試學習產品組的特徵,以便學習如何減少調撥或改進交叉銷售。

這兩種情況下,均使用聚類作為一種啟發式方法來幫助做出決策-設計個性化產品或理解產品互動並不容易,因此可以從客戶組或產品專案組兩種維度進行設計。

請注意,對於產品推薦的特定用例(向客戶推薦產品或特定產品的目標客戶),最好使用WALS之類的協作方法訓練ML模型來實現。但是對於其他沒有現成的預測分析方法的決策,聚類會提供一種做出資料驅動決策的方法。

建立聚類問題

為更好地使用聚類,需要做以下四件事:

1. 確定對哪些欄位進行聚類。是客戶ID?還是產品專案ID?  然後,將資料集中在該欄位的屬性上。

2. 找出給定客戶/專案/其他屬於哪個聚類

3. 理解聚類屬性的內容。

4. 利用這一理解做出決策。

在本文中,我將演示對倫敦自行車共享資料的聚類方法。假設我們圍繞自行車共享站的設計和倉儲做出很多決策,我們希望瞭解系統中的不同型別的站點,這樣便可以資料驅動的方式做出這些決策。

需要做到以下四件事:

1. 聚類自行車租賃站。我們需要聚類的欄位是Station_name,為此還需要找到站點的屬性。

2. 找出每個站點屬於哪個聚類

3. 理解每個聚類的特徵。

4. 利用這種理解來做出由資料驅動的決策。

在此之前,首先需要收集資料。

1.  收集資料

我們將用到的資料包括倫敦的自行車租賃,它是歐盟地區的公共資料集,因此,如果想要跟蹤我的查詢,應確保在歐盟地區建立一個名為demos_eu的資料集。

需要根據下面這些因子對車站進行聚類

  • 租用時間

  • 每天出行次數

  • 自行車架數量

  • 距市中心的距離

我們通常需要做出一些決策,諸如:在工作日和週末不同的時間安排車站的存貨(即確保車站有自行車出租)。為此,需要對這些例項進行聚類,其“主鍵”是Station_name和isworkday的組合。

以下是對收集到的相關資料的查詢

如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)

我們提取了2015年(見WHERE條款)的租用資料(Start_Station_name,週末/工作日,持續時間),並根據站點資訊(自行車數量、距市中心的距離)加入該資料。

然後,遍歷自行車計數、距市中心的距離等車站屬性,計算出平均騎乘時間、出行次數等車站屬性。資料集如下所示:

如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)用於聚類的資料集;資料的主鍵是Station_name和isweekday的組合

2. BigQueryML聚類

進行聚類時僅需向上述SELECT查詢中新增一條CREATE MODEL語句,並刪除資料中的“id”欄位:

如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)

如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)

查詢處理1.2GB,耗時54秒。模型中列出了聚類用到的4個因子:

如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)K-均值模型請注意,在建立模型過程中指定了所需的聚類數量(num_clusters=4),並刪除了不需要對其進行聚類的因子 (Station_name和isweekday)。如果特徵有不同的動態範圍(bikes_count在10-50範圍內,而num_trips在數千個範圍內),那麼,標準化特性會是一個不錯的選擇,而我正在這樣做的。

如果忽略聚類的數量,BigQueryML將根據訓練資料集中的總行數選擇一個合理的預設值,還可以通過超引數調優來找到一個更優的數字。本質上,可以對num_clusters的不同值執行聚類,找出誤差,並選擇圖形平穩的點。可以通過以下方法獲得誤差:

如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)

num_clusters數目越少,聚類越好。

3. 車站屬於哪個聚類

特定的車站到底屬於哪個聚類?利用ML.PREDICT便可以找到答案。以下便是對名稱中包含“Kenningtons”的站點的聚類查詢

如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)

輸出是:

如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)肯寧頓站(Kennington)屬於哪個聚類

4. 檢查聚類

可以使用以下方法檢視聚類圖心-本質上是模型中4個因子的值:

如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)

只要稍微做一點SQL操作,便可以獲得上表的主元:

如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)

輸出是:

如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)聚類屬性

若要視覺化此表,單擊“在DataStudio中匯出”並選擇“條狀表”。將質心列設為“維度”,其餘列為尺寸。然後會得到:

如何在BigQueryML中使用K-均值聚類來更好地理解和描述資料(附程式碼)在DataStudio中視覺化後的聚類屬性這樣,便能夠解釋這些聚類了。從本質上說,第一組(Cluster #1)由人們可以長途騎行的郊外車站組成;第二組(Cluster #2)由其他郊區車站組成;第三組(Cluster #3)由繁忙的城市站組成;第四組(Cluster #4)由不那麼繁忙的城市站組成。

根據這些特性和對倫敦的一些瞭解,可以給出這些聚類的描述性名稱。第一組可能是“一日行”, 第二組是“臥室社群”, 第三組是“旅遊區”, 第四組是“商業區”。

5. 做出由資料驅動的決策

利用這些聚類做出不同的決策。

  • 如果我們剛剛獲得資金,可以擴建自行車架,那應該增加哪些車站的容量?在沒有聚類資料的情況下,我們或許會傾向於使用第三組中有很多次行程而沒有足夠的自行車的站點。但是做了聚類之後,發現這組站主要為遊客服務,他們沒有投票權,所以我們會把額外的容量放在第二組(臥室社群)。

  • 如果我們需要試驗一種新型鎖,應該在哪一組車站上做這個實驗?商業區的車站似乎更合乎邏輯的,當然,這些車站有很多自行車,而且非常繁忙,足以支援A/B測試。

  • 如果我們需要儲備一些有賽車的車站。哪一個?當然是第一組,服務於每天往返於城市的人。

顯然,我們雖然可以通過自定義資料分析來單獨做出這些決策,但是,將站點進行聚類分析,提出描述性的名稱,並使用這些名稱來做出決策,要簡單得多,也更容易解釋。

利用SQL便能完成所有這些操作!是不是相當酷?

原文連結:

How to use K-Means clustering in BigQuery ML to understand and describe your data better

原文連結:

https://towardsdatascience.com/how-to-use-k-means-clustering-in-bigquery-ml-to-understand-and-describe-your-data-better-c972c6f5733b

相關文章