天天看點

Python機器學習(sklearn)——分類模型評估與調參總結(下)

21.內建方法有随機森林(random forest)和梯度提升樹(gradient boosted decision tree)GBDT

随機森林中樹的随機化方法有兩種:

(1)通過選擇用于構造樹的資料點

構造随機森林需要确定用于構造的樹的個數

為了確定樹與樹之間的差別,對每棵樹的資料進行自助采樣

從樣本資料中有放回的多次抽取(一個樣本可能被抽取多次),抽取建立的新資料集要和原資料集大小相等(資料數量相同)

(2)通過選擇每次劃分測試集的特征

在每個節點處,算法随機選擇特征的一個子集,并對其中一個特征尋找最佳測試,而不是對每個節點都尋找最佳測試。

使用參數max_features, 如果max_features= n_features,則每次考慮所有特征,即第二種随機性沒用上

當max_features較大,随機森林中每棵樹都會很相似(因為采用的特征基本相同)

如果max_features較小,樹的差異較大,為了很好的拟合資料,每棵樹的深度都應該較大。

RandomForestClassifier(n_estimators = 5,random_state = 2)#五棵樹的随機森林

随機森林比單獨一棵樹的過拟合都要小,實際應用中,我們會用很多樹(通常幾百上千),進而達到決策邊界更平滑的效果

一般,随機森林給出的特征重要性比單科決策樹給出的可靠。

多核CPU可以設定參數n_jobs = -1來使用計算機的所有核心計算

設定不同的随機狀态(或者不設定random_state參數)可以徹底改變建構的模型

如果希望結果重制,固定random_state

對于高維稀疏資料(例如文本資料)随機森林常常表現不佳,使用線性模型更為合适

随機森林需要調節的重要參數有n_estimators和max_features,還包括預剪枝選項(如max_depth)

n_estimators總是越大越好(時間記憶體允許的話)

max_features決定每棵樹的随機性大小,較小可以降低過拟合,一般使用預設值

分類時預設值為sqrt(n_features)

對于回歸預設值是n_features

22.梯度提升回歸樹(梯度提升機)

梯度提升采用連續的方式構造樹,每棵樹都試圖糾正前一棵樹的錯誤。

梯度提升樹背後的主要思想是合并許多簡單的模型(在這個語境中叫做弱學習器),比如深度較小的樹

每棵樹隻能對部分資料作出好的預測,是以添加更多的樹可以不斷疊代提高性能

除了預剪枝和随機森林裡的樹的數量之外,梯度提升樹的另一個重要參數是學習率(learning_rate)

用于控制每棵樹糾正前一棵樹錯誤的強度,通過增大learning_rate或n_estimators都會增加模型的複雜度

降低樹的最大深度和學習率都能降低過拟合

GradientBoostingClassifier(random_state=0, max_depth=1, learning_rate=0.01)

随機森林的n_estimators越大越好

梯度提升樹的n_estimators提高,模型複雜,會導緻過拟合

梯度提升樹的max_depth通常設定的很小,一般不超過5

由于梯度提升和随機森林兩種方法在類似的資料上表現的都很好

是以一種常用的方法是先嘗試随機森林,它的魯棒性很好,如果随機森林效果很好,但是預測時間太長,選擇梯度提升

梯度提升樹的需要仔細調參,訓練時間也長,也不适合高維稀疏資料

23.對于SVM,将資料映射到更高維空間中有兩種常用方法:

(1)多項式核;在一定階數内計算原始特征所有可能的多項式(例如features12, features25)

(2)徑向基函數(RBF) 核,也叫高斯核。它考慮所有階數的所有可能的多項式,但階數越高,特征的重要性越小。

24.SVM調參

gamma參數,控制高斯核的寬度,它決定了點與點之間“靠近”是指多大的距離。C參數是正則化參數,與線性模型類似

它限制每個點的重要性

從小增大gamma(0.1-10),它認為點與點之間的距離不斷增大,從決策邊界平滑往不平滑過渡,模型越加複雜

