1. 程式人生 > >skiti-learn Adaboost類庫

skiti-learn Adaboost類庫

skiti-learn的Adaboost庫中包括兩個,AdaboostClassifier(分類)和AdaboostRegressor(迴歸)。AdaboostClassifier有兩種分類演算法實現,SAMME和SAMME.R;AdaboostRegressor只有Adaboost.R2。針對Adaboost調參,主要對兩部分內容,第一部分是對我們Adaboost框架調參,第二部分是對我們選擇的弱分類器進行調參。

  1. AdaboostClassifier和AdaboostRegressor框架引數
    1)base_estimator:
    AdaboostClassifier和AdaboostRegressor均有的引數,即弱學習器。理論上支援任何分類或者回歸學習器,不過需要支援樣本權重,我們一般常用CART決策樹或者神經網路MLP。預設是決策樹,如果選擇AdaboostCLassifier的演算法是 SAMME.R,則選擇的弱分類器還 需要支援概率預測,也就是在scikit-learn中弱分類學習器對應的預測方法除了predict還需要有predict_proba。
    2)algorithm:
    這個引數只有AdaboostClassifier有。主要原因是skiti-learn實現了兩種Adaboost分類器,SAMME和SAMME.R。兩種的主要區別是弱學習器權重的度量,SAMME使用的二分類的Adaboost演算法的擴充套件,即樣本集的分類效果作為弱學習器權重,而SAMME.R使用了對樣本集分類的預測概率大小來作為弱學習器權重。由於SAMME.R使用了概率度量的連續值,迭代一般比SAMME快,因此AdaBoostClassifier的預設演算法algorithm的值也是SAMME.R。我們一般使用預設的SAMME.R就夠了,但是要注意的是使用了SAMME.R, 則弱分類學習器引數base_estimator必須限制使用支援概率預測的分類器。SAMME演算法則沒有這個限制。
    3)loss:
    這個引數只有AdaboostRegressor有,SAMME.R2演算法需要,有‘linear’線性,‘square’平方,以及‘exponential’指數三種選擇。預設為線性,一般線性就可以了,它對應了我們對第k個弱分類器的中第i個樣本的誤差的處理,即:如果是線性誤差,則eki=|yi−Gk(xi)|/Ek;如果是平方誤差,則eki=(yi−Gk(xi))²/E2;如果是指數誤差,則eki=1−exp(−yi+Gk(xi))/Ek),Ek為訓練集上的最大誤差Ek=max|yi−Gk(xi)|i=1,2…m
    4)n_estimators:
    AdaBoostClassifier和AdaBoostRegressor都有,是我們弱學習器的最大迭代次數,或者最大弱學習器的個數。如果太小則容易欠擬合,太大容易過擬合,一般要選擇一個合適的值,預設為50。
    5)learning_rate:
    AdaBoostClassifier和AdaBoostRegressor都有,即每個弱學習器的權重縮減係數ν。我們的強學習器的迭代公式為fk(x)=fk−1(x)+ν αkGk(x)。ν的取值範圍為0<ν≤1。對於同樣的訓練集擬合效果,較小的νν意味著我們需要更多的弱學習器的迭代次數。通常我們用步長和迭代最大次數一起來決定演算法的擬合效果。所以這兩個引數n_estimators和learning_rate要一起調參。一般來說,可以從一個小一點的νν開始調參,預設是1。

  2. AdaBoostClassifier和AdaBoostRegressor弱學習器引數
    由於選擇的弱學習器不同,對應的學習器的引數也不同。下面僅討論決策樹弱學習器的引數。 DecisionTreeClassifier和DecisionTreeRegressor的引數基本類似,在scikit-learn決策樹演算法類庫這篇文章中我們對這兩個類的引數做了詳細的解釋。
    1)劃分時需要考慮的最大特徵數max_features:
    預設是"None",意味著劃分時考慮所有的特徵數;如果是"log2"意味著劃分時最多考慮log2N個特徵;如果是"sqrt"或者"auto"意味著劃分時最多考慮√N個特徵。如果是整數,代表考慮的特徵絕對數。如果是浮點數,代表考慮特徵百分比,即考慮(百分比xN)取整後的特徵數。一般來說,如果樣本特徵數不多,比如小於50,我們用預設的"None"就可以了,如果特徵數非常多,我們可以靈活使用剛才描述的其他取值來控制劃分時考慮的最大特徵數,以控制決策樹的生成時間。
    2)決策樹最大深max_depth:
    預設可以不輸入,不輸入就是不限制子樹的深度。一般情況,資料少或者特徵少可以不管這個值,如果模型樣本量多,特徵也多的情況下,推薦限制這個最大深度,具體的取值取決於資料的分佈。常用的可以取值10-100之間。
    3)內部節點再劃分所需要的最小樣本數min_samples_leaf:
    這個值限制了子樹繼續劃分,如果某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特徵來進行劃分。 預設是2.如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。
    4)葉子節點最少樣本數min_samples_leaf:
    這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小於樣本數,則會和兄弟節點一起被剪枝。 預設是1,可以輸入最少的樣本數的整數,或者最少樣本數佔樣本總數的百分比。如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。
    5)葉子節點最小的樣本權重和min_weight_fraction_leaf:
    這個值限制了葉子節點所有樣本權重和的最小值,如果小於這個值,則會和兄弟節點一起被剪枝。 預設是0,就是不考慮權重問題。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分佈類別偏差很大,就會引入樣本權重。
    6)最大葉子節點數max_leaf_nodes:
    通過限制最大葉子節點數,可以防止過擬合,預設是"None”,即不限制最大的葉子節點數。如果加了限制,演算法會建立在最大葉子節點數內最優的決策樹。如果特徵不多,可以不考慮這個值,但是如果特徵分成多的話,可以加以限制,具體的值可以通過交叉驗證得到。