2021年資料科學家必備分群法(Clustering):HDBSCAN簡介

倢愷 Oscar
8 min readApr 8, 2021

分群法(Clustering)是很多新手Data Scientist或是ML scientist不知道如何使用的工具,導致很多人在工作流程中從來沒有使用過分群。

最大的問題就是,一般課堂、書籍中教的Clustering方法(像是K-means),都不容易上手,包含超參數不好調,很難快速達到好的效果。(實際上 K-means仍然是很實用的方法,只是需要更多經驗才能用的好)

在上一篇我介紹了一個我自己非常非常愛用的Clustering —DBSCAN,並且快速了介紹其原理跟使用技巧,相信大家可以很快速上手DBSCAN,使用在自己project中或是在面試中提起,還沒有看過的朋友推薦先去看DBSCAN的介紹。

但是在DBSCAN的使用上其實兩個超參數eps、min_samples還是不容易調,並且DBSCAN也有其最大的限制。

DBSCAN預設了所有cluster的密度是類似的,所以我們可以藉由eps跟min_samples給定特定的密度來進行分群,但是這個假設通常不成立。

而HDBSCAN就是為了解決這個問題而存在的

在這篇文章我會講一、HDBSCAN簡介
二、如何使用HDBSCAN
三、Clustering效果比較

針對HDBSCAN深入的原理說明將會在之後的文章補充說明,但是其實大家並不需要詳細了解原理,只要了解我的基礎介紹就好了。

一、HDBSCAN簡介

HDBSCAN的是Hierarchical DBSCAN的縮寫,HDBSCAN的優勢在於

  1. 只剩一個超參數min_cluster_size要調
  2. 不會受限於DBSCAN對於cluster密度的限制,接下來我快速說明這點

DBSCAN假設了所有cluster有類似的密度,而這是一個嚴重的問題

我們來看一個具體的例子。如果我用sklearn的make_blob做出來下圖這筆data。

範例data

現在請大家先在腦中試想,如果是你你會怎麼把這筆Data進行分群?

我想大部分人應該會做類似下圖的分群,總共把data分成兩群,以及散在周圍有一些noise。

範例data 人腦分群

這個結果應該滿單純的,但是這裡的範例data其實就有「兩個cluster密度不一」的問題,而這會讓我們在使用DBSCAN時不太好tune。

這邊可以看到,即便我手動挑了一個不錯的起始超參數,我改動一點數值,滿容易突然就爛掉了

這就是當cluster密度不同時,DBSCAN會遇到的困境,那下面直接來看HDBSCAN的效果。

這邊可以看到HDBSCAN在超參數的數值差異很大的時候,仍然具有一定的robustness(上面4個結果都是可以接受的結果)

並且因為HDBSCAN只剩下一個超參數要調,所以使用起來難度也非常非常低

HDBSCAN 優點1. 比DBSCAN更robust
2. 只有一個超參數要調
3. 不會受限於cluster的形狀與密度

這邊可能會有人好奇那K-Means做起來會怎麼樣,下圖是Kmeans在已知最終只有2個cluster時做出的效果,可以發現還是相當糟糕。

二、如何使用HDBSCAN

這裡要介紹一個package就稱為hdbscan,這是一個scikit-learn-contrib的package,也就是說他用法跟sklearn幾乎一樣並且可以輕易接上大部分sklearn的其他method。

hdbscan的下載相當容易

pip install hdbscan

conda install -c conda-forge hdbscan

在windows上使用pip裝hdbscan可能會遇到一些環境問題(Visual Studio版本不對),我建議可以用conda,應該相對問題比較小。

而使用上跟sklearn大部分的clustering一模一樣,可以參考下面的code,基本上最重要的就是

.fit() : 用來train clustering
.labels_ : train完後取出每個data屬於的cluster number

而HDBSCAN最重要要調的參數就是min_cluster_size,這邊就很直觀的設你認為最小的cluster要包含多少data point就好,或是也可以先隨意給個數值,效果通常都不錯。

其他hyperparametes在官網的簡介有詳細介紹,但是我自己是幾乎沒有調過。

三、Clustering效果比較

這邊我仿照sklearn的實驗,也跑了一個針對目前比較主流的clustering在各種data上的比較,這裡的各個model都是沒有經過tuning的,所以只是比各個model的baseline而已。

這裡要注意HDBSCAN比起其他大部分model更好tune,實際上在這邊所有data上我們都可以把HDBSCAN調到好。

而在運行速度這塊,可以參考下面這張圖,可以看到HDBSCAN比DBSCAN稍快,但是還是比K-Means久不少,所以實際上K-Means在資料量極大的情況還是有使用的必要。

Source: http://hdbscan.readthedocs.io/

HDBSCAN是我在早期做data exploration的時候非常常用的clustering方法,實際的效果也非常穩定可以直接拿clustering的結果來接到ML pipeline上,但是要注意,當我們資料維度較高時,大部分的clustering都會爛掉,HDBSCAN也不例外,所以在資料為度高的時候優先做的事情應該是feature selection而不是clustering。

而在feature selection這塊我之前也有介紹過今年sklearn更新的最新方法

之後也會再寫一兩篇討論在kaggle上還有甚麼常見的方法。

如果喜歡這篇文章可以幫我多拍手幾次XD,或是對於哪個類型文章有興趣都可以在留言區跟我講~ 後續會以中難度的ML/DS/AI知識為主,以及AI/HCI研究相關知識

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

倢愷 Oscar
倢愷 Oscar

Written by 倢愷 Oscar

我是倢愷,CTO at TeraThinker an AI Adaptive Learning System Company。AI/HCI研究者,超過100場的ML、DL演講、workshop經驗。主要學習如何將AI落地於業界。 有家教、演講合作,可以email跟我聯絡:axk51013@gmail.com

Responses (2)

Write a response