做了個草圖,如data1和2的feature1到5相同,data1和5的feature1,2,5相同,根據所有data特徵的相似程度聚類,希望通過聚類找到實際業務中需要解決的那一類數據(從單條數據難以定位出來,所以考慮聚類能否解決問題)。且實際需要解決的數據量較大,特徵也比較複雜,多為字元串或列表(特徵數量在幾十個,特徵大部分無需考慮語義,只需考慮兩條數據的特徵是否相同即可)。

想請各位指點的問題1.此類問題(數據量較大)是否應以聚類解決,以何種演算法比較合適;2.對於字元串列表等特徵應如何處理然後用於演算法

小白初次提問,希望各位大佬多多指教,如果認為問題描述不夠清楚,我也會及時補充


不考慮特徵語義的情況下(字元串和列表都可以看成是類別),把所有的類別特徵onehot編碼,然後降維聚類。這種方法的缺點是,如果特徵的類別取值太多,onehot編碼後的特徵維度會爆炸,降維之後也會丟失大量的信息。

還有就是word2vector,這種編碼方法適合具有序列特性的信息,在不考慮文本序列和語義特性的情況下,使用這種方法會引入不必要的信息。

我覺得可以計算樣本兩兩之間的距離,假設數據如圖

兩個樣本之間的相同特徵只比較是否相同。比如,兩樣本的特徵f1,不同計為0,f2特徵相同計為1,....,最終相似度為0+1+0+1=2(也可以考慮根據特徵重要性考慮加權),最終生成一個相似度矩陣;共計(n*(n-1))/2次相似度計算,每次相似度計算是k個特徵的比較運算和比較結果求和,這個複雜度不知道是否能夠扛得住。

聚類演算法就那麼幾樣,具體特性和適用性可以看scikit-learn文檔:

2.3. Clustering - scikit-learn 0.23.1 documentation?

scikit-learn.org

再有就是根據這句話「實際業務中需要解決的那一類數據」,這可以處理成是一個「0-1分類」問題,你可以通過先標註一定量的數據進行建模,然後對於不準確數據進行補充標註,優化模型。推薦演算法lightgbm和catboost,兩種演算法對於類別變數有特殊的處理方式,並且計算速度快。這種方法的工作量在於標註數據。


問題說得太隱晦了,這有點難說。

第一個問題:「實際業務中需要解決的那一類數據「這個你已經有明確定義了么,有的話為什麼不直接做二分類就好,如果沒有才需要走到聚類的路上來。

第二個問題:特徵有多少維,維度對聚類的效果影響有點大,這個決定了是否要做些處理。

第三個問題:字元串或列表的特徵有很多的處理思路,比如說編輯距離等傳統的思路,也有基於w2v的embedding思路,但這個取決於字元串的長度以及是否有語義,列表也是一樣。這個度量有兩個問題,一個是各個特徵的相似度度量結果是否可以橫向對比,一個是是不是要兩兩遍歷導致較高的複雜度。

這些問題都思考清楚了,然後才是演算法的選型之類的。


我會先主成分分析,後聚類。或者基於行業知識,排除一些無意義,對類標籤無影響的特徵。


如果是這種數據形式的話,可以試試embedding,faiss查相似度

至於embedding的方法,可以根據預訓練模型,word2vec啥的

僅供參考


如果你發現特徵不足以聚類,那說明特徵選的不合適,要麼降維要麼升維,換一個空間來觀測。


個人建議,數據量較大的情況下先明白數據大致的分布,隨機抽樣一部分小數據集,用散點圖看一下大致情況,然後用機器學習模型如kmeans進行聚類,聚類前檢測一下異常值並排除出數據集以降低異常值的干擾


數據量大,維度多,就不要聚類了。不妨對高緯度數據進行編碼,比如simhash,最後來個排序就行了。


有幾個問題需要思考吧

第一是各個特徵的權重問題,是均勻考慮還是有所側重

第二是相似度的度量方式,是相同為1,不相同為0還是考慮一些比較軟的方式

第三是要不要把特徵映射到低維空間去考量,會降低計算量並使結果更為直觀,畢竟高維空間難理解但是一張圖上比較比較還是容易的

因為聚類畢竟不是監督學習,如果效果不好,調整的方法也不多


推薦閱讀:
相关文章