這兩個參數強烈相關,可以同時調節

C從小到大,決策邊界越來越不平滑

預設情況下:C=1,gamma=1/n_features

SVM資料需要預處理(常用的是縮放到0~1之間)

常用的是(x-xmin)/(xmax-xmin)

SVM的缺點:需要預處理和小心調參,SVM模型很難檢驗,也難以解釋

25.神經網絡的非線性函數常用校正非線性(relu)或正切雙曲線(tanh)

relu截斷小于0的值

tanh在輸入值小時接近-1,較大時接近1

有了這兩種非線性函數,神經網絡可以學習比線性模型複雜得多的函數

多層感覺機(MLP ),也稱為普通前饋神經網絡,預設時,每層使用100個隐節點

預設的是relu

MLPClassifier(solver='lbfgs',random_state=0,hidden_layer_sizes=[10])

10層

如果是10層且每層10個隐節點

則hidden_layer_sizes=[10,10]

MLPClassifier中調節L2懲罰的參數是alpha(與線性回歸模型相同),預設值很小(弱正則化)

控制神經網絡的複雜度的方法有很多種,隐層的個數、每個隐層中的單元個數與正則化(alpha)

神經網絡要求輸入特征的變化範圍相似,最理想的情況是均值為0,方差為1

我們必須對資料進行縮放達到這一要求

StandardScaler可以達到資料處理要求

疊代次數參數MLPClassifier(max_iter = 1000,random_state=0)

功能強大的神經網絡經常需要很長的訓練時間

神經網絡的調參常用方法是,首先建立一個大到足以過拟合的網絡,確定這個網絡可以對任務進行學習

然後通過縮小網絡或者增大alpha來增強正則化,進而提高泛化性能

如何學習模型或用來學習參數的算法,由solver參數設定

預設為'adam',在大多數情況下效果很好,但是對資料的縮放相當敏感(需要将資料縮放為均值為0,方差為1)

'lbfgs'的魯棒性很好,大型資料集和大型模型上時間較長

更進階的'sgd'

初學者建議使用前兩種

sklearn中有兩個函數可用于擷取分類器的不确定性估計:decision_function和predict_proba

大多數分類器都至少有其中一個函數,很多分類器這兩個都有

predict_proba的結果是:

每行的第一個元素是第一個類别的估計機率,第二個元素是第二個類别的估計機率

predict_proba輸出的是機率,在0~1之間,兩個類别的元素之和始終為1

decision_function每一列對應每個類别的确定度分數,分數越高類别的可能性越大

26.如何選擇合适的模型:

KNN

适用于小型資料集,容易解釋

線性模型

非常可靠的首選算法,适用于非常大的資料集,也适合高維資料

樸素貝葉斯

隻适用于分類問題,比線性模型速度還快,适用于非常大的資料集或者高維資料

精度通常要低于線性模型

決策樹

速度很快,不需要資料放縮,可以可視化,容易解釋

随機森林

幾乎總是比單棵決策樹表現好,魯棒性好,不需要資料放縮,不适用于高維資料

梯度提升決策樹

精度通常比随機森林略高,但是訓練速度比随機森林慢,預測速度比随機森林快,需要的記憶體少,比随機森林需要調的參數多

SVM

對于特征含義相似的中等大小的資料集很強大,需要資料縮放,對參數敏感

神經網絡

可以建構非常複雜的模型,特别是大型資料集,對資料縮放敏感,對參數選取敏感,大型網絡需要很長的訓練時間

面對資料集,先從簡單的模型開始,比如線性回歸、樸素貝葉斯、KNN,看看能得到的結果

對資料了解加深後,可以考慮更複雜的模型

如随機森林、梯度提升決策樹、SVM、神經網絡

原文釋出時間為:2018-07-22

本文作者: 王大偉

本文來自雲栖社群合作夥伴“

Python愛好者社群

”,了解相關資訊可以關注“