機器學習模型的泛化能力不足,有什麼改進思路?

二分類問題,採用Adaboost方法,80:20劃分訓練集和測試集進行交叉驗證。

通過調整基礎分類器的個數,訓練集的分類正確率控制在0.6~1.0範圍內時,測試集的分類正確率都在0.6左右徘徊,很難提升。

通過降低模型複雜度的方式,降低了訓練集的分類準確率,但並不能獲得更好的泛化能力(測試集表現),請問各位大神有什麼提升辦法?

多謝各位的回答,bow~

提問時為了簡單明了,已經做的一些嘗試沒有提到,補充說明一下哈:

1.關於模型選擇,已經做過,數據集本身線性不可分,用tree族和非線性kernal的svm效果都不錯,從效率出發選了tree族的,random forest和adaboost也做了比較,ada更好

2.關於模型的參數調優,可以嘗試的參數基本都做了grid search,上述是比較好的結果……

3.關於測試集正確率,可能我沒說明白,並不是在0.6~1.0波動,可以做到1.0, 但是為了獲得較好的泛化能力簡化模型,使其準確率從1.0下降到0.6的過程中,測試集上的效果並沒有提升

4.數據集本身有比較嚴重的imbalanced,所以其實得到比較高的正確率不難但並沒有意義(都預測為多數樣本的label即可),關鍵是要得到比較好的AUC。對於imbalance的問題,也通過採樣和權重兩個方面做了處理,上述是處理之後的結果……

5.幾位答主提到了特徵選擇和特徵提取,正在嘗試中,有好的結果了再上了更新……


謝邀。

基本思路就是:先把模型搞複雜,複雜到得到令你滿意的訓練誤差(訓練誤差要低於『令你滿意的測試誤差』),然後在慢慢調參、簡化模型、添加先驗和正則、改變數據維度、特徵提取等,直到測試誤差也滿足『低於令你滿意的測試誤差』。


1. Try different hyperparameters. Verify that your simple classifier is appropriate for AdaBoost.

2. Use a different model. Maybe the problem you"re trying to solve would be more easily learned by kernel SVM etc.

3. Look at your learning for each iteration. You might be overfitting without realizing it because you didn"t do early stopping.


對於題主的問題,從工程上看,也許可以從以下幾點改進:

1. feature engineering

2. imbalanced dataset

3. ensemble method

第3點目測提升空間不大,題主用的adaboost、rf已經算ensemble了,最多再試下gbdt,或者把這些模型級聯、線性加權試試?

第1點,建議試試 @Xinran He 在14年發表的論文 http://www.herbrich.me/papers/adclicksfacebook.pdf ,演算法可以用陳天奇大神開發的xgboost實現;另外不建議做太多特徵篩選

第2點,題主已經試過帶權採樣,其實還有很多方法可以試,可以參考以下鏈接:

不均勻正負樣本分布下的機器學習

https://www.quora.com/In-classification-how-do-you-handle-an-unbalanced-training-set


adaboost 好像可以設置基礎分類器的一些基本配置,看你只是更改基礎分類器的個數而已

另外你如果是一個二分類的問題,不知道你為什麼是用adaboost 是否做過model selection,如果沒有,最好先做一個model selection。

最後給個建議 提這類問題 最好把你一些基本的train data 貼點出來看看 不然很難給你建議


1.adaboost的演算法在泛化能力上已經比較強了,如果覺得演算法有問題,你可以試試隨機森林

2.這種情況,更多的是特徵選取不對,換什麼演算法都效果不大,要做一下特徵工程

3.0.6~1.0是個很大的區間,而且是在訓練集上,這樣還談什麼泛化能力,你train的跟猜的差不多呀,先把bias降下來再說把。


頻率派的模型,提升泛化能力一般就是各種正則。

但問題不一定是模型的泛化能力不足,很可能特徵設計不合理。

也有可能你的數據信噪比就是這麼樣了,無法繼續提升。

可以看一些錯分的case分析一下原因。


改進思路一般有兩個:

1、改進模型:

①、換演算法;

②、調參數。

2、做好數據預處理:

有一個好的數據集遠比有一個好的模型更為重要。這裡的「好」主要表現在兩方面:

①、做好特徵選擇;

②、做好數據離散化、異常值處理、缺失填充等。


一些簡單的,與數據集無關的方法:

(1)加入正則項

(2)數據中加入噪音

(3)訓練多個模型,然後以多個模型投票的結果做為最後結果(bagging);

再有就是根據數據集本身的結構特徵,構造一些方法:

(1)特徵選擇,減少輸入參數的數量

(2)特徵提取,把多個特徵合併為少數幾個特徵(例如PCA),同樣是為了減少輸入參數個數

(3)根據已知的數據性質,構造新的樣本,比如圖像具有微旋轉微平移不變性,那麼就可以通過旋轉和平移構建新樣本

(4)根據數據的結構特徵選擇適合的網路結構,例如圖像問題用CNN,時間序列問題用RNN


交叉驗證和最後測試差多少, 是不是差的特別大。

差的特別大先看特徵是否合理。

細點說:

這個一般是這麼分析的。

