HDBSCAN 是一種最先進的基于密度的 聚類算法,已在主題建模、基因組學和地理空間分析等領域流行。
RAPIDS cuML 自 2021 10 月 21.10 發(fā)布以來,提供了加速 HDBSCAN ,詳見 GPU-Accelerated Hierarchical DBSCAN with RAPIDS cuML – Let’s Get Back To The Future 。然而,不包括對 軟聚類(也稱為模糊聚類)的支持。使用軟聚類,為每個點創(chuàng)建值向量(而不是單個聚類標簽),表示該點是每個聚類成員的概率。
在 CPU 上執(zhí)行 HDBSCAN 軟群集速度緩慢。由于繁重的計算負擔,中型數(shù)據(jù)集可能需要數(shù)小時甚至數(shù)天的時間?,F(xiàn)在,在 22.10 RAPIDS release 中, cuML 為 HDBSCAN 提供了加速的軟聚類,使該技術(shù)能夠在大型數(shù)據(jù)集上使用。
這篇文章強調(diào)了使用軟聚類來更好地捕捉下游分析中的細微差別以及 RAPID 可能帶來的性能提升的重要性。在文檔聚類示例中,在 CPU 上花費數(shù)小時的軟聚類可以在 GPU 上使用 cuML 在幾秒內(nèi)完成。
軟聚類代碼
在基于 CPU 的 scikit-learn-contrib/hdbscan library 中,軟集群通過 all_points_membership_vectors 頂級模塊功能可用。
cuML 與此 API 匹配:
import cuml blobs, labels = cuml.datasets.make_blobs(n_samples=2000, n_features=10, random_state=12) clusterer = cuml.cluster.hdbscan.HDBSCAN(prediction_data=True) clusterer.fit(blobs) cuml.cluster.hdbscan.all_points_membership_vectors(clusterer)
為什么選擇軟群集
在許多聚類算法中,數(shù)據(jù)集中的每個記錄要么被分配給單個聚類,要么被認為是噪聲,而不被分配給任何聚類。然而,在現(xiàn)實世界中,許多記錄并不完全適合一個集群。 HDBSCAN 通過表示每個點屬于每個集群的程度來提供軟集群機制,從而承認了這一現(xiàn)實。這類似于其他算法,例如混合模型和模糊 c 均值。
想象一篇關于體育主題音樂劇的新聞文章。如果你想將文章分配給一個集群,它是屬于體育集群還是音樂集群?也許是專門為體育主題音樂劇打造的一個較小的集群?或者它應該在兩個集群中都有一定程度的成員資格?
通過強制選擇一個標簽,這種細微差別就消失了,當聚類結(jié)果用于下游分析或行動時,這種差別可能會很重要。如果只指定了一個體育標簽,那么推薦系統(tǒng)是否會將文章呈現(xiàn)給同樣對音樂劇感興趣的讀者?那么反過來呢(讀者對其中一個感興趣,但對另一個不感興趣)?對這兩個主題中的一個或兩個感興趣的讀者來說,這篇文章應該是潛在的。
軟集群解決了這個問題,它支持基于每個類別的閾值的操作,并創(chuàng)建提供更好體驗的應用程序。
文檔聚類示例
您可以使用文檔集群來衡量 cuML 加速軟集群的潛在實際性能優(yōu)勢和影響。
許多現(xiàn)代文檔群集工作流由以下步驟組成:
將每個文檔轉(zhuǎn)換為數(shù)字表示(通常使用神經(jīng)網(wǎng)絡嵌入)
降低數(shù)字轉(zhuǎn)換文檔的維數(shù)
對降維數(shù)據(jù)集執(zhí)行聚類
根據(jù)結(jié)果采取行動
如果您想在系統(tǒng)上運行工作流,可以通過訪問 GitHub 上的 hdbscan-blog.ipynb 獲得 Jupyter 筆記本。
準備數(shù)據(jù)集
本例使用 Kaggle 的 A Million News Headlines 數(shù)據(jù)集,其中包含來自澳大利亞廣播公司的 100 多萬條新聞標題。
下載數(shù)據(jù)集后,將每個標題轉(zhuǎn)換為嵌入向量。為此,使用 Sentence Transformers library 中的全 MiniLM-L6-v2 神經(jīng)網(wǎng)絡。請注意,稍后將使用導入的其他一些庫。
import numpy as np import pandas as pd import cuml from sentence_transformers import SentenceTransformer N_HEADLINES = 10000 model = SentenceTransformer('all-MiniLM-L6-v2') df = pd.read_csv("/path/to/million-headlines.zip") embeddings = model.encode(df.headline_text[:N_HEADLINES])
降低維度
嵌入就緒后,使用 cuML 的 UMAP 將維度降到五個特征。本示例僅使用 10000 條記錄,作為指南。
為了再現(xiàn)性,設置random_state。在您的計算機上運行時,此工作流中的結(jié)果可能略有不同,具體取決于 UMAP 結(jié)果。
umap = cuml.manifold.UMAP(n_components=5, n_neighbors=15, min_dist=0.0, random_state=12) reduced_data = umap.fit_transform(embeddings)
軟聚類
接下來,在數(shù)據(jù)集上擬合 HDBSCAN 模型,并通過設置prediction_data=True啟用使用all_points_membership_vectors進行軟聚類。也設置min_cluster_size=50,這意味著少于 50 個標題的分組將被視為另一個集群(或噪聲)的一部分,而不是單獨的集群。
clusterer = cuml.cluster.hdbscan.HDBSCAN(min_cluster_size=50, metric='euclidean', prediction_data=True) clusterer.fit(reduced_data) soft_clusters = cuml.cluster.hdbscan.all_points_membership_vectors(clusterer) soft_clusters[0] array([0.01466704, 0.01035215, 0.0220814 , 0.01829496, 0.0127591 , 0.02333117, 0.01993877, 0.02453639, 0.03369896, 0.02514531, 0.05555269, 0.04149485, 0.05131698, 0.02297594, 0.03559102, 0.02765776, 0.04131499, 0.06404213, 0.01866449, 0.01557038, 0.01696391], dtype=float32)
檢查兩個集群
在繼續(xù)之前,請查看指定的標簽( -1 表示噪聲)。很明顯,該數(shù)據(jù)中有相當多的集群:
pd.Series(clusterer.labels_).value_counts() -1 3943 3 1988 5 1022 20 682 13 367 7 210 0 199 2 192 8 190 16 177 12 161 17 143 15 107 19 86 9 83 11 70 4 68 18 66 6 65 10 61 1 61 14 59 dtype: int64
隨機選擇兩個簇,例如簇 7 和簇 10 ,并檢查每個簇中的幾個點。
df[:N_HEADLINES].loc[clusterer.labels_ == 7].headline_text.head() 572 man accused of selling bali bomb chemicals goe... 671 timor sea treaty will be ratfied shortly martin 678 us asks indonesia to improve human rights record 797 shop owner on trial accused over bali bomb 874 gatecrashers blamed for violence at bali thank... Name: headline_text, dtype: object df[:N_HEADLINES].loc[clusterer.labels_ == 10].headline_text.head() 40 direct anger at govt not soldiers crean urges 94 mayor warns landfill protesters 334 more anti war rallies planned 362 pm criticism of protesters disgraceful crean 363 pm defends criticism of anti war protesters Name: headline_text, dtype: object
然后,使用軟聚類成員資格分數(shù)來找到一些點,這些點可能屬于這兩個聚類。根據(jù)軟聚類得分,確定每個點的前兩個聚類。通過過濾簇 7 和簇 10 的軟成員資格排除異常值,這兩個成員資格都按比例大于其他簇的成員資格:
df2 = pd.DataFrame(soft_clusters.argsort()[:,::-1][:,:2]) df2["sum"] = soft_clusters.sum(axis=1) df2["cluster_7_ratio"] = soft_clusters[:,7] / df2["sum"] df2["cluster_10_ratio"] = soft_clusters[:,10] / df2["sum"] df2[(df2[0] == 7) & (df2[1] == 10) & (df2["cluster_7_ratio"] > 0.1) & (df2["cluster_10_ratio"] > 0.1)] 3824 7 10 0.630313 0.170000 0.160453 6405 7 10 0.695286 0.260162 0.119036
檢查這些要點的標題,注意它們都是關于印度尼西亞的,這也在第 7 組標題 678 (上圖)中。還要注意,這兩個標題都是關于反戰(zhàn)與和平的,這是 10 組標題中的幾個主題。
df[:N_HEADLINES].iloc[3824] publish_date 20030309 headline_text indonesians stage mass prayer against war in iraq Name: 3824, dtype: object df[:N_HEADLINES].iloc[6405] publish_date 20030322 headline_text anti war fury sweeps indonesia Name: 6405, dtype: object
為什么軟集群很重要
您應該有多自信這些結(jié)果屬于他們分配的集群,而不是另一個集群?如前所述,一些集群包含標題,這些標題有可能位于不同的集群中。
置信度可以通過計算每個點的前兩個聚類的成員概率之間的差異來部分量化,如 HDBSCAN 文檔中所述。本例排除了噪聲點,以說明這不僅發(fā)生在“噪聲”點上,還發(fā)生在那些分配的簇標簽上:
soft_non_noise = soft_clusters[clusterer.labels_ != -1] probs_top2_non_noise = np.take_along_axis(soft_non_noise, soft_non_noise.argsort(), axis=1)[:, -2:] diffs = np.diff(probs_top2_non_noise).ravel()
繪制直方圖和這些差異的經(jīng)驗累積分布函數(shù)表明,許多點接近于被分配不同的聚類標簽。事實上,大約 30% 的點的前兩個聚類成員概率在 0.2 以內(nèi)(圖 1 )。
圖 1. 數(shù)據(jù)集的每個點的前兩個聚類的成員概率之間的差異的直方圖和經(jīng)驗累積分布函數(shù)( ecdf )
使用這些軟聚類概率,您可以將這種不確定性結(jié)合起來,構(gòu)建更加健壯的機器學習管道和應用程序。
績效基準結(jié)果
接下來,在不同數(shù)量的新聞文章標題上運行前面的核心工作負載,從 25000 行到 400000 行不等。注意, HDBSCAN 參數(shù)可以針對更大的數(shù)據(jù)集進行調(diào)整。
在本例中, CPU 基準測試在 3.40 GHz 的 x86 Intel Xeon Gold 6128 CPU 上運行。 GPU 基準測試記錄在 NVIDIA Quadro RTX 8000 上,內(nèi)存為 48 GB 。
在 CPU (由 hdbscan 后端表示)上,軟集群性能隨著文檔數(shù)量的增加而松散地線性擴展。 50000 份文件耗時 50 秒; 100000 份文件耗時 500 秒; 200000 份文件耗時 5500 秒( 1.5 小時); 40 萬份文件耗時 6 萬秒( 17 小時)。詳見表 1 。
使用 cuML 中的 GPU 加速軟聚類, 40 萬個文檔的軟聚類可以在不到 2 秒的時間內(nèi)計算,而不是 17 小時。
Backend | Number of Rows | Soft Clustering Time (s) |
cuml | 25,000 | 0.008182 |
hdbscan | 25,000 | 5.795254 |
cuml | 50,000 | 0.014839 |
hdbscan | 50,000 | 53.847145 |
cuml | 100,000 | 0.077507 |
hdbscan | 100,000 | 485.847746 |
cuml | 200,000 | 0.322825 |
hdbscan | 200,000 | 5503.697239 |
cuml | 400,000 | 1.343359 |
hdbscan | 400,000 | 62428.348942 |
表 1 。使用 cuML 和 CPU 后端運行 HDBSCAN all_points_membership_vectors所用的時間
如果您想在系統(tǒng)上運行此基準測試,請使用 benchmark-membership-vectors.py GitHub 要點。請注意,性能將根據(jù)所使用的 CPU 和 GPU 而變化。
關鍵要點
我們很高興報告這些業(yè)績。軟聚類可以有意義地改進機器學習支持的工作流。到目前為止,使用 HDBSCAN 這樣的集群技術(shù)在計算上對幾十萬條記錄都具有挑戰(zhàn)性。
隨著 HDBSCAN 軟聚類的加入, RAPIDS 和 cuML 繼續(xù)突破障礙,使最先進的計算技術(shù)在規(guī)模上更易于使用。
要開始使用 cuML ,請訪問 RAPIDS 入門頁面,其中提供了 conda 包、 pip 包和 Docker 容器。 cuML 也可以在 NVIDIA NGC 上的 NVIDIA optimized PyTorch 和 Tensorflow Docker 容器中使用,這使得端到端工作流更加簡單。
致謝
這篇文章描述了 Tarang Jain 在 Corey Nolet 指導下在 NVIDIA 實習期間提供的 cuML 功能。
-
NVIDIA
+關注
關注
14文章
4862瀏覽量
102726 -
AI
+關注
關注
87文章
29889瀏覽量
268175
發(fā)布評論請先 登錄
相關推薦
評論