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愛好者社群”,了解相關資訊可以關注“
”