簡體   English   中英

sklearn - 模型保持過度擬合

[英]sklearn - model keeps overfitting

我正在尋找關於我當前機器學習問題的最佳前進方法的建議

問題的概要和我所做的如下:

  • 我有900多個EEG數據試驗,每個試驗的時間長達1秒。 每個人都知道基本事實,並將狀態0和狀態1分類(40-60%分裂)
  • 每個試驗都經過預處理,我可以過濾和提取某些頻段的功率,這些組成了一組特征(特征矩陣:913x32)
  • 然后我用sklearn訓練模型。 在我使用0.2的測試大小的地方使用cross_validation。 使用rbf內核將分類器設置為SVC,C = 1,gamma = 1(我嘗試了許多不同的值)

你可以在這里找到一個縮短版的代碼: http//pastebin.com/Xu13ciL4

我的問題:

  • 當我使用分類器來預測我的測試集的標簽時,每個預測都是0
  • 列車精度為1,而測試設定精度約為0.56
  • 我的學習曲線圖看起來像這樣:

在此輸入圖像描述

現在,這似乎是過度擬合的經典案例。 然而,這里的過度擬合不太可能是由於樣本的特征數量不成比例(32個特征,900個樣本)。 我已經嘗試了很多方法來緩解這個問題:

  • 我嘗試過使用降維(PCA),因為我的樣本數量太多了,但是准確度得分和學習曲線圖看起來和上面一樣。 除非我將組件數量設置為低於10,否則列車精度開始下降,但鑒於您開始丟失信息,這是不是有點預期?
  • 我已經嘗試了規范化和標准化數據。 標准化(SD = 1)無助於改變訓練或准確度分數。 歸一化(0-1)會將訓練精度降低到0.6。
  • 我已經為SVC嘗試了各種C和gamma設置,但它們不會改變任何一個分數
  • 嘗試使用像GaussianNB這樣的其他估算器,甚至像adaboost這樣的集合方法。 沒變
  • 試圖使用linearSVC設置正則化方法,但沒有改善這種情況
  • 我嘗試使用theano通過神經網絡運行相同的功能,我的列車精度約為0.6,測試值約為0.5

我很高興繼續思考這個問題,但此時我正在尋找正確方向的推動。 我的問題可能在哪里,我可以做些什么來解決它?

完全有可能我的一組功能只是不區分這兩個類別,但我想在跳到這個結論之前嘗試其他一些選項。 此外,如果我的功能沒有區分,那么這將解釋低測試組分數,但在這種情況下如何獲得完美的訓練集分數? 那可能嗎?

我首先嘗試對參數空間進行網格搜索,但同時也在訓練集上使用k折交叉驗證(並將測試集保持在一邊)。 然后選擇一組參數,而不是從k折交叉驗證中推廣出最佳參數。 我建議將GridSearchCVStratifiedKFold一起使用(當將分類器作為估計器傳遞時,它已經是GridSearchCV的默認策略 )。

假設具有rbf的SVM可以完美地適合任何訓練集,因為VC維度是無限的。 因此,如果調整參數無助於減少過度擬合,那么您可能希望針對更簡單的假設嘗試類似的參數調整策略,例如線性SVM或您認為可能適合您的域的其他分類器。

正如你所提到的那樣,正規化絕對是個好主意。

對同一標簽的預測使我認為標簽不平衡可能是一個問題,在這種情況下,您可以使用不同的類權重。 因此,在SVM的情況下,每個類都獲得其自己的C懲罰權重。 sklearn中的一些估算器接受擬合參數,允許您設置樣本權重以設置單個訓練樣本的懲罰量。

現在,如果你認為這些特征可能是一個問題,我會通過查看f_classif提供的F值來使用特征選擇,並且可以使用像SelectKBest這樣的東西。 另一種選擇是通過交叉驗證來消除遞歸特征。 如果您使用sklearns Pipeline API,則功能選擇也可以包含在網格搜索中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM