2010-08-10 71 views
23

在一個特定的應用程序中,我需要機器學習(我知道我在本科學習的內容)。我使用支持向量機並解決了問題。它的工作正常。支持向量機(SVM)的一些實現細節

現在我需要改進系統。這裏存在的問題有:

  1. 我每週都會得到額外的培訓示例。現在系統開始使用更新的示例(舊示例+新示例)進行新鮮訓練。我想讓它漸進式學習。使用以前的知識(而不是以前的例子)用新的例子來獲得新模型(知識)

  2. 對我的訓練例子有3個類。所以,每個訓練樣例都適用於這三個類中的一個。我想要「未知」類的功能。任何不適合這三類的東西都必須標記爲「未知」。但我不能把「未知」當成一個新班級,並提供這方面的例子。

  3. 假設實現了「未知」類。當類是「未知」時,應用程序的用戶輸入他認爲該類可能是什麼。現在,我需要將用戶輸入納入學習。我也不知道如何做到這一點。如果用戶輸入一個新的類別(即,一個不在訓練集合中的類別),它會有什麼不同?

我需要選擇一種新的算法還是支持向量機可以做到這一點? PS:我使用libsvm實現SVM。

回答

3
  1. 有算法來增量訓練SVM,但我不認爲libSVM實現這個。我認爲你應該考慮你是否真的需要這個功能。我認爲目前的方法沒有問題,除非培訓過程太慢。如果是這樣,你能否分批進行再培訓(即每100個新的例子)?
  2. 您可以使用libSVM生成類成員資格的概率。我認爲這可以用於多類分類,但我並不完全確定這一點。您需要確定某個閾值,在該閾值處分類不夠確定,然後輸出「未知」。我想,像最可能的和第二最有可能的類別之間的差異設置閾值將實現這一點。
  3. 我認爲libSVM可以擴展到任何數量的新類。但是,您的模型的準確性可能會因添加新類而受到影響。
+0

我不太確定增量算法。儘管我相信增量算法存在,但它們之間並不多見,因此尋找實現可能很困難。 – Cerin 2010-08-10 12:16:10

+0

@Chris S是的,我同意。這可能是因爲批量培訓通常是一個更簡單,更實用的解決方案。 – Stompchicken 2010-08-10 14:18:45

+0

圍繞libsvm進行遊戲時,看起來分配給所有類的概率總和總是等於1,所以你永遠不會有一個「未知」樣本對所有類都有低概率的情況。我甚至無法找到如何「欺騙」它給予所有班級相同的概率。 – Cerin 2010-08-11 17:33:58

8

我剛剛寫了我的答案使用與您的問題(1.,2.,3)相同的組織。

  1. SVMs能做到這一點 - 即增量學習嗎?多層感知器當然可以 - 因爲後續的訓練實例不會影響基本的網絡架構,它們只會引起權重矩陣值的調整。但支持向量機?在我看來,(理論上)一個額外的訓練實例可能會改變支持向量的選擇。但是,我不知道。

  2. 我想你可以很容易地解決這個問題,通過配置LIBSVM在一對多 - 即,作爲單級分類器。支持向量機單類分類器;將SVM應用於多類意味着它已被編碼以執行多個逐步的一對多分類,但是該算法一次又一次地被訓練(並測試)一個類。如果你這樣做,那麼在對測試集執行逐步執行之後留下的是「未知」 - 換言之,無論數據在執行多個連續的一類分類之後沒有被分類,其定義都是「未知的'班。

  3. 爲什麼不讓用戶猜測一個特徵(即只是另一個因變量)?唯一的另一種選擇是將其作爲班級標籤本身,而你並不希望這樣做。例如,您可以在數據矩陣「用戶類別猜測」中添加一列,並將其填充爲最有可能對那些不在「未知」類別中的數據點沒有任何影響的值,因此用戶不會提供猜測 - 這個值可能是'0'或'1',但實際上這取決於您如何將數據縮放和標準化)。

5

您的第一個項目可能是最困難的,因爲現在基本上沒有好的增量式SVM實現。

