2013-04-01 21 views
0

scikit-learn的新功能和我正在處理的數據如下。結合創建SVM向量的多個參數

data[0] = {"string": "some arbitrary text", "label1": "orange", "value1" : False } 
data[0] = {"string": "some other arbitrary text", "label1": "red", "value1" : True } 

對於單行文本有CountVectorizer和管道DictVectorizerTfidfTransformer之前。這些輸出可以連接在一起,我希望以下警告:任何文本我不想在重要性上與特定的,有限的和明確定義的參數相同。

最後,一些其他的問題,可能與

  • 可能這個數據結構表明它SVM核是最好的?
  • 或者在這種情況下,隨機森林/決策樹,DBN還是貝葉斯分類器可能會做得更好?或者是Ensemble method? (輸出爲multi-class
  • 我看到feature union有一個即將推出的功能,但是這是針對相同的數據運行不同的方法併合並它們。
  • 我應該使用feature selection嗎?

參見:

回答

1

所有分類中scikit學習(*)預計樣品平坦特徵表示,所以你」你可能想把你的string功能變成一個矢量。首先,讓我們得到一些不正確的假設的方式進行:

  • DictVectorizer不是處理「文本行」,但對於任意的符號特徵。
  • CountVectorizer也不是用於處理行,而是用於整個文本文檔。
  • 特徵是否「重要性相等」主要取決於學習算法,儘管使用核化SVM,您可以爲特徵分配人爲的小權重,使其點特徵產生不同。不過,我不是說這是個好主意。

有處理這類數據的方法有兩種:

  1. 構建FeatureUnionCountVectorizer(或TfidfVectorizer)爲您的文本數據和附加功能DictVectorizer的。
  2. 手動將文本數據拆分爲單詞,然後將每個單詞用作DictVectorizer中的一個功能,例如,

    {"string:some": True, "string:arbitrary": True, "string:text": True, 
    "label1": "orange", "value1" : False } 
    

那麼相關的問題:

  • 可能這個數據結構表明它SVM核是最好的?

既然你處理文本數據,嘗試LinearSVC第一和2度的多項式內核,如果它不能正常工作。 RBF內核與文本數據不匹配,立方體或更高階的多核內核傾向於過度擬合。作爲內核的替代方案,您可以手動構建各個功能的產品並在其上進行培訓LinearSVC;有時候,這比內核更好。它還擺脫了功能重要性問題,因爲LinearSVC瞭解每個特徵的權重。

  • 或者在這種情況下,隨機森林/決策樹,DBN或貝葉斯分類器可能會做得更好嗎?

這是不可能告訴沒有嘗試。不幸的是,scikit-learn的隨機森林和dtrees不處理稀疏矩陣,所以它們很難申請。 DBN沒有實現。

  • 我應該使用功能選擇嗎?

無法看到數據而無法分辨。

(*)如果您實現自定義內核,除了SVM之外,這是一個高級主題,我現在不討論它。

+0

感謝您徹底回答特定問題和一般問題。 LinearSVC可以具有類別權重[1]。你爲什麼推薦?還是你不推薦,因爲這是一個數據特定的問題? [1] - http://scikit-learn.sourceforge.net/stable/modules/generated/sklearn.svm.LinearSVC.html#sklearn.svm.LinearSVC –

+0

我不推薦針對'LinearSVC',我'全部用於處理文本數據。課堂重量與此無關。 –

+0

對不起,我的意思是我試圖澄清你反對使用權重。 「......儘管使用核化的SVM,你可以爲特徵賦予人爲的小權重,使它的點積不同,但我並不是說這是個好主意。」再次感謝。 –