文章目錄[隱藏]
在結構化數據中經常遇到列表或交易等非結構化列,比較典型的案例如下,此時一個(ge) 列表列會(hui) 包含字符串 或 一個(ge) 列表:
ID列 Tag列 用戶A tag1, tag2, tag3 用戶B tag3, tag5, tag6, tag10 用戶C tag3, tag5, tag6, tag10
如何對此類列進行編碼和提取特征呢?本文將給出一些基礎和進階的解決(jue) 方法。
方法1:進行基礎統計
在進行編碼時,最基礎的想法是可以統計個(ge) 數,個(ge) 數的多少可以直觀反應這列包含的信息的多少。
df['Tag列'].apply(len)
當然可以直接進行統計列表長度,也可以先計算每個(ge) tag的頻次,然後進行相應的統計。
- 優點:實現簡單,並沒有增加維度;
- 缺點:信息丟失較多
方法2:提取TFIDF
在進行編碼的過程中,可以使用onehot對單個(ge) 某個(ge) tag進行編碼,又或者使用直接使用TFIDF進行編碼。
- CounterVecoter:計算TF
- TFIDFVector:計算TF + IDF
from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfVectorizer
- 優(you) 點:可以對tag進行有效索引;
- 缺點:增加特征維度;
方法3:TFIDF + LDA/SVD
進行次數編碼容易造成維度爆炸,一種代替的方法是先進行TFIDF編碼,然後進行降維:LDA、SVD或者t-SNE降維。
from sklearn.decomposition import PCA from sklearn.decomposition import LatentDirichletAllocation from sklearn.decomposition import TruncatedSVD
- 優(you) 點:維度更低,特征更加有區分性。
- 缺點:降維需要額外的訓練時間;
方法4:句子嵌入
詞向量是一種非常有效的單詞編碼方法,可以對單詞進行映射。我們(men) 可以參考無監督句子編碼的方法,對tag進行嵌入,然後對多個(ge) tag進行聚合。
如果一個(ge) tag編碼為(wei) 100維度,則我們(men) 需要將任意多個(ge) tag都編碼為(wei) 100維度。這裏的聚合方法包括:
- Mean-pooling
- Max-pooling
- TFIDF-pooling
- SIF Embedding
上述實現過程需要額外訓練詞向量,如果使用深度學習(xi) 框架實現會(hui) 更加快速。
- 優點:維度更加可控,語義更加完整。
- 缺點:不適用tag亂序的情況
方法5:頻繁項聚類
對於(yu) tag列可以作為(wei) 集合進行處理,可以參考頻繁項挖掘的方法進行聚類操作。頻繁項集聚類提供了一個(ge) 減少維度,聚類之後的聚類類別可以單獨當做類別變量。
相應簇由包含頻繁項集,當然也可以使用文本聚類的方法,比如層次聚類。
- 優點:可解釋性強,維度低;
- 缺點:需要額外編碼,聚類更新困難
方法6:PageRank
在多個(ge) tag進行編碼的過程,可以單獨計算每個(ge) tag的IDF,也就是權重。當然我們(men) 也可以將多個(ge) tag組合在一起視為(wei) 一個(ge) 圖。
比如tag1, tag2, tag3可以構建為(wei) 一個(ge) 三個(ge) 節點的有向圖,構建完成之後然後計算每個(ge) 節點的權重。
通過PageRank可以計算得到每個(ge) tag的權重,也可以得到所有tag得到的圖的核心節點。
- 優點:tag權重有意義,可解釋。
- 缺點:適用於tag間存有向的情況。
方法7:minihash或者LSH
如果將tag列表當做集合看待,我們(men) 可以使用minihash進行對集合進行編碼,然後使用LSH進行編碼。LSH包含多次哈希,最終可以將包含相同tag的列表哈希得到相同的桶中。
- 優點:適用於大規模和分布式數據集
- 缺點:需要手動設計哈希函數
評論已經被關(guan) 閉。