1. 程式人生 > >如何解決過擬合 與欠擬合

如何解決過擬合 與欠擬合

下面這張經典的圖展示了欠擬合(第一個)與過擬合(第三個)。
這裡寫圖片描述

欠擬合

模型在訓練集上學習的不夠好,經驗誤差大,稱為欠擬合。模型訓練完成後,用訓練資料進行測試,如果錯誤率高,我們就很容易發現模型還是欠擬合的。

解決辦法:

  • 增加訓練次數。
  • 新增其他特徵項,例如,組合特徵、泛化特徵、相關性特徵。
  • 新增多項式特徵,例如將線性模型通過新增二次項或者三次項使模型泛化能力更強。
  • 減少正則化引數,正則化的目的是防止過擬合。
  • 過擬合

    當模型對訓練集學習得太好的時候(學習資料集通性的時候,也學習了資料集上的特性,導致模型在新資料集上表現差,也就是泛化能力差),此時表現為經驗誤差很小,但泛化誤差很大,這種情況稱為過擬合。

    解決辦法:

  • 正則化
    正則化方法包括L0正則、L1正則和L2正則。
    L0範數是指向量中非0的元素的個數。L1範數是指向量中各個元素絕對值之和,也叫“稀疏規則運算元”(Lasso regularization)。兩者都可以實現稀疏性。
    L2範數是指向量各元素的平方和然後求平方根。可以使得W的每個元素都很小,都接近於0,但與L1範數不同,它不會讓它等於0,而是接近於0。L2正則項起到使得引數w變小加劇的效果。
  • 剪枝
    剪枝是決策樹中一種控制過擬合的方法,預剪枝通過在訓練過程中控制樹深、葉子節點數、葉子節點中樣本的個數等來控制樹的複雜度。後剪枝則是在訓練好樹模型之後,採用交叉驗證的方式進行剪枝以找到最優的樹模型。
  • 提前終止迭代
    主要是用在神經網路中的,在神經網路的訓練過程中我們會初始化一組較小的權值引數,此時模型的擬合能力較弱,通過迭代訓練來提高模型的擬合能力,隨著迭代次數的增大,部分的權值也會不斷的增大。如果我們提前終止迭代可以有效的控制權值引數的大小,從而降低模型的複雜度。
  • 上面的幾種方法都是操作在一個模型上 ,通過改變模型的複雜度來控制過擬合。另一種可行的方法是結合多種模型來控制過擬合。

  • Bagging和Boosting
    是機器學習中的整合方法,多個模型的組合可以弱化每個模型中的異常點的影響,保留模型之間的通性,弱化單個模型的特性。
  • Dropout
    是深度學習中最常用的控制過擬合的方法,主要用在全連線層處。在一定的概率上(通常設定為0.5,原因是此時隨機生成的網路結構最多)隱式的去除網路中的神經元,但會導致網路的訓練速度慢2、3倍,而且資料小的時候,Dropout的效果並不會太好。因此只會在大型網路上使用。
  • 				<script>
    					(function(){
    						function setArticleH(btnReadmore,posi){
    							var winH = $(window).height();
    							var articleBox = $("div.article_content");
    							var artH = articleBox.height();
    							if(artH > winH*posi){
    								articleBox.css({
    									'height':winH*posi+'px',
    									'overflow':'hidden'
    								})
    								btnReadmore.click(function(){
    									if(typeof window.localStorage === "object" && typeof window.csdn.anonymousUserLimit === "object"){
    										if(!window.csdn.anonymousUserLimit.judgment()){
    											window.csdn.anonymousUserLimit.Jumplogin();
    											return false;
    										}else if(!currentUserName){
    											window.csdn.anonymousUserLimit.updata();
    										}
    									}
    									
    									articleBox.removeAttr("style");
    									$(this).parent().remove();
    								})
    							}else{
    								btnReadmore.parent().remove();
    							}
    						}
    						var btnReadmore = $("#btn-readmore");
    						if(btnReadmore.length>0){
    							if(currentUserName){
    								setArticleH(btnReadmore,3);
    							}else{
    								setArticleH(btnReadmore,1.2);
    							}
    						}
    					})()
    				</script>
    				</article>
    

    下面這張經典的圖展示了欠擬合(第一個)與過擬合(第三個)。
    這裡寫圖片描述