HDBSCAN 是一種最先進(jìn)的基于密度的 聚類算法,已在主題建模、基因組學(xué)和地理空間分析等領(lǐng)域流行。
RAPIDS cuML 自 2021 10 月 21.10 發(fā)布以來,提供了加速 HDBSCAN ,詳見 GPU-Accelerated Hierarchical DBSCAN with RAPIDS cuML – Let’s Get Back To The Future 。然而,不包括對(duì) 軟聚類(也稱為模糊聚類)的支持。使用軟聚類,為每個(gè)點(diǎn)創(chuàng)建值向量(而不是單個(gè)聚類標(biāo)簽),表示該點(diǎn)是每個(gè)聚類成員的概率。
在 CPU 上執(zhí)行 HDBSCAN 軟群集速度緩慢。由于繁重的計(jì)算負(fù)擔(dān),中型數(shù)據(jù)集可能需要數(shù)小時(shí)甚至數(shù)天的時(shí)間。現(xiàn)在,在 22.10 RAPIDS release 中, cuML 為 HDBSCAN 提供了加速的軟聚類,使該技術(shù)能夠在大型數(shù)據(jù)集上使用。
這篇文章強(qiáng)調(diào)了使用軟聚類來更好地捕捉下游分析中的細(xì)微差別以及 RAPID 可能帶來的性能提升的重要性。在文檔聚類示例中,在 CPU 上花費(fèi)數(shù)小時(shí)的軟聚類可以在 GPU 上使用 cuML 在幾秒內(nèi)完成。
軟聚類代碼
在基于 CPU 的 scikit-learn-contrib/hdbscan library 中,軟集群通過 all_points_membership_vectors 頂級(jí)模塊功能可用。
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ù)集中的每個(gè)記錄要么被分配給單個(gè)聚類,要么被認(rèn)為是噪聲,而不被分配給任何聚類。然而,在現(xiàn)實(shí)世界中,許多記錄并不完全適合一個(gè)集群。 HDBSCAN 通過表示每個(gè)點(diǎn)屬于每個(gè)集群的程度來提供軟集群機(jī)制,從而承認(rèn)了這一現(xiàn)實(shí)。這類似于其他算法,例如混合模型和模糊 c 均值。
想象一篇關(guān)于體育主題音樂劇的新聞文章。如果你想將文章分配給一個(gè)集群,它是屬于體育集群還是音樂集群?也許是專門為體育主題音樂劇打造的一個(gè)較小的集群?或者它應(yīng)該在兩個(gè)集群中都有一定程度的成員資格?
通過強(qiáng)制選擇一個(gè)標(biāo)簽,這種細(xì)微差別就消失了,當(dāng)聚類結(jié)果用于下游分析或行動(dòng)時(shí),這種差別可能會(huì)很重要。如果只指定了一個(gè)體育標(biāo)簽,那么推薦系統(tǒng)是否會(huì)將文章呈現(xiàn)給同樣對(duì)音樂劇感興趣的讀者?那么反過來呢(讀者對(duì)其中一個(gè)感興趣,但對(duì)另一個(gè)不感興趣)?對(duì)這兩個(gè)主題中的一個(gè)或兩個(gè)感興趣的讀者來說,這篇文章應(yīng)該是潛在的。
軟集群解決了這個(gè)問題,它支持基于每個(gè)類別的閾值的操作,并創(chuàng)建提供更好體驗(yàn)的應(yīng)用程序。
文檔聚類示例
您可以使用文檔集群來衡量 cuML 加速軟集群的潛在實(shí)際性能優(yōu)勢(shì)和影響。
許多現(xiàn)代文檔群集工作流由以下步驟組成:
將每個(gè)文檔轉(zhuǎn)換為數(shù)字表示(通常使用神經(jīng)網(wǎng)絡(luò)嵌入)
降低數(shù)字轉(zhuǎn)換文檔的維數(shù)
對(duì)降維數(shù)據(jù)集執(zhí)行聚類
根據(jù)結(jié)果采取行動(dòng)
如果您想在系統(tǒng)上運(yùn)行工作流,可以通過訪問 GitHub 上的 hdbscan-blog.ipynb 獲得 Jupyter 筆記本。
準(zhǔn)備數(shù)據(jù)集
本例使用 Kaggle 的 A Million News Headlines 數(shù)據(jù)集,其中包含來自澳大利亞廣播公司的 100 多萬條新聞標(biāo)題。
下載數(shù)據(jù)集后,將每個(gè)標(biāo)題轉(zhuǎn)換為嵌入向量。為此,使用 Sentence Transformers library 中的全 MiniLM-L6-v2 神經(jīng)網(wǎng)絡(luò)。請(qǐng)注意,稍后將使用導(dǎo)入的其他一些庫(kù)。
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 將維度降到五個(gè)特征。本示例僅使用 10000 條記錄,作為指南。
為了再現(xiàn)性,設(shè)置random_state。在您的計(jì)算機(jī)上運(yùn)行時(shí),此工作流中的結(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 模型,并通過設(shè)置prediction_data=True啟用使用all_points_membership_vectors進(jìn)行軟聚類。也設(shè)置min_cluster_size=50,這意味著少于 50 個(gè)標(biāo)題的分組將被視為另一個(gè)集群(或噪聲)的一部分,而不是單獨(dú)的集群。
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)
檢查兩個(gè)集群
在繼續(xù)之前,請(qǐng)查看指定的標(biāo)簽( -1 表示噪聲)。很明顯,該數(shù)據(jù)中有相當(dāng)多的集群:
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
隨機(jī)選擇兩個(gè)簇,例如簇 7 和簇 10 ,并檢查每個(gè)簇中的幾個(gè)點(diǎn)。
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
然后,使用軟聚類成員資格分?jǐn)?shù)來找到一些點(diǎn),這些點(diǎn)可能屬于這兩個(gè)聚類。根據(jù)軟聚類得分,確定每個(gè)點(diǎn)的前兩個(gè)聚類。通過過濾簇 7 和簇 10 的軟成員資格排除異常值,這兩個(gè)成員資格都按比例大于其他簇的成員資格:
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
檢查這些要點(diǎn)的標(biāo)題,注意它們都是關(guān)于印度尼西亞的,這也在第 7 組標(biāo)題 678 (上圖)中。還要注意,這兩個(gè)標(biāo)題都是關(guān)于反戰(zhàn)與和平的,這是 10 組標(biāo)題中的幾個(gè)主題。
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
為什么軟集群很重要
您應(yīng)該有多自信這些結(jié)果屬于他們分配的集群,而不是另一個(gè)集群?如前所述,一些集群包含標(biāo)題,這些標(biāo)題有可能位于不同的集群中。
置信度可以通過計(jì)算每個(gè)點(diǎn)的前兩個(gè)聚類的成員概率之間的差異來部分量化,如 HDBSCAN 文檔中所述。本例排除了噪聲點(diǎn),以說明這不僅發(fā)生在“噪聲”點(diǎn)上,還發(fā)生在那些分配的簇標(biāo)簽上:
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)驗(yàn)累積分布函數(shù)表明,許多點(diǎn)接近于被分配不同的聚類標(biāo)簽。事實(shí)上,大約 30% 的點(diǎn)的前兩個(gè)聚類成員概率在 0.2 以內(nèi)(圖 1 )。
圖 1. 數(shù)據(jù)集的每個(gè)點(diǎn)的前兩個(gè)聚類的成員概率之間的差異的直方圖和經(jīng)驗(yàn)累積分布函數(shù)( ecdf )
使用這些軟聚類概率,您可以將這種不確定性結(jié)合起來,構(gòu)建更加健壯的機(jī)器學(xué)習(xí)管道和應(yīng)用程序。
績(jī)效基準(zhǔn)結(jié)果
接下來,在不同數(shù)量的新聞文章標(biāo)題上運(yùn)行前面的核心工作負(fù)載,從 25000 行到 400000 行不等。注意, HDBSCAN 參數(shù)可以針對(duì)更大的數(shù)據(jù)集進(jìn)行調(diào)整。
在本例中, CPU 基準(zhǔn)測(cè)試在 3.40 GHz 的 x86 Intel Xeon Gold 6128 CPU 上運(yùn)行。 GPU 基準(zhǔn)測(cè)試記錄在 NVIDIA Quadro RTX 8000 上,內(nèi)存為 48 GB 。
在 CPU (由 hdbscan 后端表示)上,軟集群性能隨著文檔數(shù)量的增加而松散地線性擴(kuò)展。 50000 份文件耗時(shí) 50 秒; 100000 份文件耗時(shí) 500 秒; 200000 份文件耗時(shí) 5500 秒( 1.5 小時(shí)); 40 萬份文件耗時(shí) 6 萬秒( 17 小時(shí))。詳見表 1 。
使用 cuML 中的 GPU 加速軟聚類, 40 萬個(gè)文檔的軟聚類可以在不到 2 秒的時(shí)間內(nèi)計(jì)算,而不是 17 小時(shí)。
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 后端運(yùn)行 HDBSCAN all_points_membership_vectors所用的時(shí)間
如果您想在系統(tǒng)上運(yùn)行此基準(zhǔn)測(cè)試,請(qǐng)使用 benchmark-membership-vectors.py GitHub 要點(diǎn)。請(qǐng)注意,性能將根據(jù)所使用的 CPU 和 GPU 而變化。
關(guān)鍵要點(diǎn)
我們很高興報(bào)告這些業(yè)績(jī)。軟聚類可以有意義地改進(jìn)機(jī)器學(xué)習(xí)支持的工作流。到目前為止,使用 HDBSCAN 這樣的集群技術(shù)在計(jì)算上對(duì)幾十萬條記錄都具有挑戰(zhàn)性。
隨著 HDBSCAN 軟聚類的加入, RAPIDS 和 cuML 繼續(xù)突破障礙,使最先進(jìn)的計(jì)算技術(shù)在規(guī)模上更易于使用。
要開始使用 cuML ,請(qǐng)?jiān)L問 RAPIDS 入門頁(yè)面,其中提供了 conda 包、 pip 包和 Docker 容器。 cuML 也可以在 NVIDIA NGC 上的 NVIDIA optimized PyTorch 和 Tensorflow Docker 容器中使用,這使得端到端工作流更加簡(jiǎn)單。
致謝
這篇文章描述了 Tarang Jain 在 Corey Nolet 指導(dǎo)下在 NVIDIA 實(shí)習(xí)期間提供的 cuML 功能。
-
NVIDIA
+關(guān)注
關(guān)注
14文章
4985瀏覽量
103024 -
AI
+關(guān)注
關(guān)注
87文章
30830瀏覽量
268984
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論