17

我正在嘗試使用Spark的MLLib構建一個NaiveBayes分類器,該分類器將一組文檔作爲輸入。apache spark MLLib:如何構建字符串特徵的標記點?

我想放些東西作爲特徵(即作者,明確的標籤,關鍵字隱,類別),但看着the documentation似乎一個LabeledPoint只包含雙打,即它看起來像LabeledPoint[Double, List[Pair[Double,Double]]

相反,我從我的代碼的其餘部分輸出將是類似於LabeledPoint[Double, List[Pair[String,Double]]

我可以彌補自己的轉換,但它似乎很奇怪。我該如何處理這個使用MLLib?我相信答案在HashingTF類(即哈希特徵),但我不明白這是如何工作的,它似乎需要某種容量值,但我的關鍵字和主題列表是有效無界的(或更好,在開始時是未知的)。

回答

10

HashingTF使用hashing trick將潛在無限數量的要素映射到有界大小的向量。存在特徵碰撞的可能性,但是通過在構造函數中選擇更多的特徵,可以使其更小。

爲了不僅基於特徵的內容創建特徵,而且還基於一些元數據(例如,具有「貓」的標籤而不是文檔中的「貓」字),您可以輸入HashingTF類像'tag:cats'這樣的東西,這樣一個帶有單詞的標籤會散列到不同的單詞槽中。

如果您創建使用HashingTF特徵計數向量可以使用它們通過大於零的任意數設置爲1,您還可以使用IDF類,像這樣創造TF-IDF向量創造的詞的功能包:

val tfIdf = new IDF().fit(featureCounts).transform(featureCounts) 

在你的情況下,它看起來像你已經計算出每個文檔的字數。這不適用於HashingTF課程,因爲它旨在爲您做點數。

This paper有一些關於爲什麼特徵衝突在語言應用程序中沒有那麼多問題的爭論。基本原因是大多數單詞不常見(由於語言的屬性),並且碰撞與詞頻無關(由於哈希屬性),因此不太可能常見的單詞足以幫助使用模型,這些單詞都會散列到相同的插槽。

+0

謝謝,只是一個額外的說明:如果我理解正確,'HashingTF'中的'numFeatures'基本上被用作'mod'值,用於將特徵數量綁定到給定的最大值?如果是這樣,不應該只是'Double.MAX_VALUE'?或者是使用它的想法,即它可以將不同的特徵限制在給定的範圍內並限制交叉碰撞? (即在1..N中放置某種特徵,在N..2N中放置某些特徵,你會在同一種類中碰撞,但不是交叉類型) – riffraff 2014-12-16 09:21:54

+0

是的,計算看起來像'features [hash(feature) %numFeatures] + = 1'。創建的向量通常用作某個模型的輸入,所以使用'Double.MAX_VALUE'將意味着一個巨大的模型。哈希技巧的主要動機之一是減少內存。您當然可以按照您建議的方式創建功能,但我不確定如何評估這種方法的好處。 – mrmcgreg 2014-12-16 13:54:09

+0

當然啊我在想稀疏向量,所以沒有考慮數組的大小。謝謝你的幫助! – riffraff 2014-12-17 08:34:48