1. 先不考慮模型是否適用的問題, 對於大多數情況下(圖像領域不適用), 模型帶來的提升不是很大, 但是也不會有很大的損失, 正確率0.6 肯定不是分類器的問題, 那麼先排除分類器的問題。 (還有一種可能分類器是題主自己寫的, 。。。。那麼就需要考慮分類器的問題, 補充一句, 最好先不要用ada這種模型, 換個單模型的, 比如svm, 先進行摸底比較靠譜, 分析出來的結果也會比較透徹)

2. 在考慮過分類器之後, 如果正確率train和test差得多, 那麼要先cv , cv的結果一般來說和test的差距不會很大, 看題主的描述貌似沒有cv , 直接用train的結果和test的結果比較, 這是比較沒有意義的一件事, 因為一般的模型train的結果都會高很多。 當然也可以不cv , 直接留一些dev , 比如 6:2:2 = train:dev:test。

3. 這裡先討論cv和test 比較一致的情況,這個沒什麼說的, 回去對著cv調就好了, 而且這裡在順帶著說一下, 用正確率衡量結果, 而且是一個不平衡的結果是一個非常傻逼的行為, 非常傻逼, 可選的是auc , 如果是具體業務的話, pr 也是一個不錯的選擇, 而且cv也可以看得出來數據集sample 等其他步驟有沒有問題。

4. 如果是cv 和test 不一致, 那麼這個就是特徵的問題, 可能的原因是特徵裡面有時間相關的特徵, 影響了最終的結果。 這種情況怎麼辦呢, 要不然就是盲調, 就是大致根據cv再猜測一下test的情況, 要不然就是研究一下特徵具體設計哪裡有問題。 還有, 這種情況可以實用一下高斯NB, 說不定有奇效。

至於前面大哥說的, 什麼加正則, 加這個加那個的, 我建議還是別試。 比較值得試的是降維、白化, ensemble 啥的最後做。


Feature selection

Parameter tuning

Ensemble method


你的意思是在訓練集可以做到準確率是1,在降低訓練集準確率的過程中,測試集沒有提升?

那麼跟泛化能力相關的驗證集丟到哪裡了。如果嫌訓練集多了,分一點給驗證集。驗證集多,用k fold評價時考慮到泛化性就更多。 驗證集驗證集,就像是專家打分,打出來高就是高,當然用在其他數據不見得,但你數據就這麼點。

測試集都已經是正版發售了,平民玩家給出的反饋。。。我認為多看看驗證集上的結果吧。。。

至於驗證集和測試集的表現差別大意味著什麼。。。

我認為只能說明:『outlier』存在

但這個問題造成這一結果有幾個可能:

1.如果你測試集樣本少,可能選到了outlier。。。

2.如果在某個驗證集fold中有outlier,造成驗證集交叉驗證的時候由於kfold間樣本權重不權衡,導致了結果朝著某個方向偏斜。而測試集沒有outlier。造成結果差異大

等等等...

但我認為,所有的問題都由於樣本有『outlier』造成的。為啥打引號。因為不見得就是有outlier,而是在你的模型中他是outlier。

解決方法很自然:

1.試圖在預處理階段消除這種outlier造成的影響。

2.找個把這個outlier接回家的新模型。相應於adaboost就是換分類器唄(只能挨個試)

3.試圖調試k fold過程找到哪個fold是在多種分類器中都顯著異常於其他folds的,然後確定哪些樣本是可能「有問題」的,剔除掉。

最後,我認為還是你樣本不夠或者樣本有錯。


首先,在測試集上面結果是0.6~1之間是一個很大的範圍,你可以將多次的訓練結果求個平均數做為你的結果!

其次,你的正確率這麼大的跳動,有沒有思考過是為什麼?你的特徵提取的是否足夠?是否重要?

最後,如果你的結果在測試集中在0.6左右,其實說明你這個2分類演算法只不過比隨機選出的結果好了一點點,這樣的結果沒有更深入的優化,拿到真實的數據去,基本上正確率又要下降很多!還談去增強他的泛化能力?建議你還是先優化你的演算法。

這裡提出一個簡要的優化思路:

1)業務的理解

2)樣本數據覆蓋率如何?是否具有...

3)數據的清洗?

4)特徵的提取?

5)演算法的挑選,多嘗試!

—————————————————

請各位指正。


1 train test sample 按照0.8 0.2劃分的話 train sample 能不能包括樣本的大部分特徵 重新分類後訓練的模型會不會差得比較遠

2 每個classifier 應該都有用來調節model complexity 的參數 調整參數可能會有效果。


調參減小模型複雜度減少過擬合影響,

增加特徵優化模型提高模型準確率。


再加一些模型把結果平均下?


看了幾個答案,提到正則化和validation,這是防止過擬合的倆手段,另外還有人提到調參,這不挨著啊親。題主問的是泛化誤差,是Bound問題,理論。所以,找好的guarantee,推新的演算法,去看看deepboosting就知道了。

題主查查:PAC learnable,VC dimension,Rademacher complexity,margin theory。應該就夠了。


推薦閱讀:

目前,機器翻譯準確率已經提高到 85% 左右,再進一步提升的主要難點在哪?
罰函數法和拉格朗日乘子法的區別?
為什麼基於貝葉斯優化的自動調參沒有大範圍使用?
為什麼梯度下降能找到最小值?

TAG:數據挖掘 | 機器學習 |