幾個月前,我還研究了在線遞增支持向量機算法。不幸的是,目前的實現狀態相當稀疏。我發現的只有Matlab example,OnlineSVR(一個只實現迴歸支持的論文項目)和SVMHeavy(僅支持二進制類)。

我沒有親自使用過它們中的任何一個。他們似乎都處於「研究玩具」階段。我甚至無法讓SVMHeavy編譯。

現在,您可能會擺脫定期批量培訓來整合更新。我也使用LibSVM,速度非常快,所以它應該是一個很好的替代品,直到實現一個適當的增量版本。

我也不認爲SVM可以默認爲「未知」樣本的概念建模。它們通常以一系列布爾分類器的形式工作,所以樣本最終被歸類爲某種東西,即使該樣本與以前看到的東西大不相同。可能的解決方法是對特徵的範圍進行建模,並隨機生成這些範圍之外的樣本,然後將這些樣本添加到您的訓練集中。

舉例來說,如果你有一個名爲「色」的屬性,其中有4最小值和123的最大值,那麼你可以添加這些到你的訓練設置

[({'color':3},'unknown'),({'color':125},'unknown')] 

給你支持向量機是什麼是「未知」顏色的概念。

2

即使這個問題可能已經過時,我覺得有必要提供一些額外的想法。

  1. 由於您的第一個問題已經被人回答了(沒有生產就緒的SVM,它實現增量學習,即使它是可能的),我會跳過它。 ;)

  2. 將'未知'添加爲類不是一個好主意。根據它的用途,原因是不同的。

    • 如果您使用的是「未知」類作爲一個標籤「這種情況還沒有被分類,但屬於已知類別之一」,那麼你的SVM深陷困境。原因是,libsvm構建了幾個二進制分類器並將它們組合在一起。因此,如果您有三個類 - 讓我們假設A,B和C - SVM通過將訓練示例分爲「分類爲A」和「任何其他類」來構建第一個二元分類器。後者顯然將包含來自「未知」類的所有示例。當試圖構建一個超平面時,'未知'(實際上屬於類'A')中的例子可能會導致SVM構建一個極小餘量的超平面,並且很難識別未來的A實例,即泛化性能會減少。這是由於這樣一個事實,即SVM將嘗試構建一個超平面,將超平面的大部分實例(正式標記爲'A')分離到超平面的一側,以及一些實例(正式標記爲「未知」的實例)另一邊 。

    • 如果您正在使用「未知」類來存儲所有類,但其類尚不知道SVM的示例,則會出現另一個問題。例如,SVM知道類A,B和C,但您最近獲得了兩個新類D和E的示例數據。由於這些示例未分類,並且SVM未知新類,因此您可能需要臨時存儲他們在'未知'。在這種情況下,'未知'類可能會引起麻煩,因爲它可能包含其特徵值的巨大變化的示例。這將使得創建良好的分離超平面變得非常困難,因此由此產生的分類器將很難識別D或E的新實例爲「未知」。屬於A,B或C的新實例的分類可能也會受到阻礙。

    總結:引入包含已知類的示例或幾個新類的示例的'未知'類將導致較差的分類器。我認爲在訓練分類器時最好忽略所有未分類的實例。

  3. 我會建議,你解決這個問題以外的分類算法。我被要求自己提供這個功能,並實現了一個單一的網頁,它顯示了所討論對象的圖像和每個已知類的按鈕。如果有問題的對象屬於尚未知曉的類,則用戶可以填寫另一個表單以添加新的類。如果他回到分類頁面,那個類別的另一個按鈕會神奇地出現。在實例被分類之後,它們可以用於訓練分類器。 (我用一個數據庫來存儲已知的類和參考哪個例子屬於哪個類,我實現了一個導出函數來使數據支持SVM。)

+0

我已經解決了未知類問題,然後纔將問題轉化爲迴歸問題。我將每個類映射到輸出域中的一個範圍,並將外部的所有內容都視爲未知。它聽起來像醜陋的黑客,但它工作:) – Pedrom 2013-03-07 20:21:51