SVM
- 對資料進行歸一化 (simple scaling)
- 使用RBF kernel
- 使用cross_validation 和 grid_search得到最佳參數gamma和C
- 使用得到的最優C和gamma訓練訓練資料
- 測試
svm的C
C是懲罰系數,即對誤差的寬容度。一般可以選擇為:10^t , t=[- 4,4]就是0.0001 到10000。c越高,說明越不能容忍出現誤差,容易過拟合。C越小,容易欠拟合。C過大或過小,泛化能力變差
常用核函數
核函數參數設定
- 線性核函數:沒有專門需要設定的參數
-
多項式核函數:有三個參數。
-d用來設定多項式核函數的最高次項次數,也就是公式中的d,預設值是3,一般選擇1-11:1 3 5 7 9 11,也可以選擇2,4,6…。
-g用來設定核函數中的gamma參數設定,也就是公式中的gamma,預設值是1/k(特征數)。
-r用來設定核函數中的coef0,也就是公式中的第二個r,預設值是0。
- RBF核函數:有一個參數。-g用來設定核函數中的gamma參數設定,也就是公式中gamma,預設值是1/k(k是特征數)。
-
**sigmoid核函數又叫做S形核心 **:有兩個參數。
-g用來設定核函數中的gamma參數設定,也就是公式中gamma,預設值是1/k(k是特征數)。一般可選1 2 3 4
-r用來設定核函數中的coef0,也就是公式中的第二個r,預設值是0。一般可選 0.2 0.4 0.6 0.8 1
rbf核函數gamma :
gamma是選擇RBF函數作為kernel後,該函數自帶的一個參數。隐含地決定了資料映射到新的特征空間後的分布,gamma越大,支援向量越少,gamma值越小,支援向量越多。支援向量的個數影響訓練與預測的速度。
需要注意的就是gamma的實體意義,RBF的幅寬會影響每個支援向量對應的高斯的作用範圍,進而影響泛化性能。如果gamma設的太大,方差會很小,方差很小的高斯分布長得又高又瘦, 會造成隻會作用于支援向量樣本附近,對于未知樣本分類效果很差,存在訓練準确率可以很高,(如果讓方差無窮小,則理論上,高斯核的SVM可以拟合任何非線性資料,但容易過拟合)而測試準确率不高的可能,就是通常說的過訓練;而如果設的過小,則會造成平滑效應太大,無法在訓練集上得到特别高的準确率,也會影響測試集的準确率。
使用grid Search調參比較簡單,詳見交叉驗證與網格搜尋算法,而且看起來很naïve。有兩個優點:
可以得到全局最優,(C,gamma)互相獨立,便于并行化進行。缺點:耗時!!!
KNN
超參數為:n_neighbors /weight/p/algorithm(隻有當weight=distance的時候,p值才有意義)
- n_neighbors:取鄰近點的個數k。k取1-9測試
- weight:距離的權重,uniform:一緻的權重;distance:距離的倒數作為權重
- p:闵可斯基距離的p值; p=1:即歐式距離;p=2:即曼哈頓距離;p取1-6測試
-
algorithm: ‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’
在實踐中,選擇較小的鄰居個數(例如3或5個)效果較好,
sklearn中預設使用歐氏距離建構KNN模型速度很快,若訓練集很大(特征數多或樣本數多),預測速度可能較慢.
對于稀疏資料集(大多數特征值為0),KNN效果很不好.
Naive Bayes
- alpha : 先驗平滑因子,預設等于1,當等于1時表示拉普拉斯平滑。隻有在伯努利模型和多項式模型中存在
Decision Trees
- 特征選擇标準criterion:使用"gini"或者"entropy",前者代表基尼系數,後者代表資訊增益。一般說使用預設的基尼系數"gini",即CART算法。除非要使用ID3,C4.5的最優特征選擇方法。
- 特征劃分點選擇标準splitter:使用"best"或者"random"。前者在特征的所有劃分點中找出最優的劃分點。後者是随機的在部分劃分點中找局部最優的劃分點。預設的"best"适合樣本量不大的時候,而如果樣本資料量非常大,此時決策樹建構推薦"random"
- 劃分時考慮的最大特征數max_features:可以使用很多種類型的值,預設是"None",意味着劃分時考慮所有的特征數;如果是"log2"意味着劃分時最多考慮log2N個特征;如果是"sqrt"或者"auto"意味着劃分時最多考慮√N個特征。如果是整數,代表考慮的特征絕對數。如果是浮點數,代表考慮特征百分比,即考慮(百分比xN)取整後的特征數。其中N為樣本總特征數。一般來說,如果樣本特征數不多,比如小于50,用預設的"None"就可以了,如果特征數非常多,可以靈活使用剛才描述的其他取值來控制劃分時考慮的最大特征數,以控制決策樹的生成時間。
- 決策樹最大深max_depth:預設可以不輸入,決策樹在建立子樹的時候不會限制子樹的深度。一般來說,資料少或者特征少的時候可以不管這個值。如果模型樣本量多,特征也多的情況下,推薦限制這個最大深度,具體的取值取決于資料的分布。常用的可以取值10-100之間。
- 内部節點再劃分所需最小樣本數min_samples_split:這個值限制了子樹繼續劃分的條件,如果某節點的樣本數少于min_samples_split,則不會繼續再嘗試選擇最優特征來進行劃分。 **預設是2.**如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。若有大概10萬樣本,建立決策樹時,可選擇min_samples_split=10作為參考。
- 葉子節點最少樣本數min_samples_leaf:這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小于樣本數,則會和兄弟節點一起被剪枝。 預設是1,可以輸入最少的樣本數的整數,或者最少樣本數占樣本總數的百分比。如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。之前的10萬樣本使用min_samples_leaf的值為5,僅供參考。
- 葉子節點最小的樣本權重和min_weight_fraction_leaf:這個值限制了葉子節點所有樣本權重和的最小值,如果小于這個值,則會和兄弟節點一起被剪枝。 預設是0,就是不考慮權重問題。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分布類别偏差很大,就會引入樣本權重。
- 最大葉子節點數max_leaf_nodes:通過限制最大葉子節點數,可以防止過拟合,預設是"None”,即不限制最大的葉子節點數。如果加了限制,算法會建立在最大葉子節點數内最優的決策樹。如果特征不多,可以不考慮這個值,但是如果特征分成多的話,可以加以限制,具體的值可以通過交叉驗證得到。
-
類别權重class_weight:指定樣本各類别的的權重,主要是為了防止訓練集某些類别的樣本過多,導緻訓練的決策樹過于偏向這些類别。這裡可以自己指定各個樣本的權重,或者用“balanced”,如果使用“balanced”,則算法會自己計算權重,樣本量少的類别所對應的樣本權重會高。當然,如果你的樣本類别分布沒有明顯的偏倚,則可以不管這個參數,選擇預設的"None"
節點劃分最小不純度min_impurity_split:這個值限制了決策樹的增長,如果某節點的不純度(基尼系數,資訊增益,均方差,絕對差)小于這個門檻值,則該節點不再生成子節點。即為葉子節點 。
資料是否預排序presort:布爾值,預設是False不排序。一般來說,如果樣本量少或者限制了一個深度很小的決策樹,設定為true可以讓劃分點選擇更加快,決策樹建立的更加快。如果樣本量太大的話,反而沒有什麼好處。問題是樣本量少的時候,速度本來就不慢。是以這個值一般懶得理它就可以了。
最重要的是:
最大特征數max_features,
最大深度max_depth,
内部節點再劃分所需最小樣本數min_samples_split
葉子節點最少樣本數min_samples_leaf
RandomForest
1. RF的Bagging架構的參數:
- n_estimators: 弱學習器的最大疊代次數,或者說最大的弱學習器的個數。一般來說n_estimators太小,容易欠拟合,n_estimators太大,計算量會太大,并且n_estimators到一定的數量後,再增大n_estimators獲得的模型提升會很小,是以一般選擇一個适中的數值。預設是100。在實際調參的過程中,我們常常将n_estimators和learning_rate一起考慮。
- oob_score:即是否采用袋外樣本來評估模型的好壞。預設False。個人推薦設定為True,因為袋外分數反應了一個模型拟合後的泛化能力。
-
criterion: 即CART樹做劃分時對特征的評價标準。分類模型和回歸模型的損失函數是不一樣的。分類RF對應的CART分類樹預設是基尼系數gini,另一個可選擇的标準是資訊增益。回歸RF對應的CART回歸樹預設是均方差mse,另一個可以選擇的标準是絕對值差mae。一般來說選擇預設的标準就已經很好的。
重要的參數是 n_estimators,即RF最大的決策樹個數。
2. RF決策樹參數與決策樹參數相同,參見上面的DecisionTree, 除去splitter,在結點進行分裂的時候,先随機取固定個特征,然後選擇最好的分裂屬性這種方式。
scikit-learn中實作了兩種随機森林算法,一種是RandomForest,另外一種是ExtraTrees。
ExtraTrees在最好的幾個(依然可以指定sqrt與log2)分裂屬性中随機選擇一個來進行分裂。
LogisticRegression
- 懲罰項penalty: ‘l1’ or ‘l2’, 預設: ‘l2’ ,在調參時如果我們主要的目的隻是為了解決過拟合,一般penalty選擇L2正則化就夠了。但是如果選擇L2正則化發現還是過拟合,即預測效果差的時候,就可以考慮L1正則化。如果模型的特征非常多,希望一些不重要的特征系數歸零,進而讓模型系數稀疏化,也可以使用L1正則化。
- solver優化方法
- liblinear:使用了開源的liblinear庫實作,内部使用了坐标軸下降法來疊代優化損失函數。
- lbfgs:拟牛頓法的一種,利用損失函數二階導數矩陣即海森矩陣來疊代優化損失函數。
- newton-cg:牛頓法家族的一種,利用損失函數二階導數矩陣即海森矩陣來疊代優化損失函數。
- sag:即随機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的差別是每次疊代僅僅用一部分的樣本來計算梯度,适合于樣本資料多的時候,SAG是一種線性收斂算法,這個速度遠比SGD快。
- C:正則化系數λ的倒數,float類型,預設為1.0。必須是正浮點型數。像SVM一樣,越小的數值表示越強的正則化。
- class_weight:用于标示分類模型中各種類型的權重,可以是一個字典或者’balanced’字元串,預設為不輸入,也就是不考慮權重,即為None。如果選擇輸入的話,可以選擇balanced讓類庫自己計算類型權重,或者自己輸入各個類型的權重。舉個例子,比如對于0,1的二進制模型,我們可以定義class_weight={0:0.9,1:0.1},這樣類型0的權重為90%,而類型1的權重為10%。如果class_weight選擇balanced,那麼類庫會根據訓練樣本量來計算權重。某種類型樣本量越多,則權重越低,樣本量越少,則權重越高。當class_weight為balanced時,類權重計算方法如下:n_samples / (n_classes * np.bincount(y))。n_samples為樣本數,n_classes為類别數量,np.bincount(y)會輸出每個類的樣本數,例如y=[1,0,0,1,1],則np.bincount(y)=[2,3]。
- max_iter:算法收斂最大疊代次數,int類型,預設為10。僅在正則化優化算法為newton-cg, sag和lbfgs才有用,算法收斂的最大疊代次數。
- multi_class:分類方式選擇參數,str類型,可選參數為ovr和multinomial,預設為ovr。ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)。如果是二進制邏輯回歸,ovr和multinomial并沒有任何差別,差別主要在多元邏輯回歸上。如果選擇了ovr,則4種損失函數的優化方法liblinear,newton-cg,lbfgs和sag都可以選擇。但是如果選擇了multinomial,則隻能選擇newton-cg, lbfgs和sag了。
注:從上面的描述可以看出,newton-cg, lbfgs和sag這三種優化算法時都需要損失函數的一階或者二階連續導數,是以不能用于沒有連續導數的L1正則化,隻能用于L2正則化。而liblinear通吃L1正則化和L2正則化。
liblinear适用于小資料集,而sag和saga适用于大資料集因為速度更快。
XGBoost
XGBoost的作者把所有的參數分成了三類:
- 通用參數:宏觀函數控制。
- Booster參數:控制每一步的booster(tree/regression)。
-
學習目标參數:控制訓練目标的表現。
參見這篇博文機器學習系列(12)_XGBoost參數調優完全指南(附Python代碼)
要調節的參數有兩種:樹參數和boosting參數。learning rate沒有什麼特别的調節方法,因為隻要我們訓練的樹足夠多learning rate總是小值來得好。
選擇一個相對來說稍微高一點的learning rate。一般預設的值是0.1,不過針對不同的問題,0.05到0.2之間都可以
決定目前learning rate下最優的決定樹數量。它的值應該在40-70之間。記得選擇一個你的電腦還能快速運作的值,因為之後這些樹會用來做很多測試和調參。
接着調節樹參數來調整learning rate和樹的數量。我們可以選擇不同的參數來定義一個決定樹,降低learning rate,同時會增加相應的決定樹數量使得模型更加穩健
-
固定 learning rate和需要估測的決定樹數量
為了決定boosting參數,我們得先設定一些參數的初始值,可以像下面這樣:
-
min_ samples_ split=500:
這個值應該在總樣本數的0.5-1%之間,由于我們研究的是不均等分類問題,我們可以取這個區間裡一個比較小的數,500。
-
min_ samples_ leaf=50:
可以憑感覺選一個合适的數,隻要不會造成過度拟合。同樣因為不均等分類的原因,這裡我們選擇一個比較小的值。
- max_ depth=8: 根據觀察數和自變量數,這個值應該在5-8之間。這裡我們的資料有87000行,49列,是以我們先選深度為8。
- max_ features=’sqrt’: 經驗上一般都選擇平方根
- subsample=0.8: 開始的時候一般就用0.8
-
注意我們目前定的都是初始值,最終這些參數的值應該是多少還要靠調參決定。現在我們可以根據learning rate的預設值0.1來找到所需要的最佳的決定樹數量,可以利用網格搜尋(grid search)實作,以10個數遞增,從20測到80。
- 樹參數可以按照這些步驟調節:
- 調節max_depth和 num_samples_split
- 調節min_samples_leaf
- 調節max_features
需要注意一下調參順序,對結果影響最大的參數應該優先調節,就像max_depth和num_samples_split。
-
調節子樣本比例來降低learning rate
接下來就可以調節子樣本占總樣本的比例
param_test5 = {‘subsample’:[0.6,0.7,0.75,0.8,0.85,0.9]}
MLPClassifier
參數說明:
- hidden_layer_sizes :例如hidden_layer_sizes=(100, 50),表示有兩層隐藏層,第一層隐藏層有100個神經元,第二層有50個神經元。
- activation :激活函數,{‘identity’, ‘logistic’, ‘tanh’, ‘relu’}, 預設relu
- identity:f(x) = x
- logistic:其實就是sigmod,f(x) = 1 / (1 + exp(-x)).
- tanh:f(x) = tanh(x).
- relu:f(x) = max(0, x)
- solver: {‘lbfgs’, ‘sgd’, ‘adam’}, 預設adam,用來優化權重
- lbfgs:quasi-Newton方法的優化器
- sgd:随機梯度下降
-
adam: Kingma, Diederik, and Jimmy Ba提出的機遇随機梯度的優化器
注意:預設solver ‘adam’在相對較大的資料集上效果比較好(幾千個樣本或者更多),對小資料集來說,lbfgs收斂更快效果也更好。
- alpha :float,可選的,預設0.0001,正則化項參數
- batch_size : int , 可選的,預設’auto’,随機優化的minibatches的大小batch_size=min(200,n_samples),如果solver是’lbfgs’,分類器将不使用minibatch
- learning_rate :學習率,用于權重更新,隻有當solver為’sgd’時使用,{‘constant’,’invscaling’, ‘adaptive’}, 預設constant
- ‘constant’: 有’learning_rate_init’給定的恒定學習率
- ‘incscaling’:随着時間t使用’power_t’的逆标度指數不斷降低學習率learning_rate_ ,effective_learning_rate = learning_rate_init / pow(t, power_t)
- ‘adaptive’:隻要訓練損耗在下降,就保持學習率為’learning_rate_init’不變,當連續兩次不能降低訓練損耗或驗證分數停止升高至少tol時,将目前學習率除以5.
- power_t: double, 可選, default 0.5,隻有solver=’sgd’時使用,是逆擴充學習率的指數.當learning_rate=’invscaling’,用來更新有效學習率。
- max_iter: int,可選,預設200,最大疊代次數。
- random_state:int 或RandomState,可選,預設None,随機數生成器的狀态或種子。
- shuffle: bool,可選,預設True,隻有當solver=’sgd’或者‘adam’時使用,判斷是否在每次疊代時對樣本進行清洗。
- tol:float, 可選,預設1e-4,優化的容忍度
- learning_rate_int:double,可選,預設0.001,初始學習率,控制更新權重的補償,隻有當solver=’sgd’ 或’adam’時使用。
- verbose : bool, 可選, 預設False,是否将過程列印到stdout
- warm_start : bool, 可選, 預設False,當設定成True,使用之前的解決方法作為初始拟合,否則釋放之前的解決方法。
- momentum : float, 預設 0.9,動量梯度下降更新,設定的範圍應該0.0-1.0. 隻有solver=’sgd’時使用.
- nesterovs_momentum : boolean, 預設True, Whether to use Nesterov’s momentum. 隻有solver=’sgd’并且momentum > 0使用.
- early_stopping : bool, 預設False,隻有solver=’sgd’或者’adam’時有效,判斷當驗證效果不再改善的時候是否終止訓練,當為True時,自動選出10%的訓練資料用于驗證并在兩步連續疊代改善,低于tol時終止訓練。
- validation_fraction : float, 可選, 預設 0.1,用作早期停止驗證的預留訓練資料集的比例,早0-1之間,隻當early_stopping=True有用
- beta_1 : float, 可選, 預設0.9,隻有solver=’adam’時使用,估計一階矩向量的指數衰減速率,[0,1)之間
- beta_2 : float, 可選, 預設0.999,隻有solver=’adam’時使用估計二階矩向量的指數衰減速率[0,1)之間
- epsilon : float, 可選, 預設1e-8,隻有solver=’adam’時使用數值穩定值。
屬性說明:
- classes_:每個輸出的類标簽
- loss_:損失函數計算出來的目前損失值
- coefs_:清單中的第i個元素表示i層的權重矩陣
- intercepts_:清單中第i個元素代表i+1層的偏差向量
- n_iter_ :疊代次數
- n_layers_:層數
- n_outputs_:輸出的個數
- out_activation_:輸出激活函數的名稱。
參考文獻:
https://xijunlee.github.io/2017/03/29/sklearn中SVM調參說明及經驗總結/
https://www.cnblogs.com/pinard/p/6065607.html
https://blog.csdn.net/u011311291/article/details/78743393