機器學習(一)之 2萬多字的監督學習模型總結V1.0:K近鄰、線性迴歸、嶺迴歸、樸素貝葉斯模型、決策樹、隨機森林、梯度提升迴歸樹、SVM、神經網絡

0 本文介紹

2萬多字符的監督學習模型總結 V1.0

​ 本文根據Andreas C.Muller的《Introduction to Machine Learning with Python》和西瓜書,整理了常見的監督學習模型。本文不講解複雜的數學理論,涉及到了K近鄰、線性模型、樸素貝葉斯分類器、決策樹、隨機森林、梯度提升迴歸樹、SVM、MLP,以及監督學習模型的選擇原則,全文2萬多字,後續還會進一步補充

​ 在後面的博客中會記錄機器學習數學推導、無監督學習等機器學習內容,Kaggle競賽等競賽。

相關筆記:
機器學習(一)之 2萬多字的監督學習模型總結V1.0:K近鄰、線性迴歸、嶺迴歸、樸素貝葉斯模型、決策樹、隨機森林、梯度提升迴歸樹、SVM、神經網絡
機器學習(二)之無監督學習:數據變換、聚類分析
機器學習(三)之數據表示和特徵工程:One-Hot編碼、分箱處理、交互特徵、多項式特徵、單變量非線性變換、自動化特徵選擇
機器學習(四)之參數選擇:交叉驗證、網格搜索
機器學習(五)之評價指標:二分類指標、多分類指標、混淆矩陣、不確定性、ROC曲線、AUC、迴歸指標

1 K近鄰

1.1 何爲K近鄰

​ KNN 算法可以說是最簡單的機器學習算法,構建和預測都非常簡單。構建模型只需要保存訓練數據集即可。想要對新數據點做出預測,算法會在訓練數據集中找到最近的數據點,也就是它的“最近鄰”。

一個鄰居:KNN算法最簡單的就是一個最近鄰,也就是與我們想要預測的數據點最近的訓練數據點。預測結果就是這個訓練數據點的已知輸出。

K個鄰居:在考慮多於一個鄰居的情況時,我們用“投票法”(voting)來指定標籤。也就是說,對於每個測試點,我們數一數多少個鄰居屬於類別0,多少個鄰居屬於類別1。然後將出現次數更多的類別(也就是k 個近鄰中佔多數的類別)作爲預測結果。

1.2 構建K近鄰—分類

​ 在scikit-learn中構建K近鄰十分簡單,只需要導入類並將其實例化即可。這時可以設定參數,比如鄰居的個數。

from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=optional number)
clf.fit(X_train, y_train)
clf.predict(X_test)
print("Test set accuracy: {:.2f}".format(clf.score(X_test, y_test)))

1.3 分析KNeighborsClassifier

​ 可以進行可視化,以查看決策邊界(decision boundary),即算法對類別0 和類別1 的分界線。

模型複雜度和鄰居的關係:

  • 使用單一鄰居繪製的決策邊界緊跟着訓練數據
  • 隨着鄰居個數越來越多,決策邊界也越來越平滑
  • 更平滑的邊界對應更簡單的模型,使用更少的鄰居對應更高的模型複雜度,而使用更多的鄰居對應更低的模型複雜度
  • 極端情況:鄰居個數等於訓練集中所有數據點的個數,那麼每個測試點的鄰居都完全相同(即所有訓練點),所有預測結果也完全相同即訓練集中出現次數最多的類別。

模型複雜度和泛化能力之間的關係:

img

​ 監督學習模型都是符合這張圖的。僅考慮單一近鄰時,訓練集上的預測結果十分完美。但隨着鄰居個數的增多,模型變得更簡單,訓練集精度也隨之下降。單一鄰居時的測試集精度比使用更多鄰居時要低,這表示單一近鄰的模型過於複雜。與之相反,當考慮10 個鄰居時,模型又過於簡單,性能甚至變得更差。最佳性能在中間的某處。

1.4 構建K近鄰—迴歸

​ 利用單一鄰居的預測結果就是最近鄰的目標值。在使用多個近鄰時,預測結果爲這些鄰居的平均值

用於迴歸的k 近鄰算法在scikit-learn 的KNeighborsRegressor 類中實現。其用法與KNeighborsClassifier 類似:

from sklearn.neighbors import KNeighborsRegressor
reg = KNeighborsRegressor(n_neighbors=3)
print("Test set R^2: {:.2f}".format(reg.score(X_test, y_test))

​ 對於迴歸問題,score是決定係數R2,是迴歸模型預測的優度度量,位0到1之間。R2等於1 對應完美預測,R^2 等於0 對應常數模型,即總是預測訓練集響應(y_train)的平均值。

1.5 優點、缺點和參數

​ 通常,KNeighbors 分類器有2 個重要參數:鄰居個數與數據點之間距離的度量方法。在實踐中,使用較小的鄰居個數(比如3 個或5 個)往往可以得到比較好的結果。scikit-learn默認使用歐式距離。

  • KNN的優點之一就是模型很容易理解,通常不需要過多調節就可以得到不錯的性能

構建最近鄰模型的速度通常很快,但如果訓練集很大(特徵數很多或者樣本數很大),預測速度可能會比較慢。

  • 構建最近鄰模型的速度通常很快,但如果訓練集很大(特徵數很多或者樣本數大),預測速度可能會比較慢。
  • 對於有很多特徵(幾百或更多)的數據集往往效果不好,對於大多數特徵的大多數取值都0的數據集(所謂的稀疏數據集)來說,這一算法的效果尤其不好。

Tips:雖然k 近鄰算法很容易理解,但由於預測速度慢且不能處理具有很多特徵的數據集,所以在實踐中往往不會用到。而線性模型則沒有這兩個缺點。

2 線性模型

2.1 線性迴歸

​ 線性迴歸或者普通最小二乘法(ordinary least squares,OLS)

​ 均方誤差(mean squared error)是預測值與真實值之差的平方和除以樣本數。線性迴歸沒有參數,這是一個優點,但也因此無法控制模型的複雜度。

Tips:

  1. 注意到了coef_ 和intercept_ 結尾處奇怪的下劃線。scikit-learn總是將從訓練數據中得出的值保存在以下劃線結尾的屬性中。這是爲了將其與用戶設置的參數區分開。
  2. 訓練集和測試集上的分數非常接近(特別是都非常低時)。這說明可能存在欠擬合,而不是過擬合。
  3. 訓練集和測試集之間的性能差異是過擬合的明顯標誌,因此我們應該試圖找到一個可以控制複雜度的模型。

2.2 嶺迴歸Ridge

  1. 預測公式與普通最小二乘法相同。(同)
  2. 對係數(w)的選擇不僅要在訓練數據上得到好的預測結果,而且還要擬合附加約束。(異)
  3. 我們還希望係數儘量小。換句話說,w 的所有元素都應接近於 0。直觀上來看,這意味着每個特徵對輸出的影響應儘可能小(即斜率很小),同時仍給出很好的預測結果。這種約束是所謂正則化(regularization)的一個例子。
  4. 正則化是指對模型做顯式約束,以避免過擬合。嶺迴歸用到的這種被稱爲L2正則化
  5. Ridge 是一種約束更強的模型,所以更不容易過擬合。複雜度更小的模型意味着在訓練集上的性能更差,但泛化性能更好。
  6. Ridge 模型在模型的簡單性(係數都接近0)與訓練集性能之間做出權衡。簡單性和訓練集性能二者對於模型的重要程度可以由用戶通過設置alpha 參數來指定
  7. alpha 的最佳設定值取決於用到的具體數據集。增大alpha 會使得係數更加趨向於0,從而降低訓練集性能,但可能會提高泛化性能
  8. 更大的alpha 表示約束更強的模型,所以我們預計大alpha 對應的coef_元素比小alpha 對應的coef_ 元素要小。
Ridge 懲罰了係數的L2 範數或w 的歐式長度。

將模型性能作爲數據集大小的函數進行繪圖,這樣的圖像叫作學習曲線??

2.3 Lasso迴歸

​ 除了Ridge,還有一種正則化的線性迴歸是Lasso。與嶺迴歸相同,使用lasso 也是約束係數使其接近於0,但用到的方法不同,叫作L1 正則化

​ L1 正則化的結果是,使用lasso 時某些係數剛好爲0。這說明某些特徵被模型完全忽略。這可以看作是一種自動化的特徵選擇。某些係數剛好爲0,這樣模型更容易解釋,也可以呈現模型最重要的特徵。

​ Lasso 在訓練集與測試集上的表現都很差。這表示存在欠擬合,爲了降低欠擬合,我們嘗試減小alpha。這麼做的同時,我們還需要增加max_iter 的值(運行迭代的最大次數)。

​ alpha 值變小,我們可以擬合一個更復雜的模型,在訓練集和測試集上的表現也更好。

​ 但如果把alpha 設得太小, 那麼就會消除正則化的效果, 並出現過擬合, 得到與LinearRegression 類似的結果。

lasso 懲罰係數向量的L1 範數,換句話說,係數的絕對值之和。

Tips:

在實踐中,在兩個模型中一般首選嶺迴歸。但如果特徵很多,你認爲只有其中幾個是重要的,那麼選擇Lasso 可能更好。同樣,如果你想要一個容易解釋的模型,Lasso 可以給出更容易理解的模型,因爲它只選擇了一部分輸入特徵。scikit-learn 還提供了ElasticNet類,結合了Lasso 和Ridge 的懲罰項。在實踐中,這種結合的效果最好,不過代價是要調節兩個參數:一個用於L1 正則化,一個用於L2 正則化。

2.4 用於分類的線性模型—logistic/SVC

​ 對於用於迴歸的線性模型,輸出ŷ 是特徵的線性函數,是直線、平面或超平面(對於更高維的數據集)。

​ 對於用於分類的線性模型,決策邊界是輸入的線性函數。換句話說,(二元)線性分類器是利用直線、平面或超平面來分開兩個類別的分類器。

學習線性模型有很多種算法。這些算法的區別在於以下兩點:

• 係數和截距的特定組合對訓練數據擬合好壞的度量方法;

• 是否使用正則化,以及使用哪種正則化方法。

​ 不同的算法使用不同的方法來度量“對訓練集擬合好壞”。由於數學上的技術原因,不可能調節w 和b 使得算法產生的誤分類數量最少。對於我們的目的,以及對於許多應用而言,上面第一點(稱爲損失函數)的選擇並不重要。

​ 最常見的兩種線性分類算法是Logistic 迴歸(logistic regression)線性支持向量機(linearsupport vector machine, 線性SVM)

​ 前者在linear_model.LogisticRegression 中實現,後者在svm.LinearSVC(SVC 代表支持向量分類器)中實現。

​ 兩個模型都默認使用L2 正則化,就像Ridge 對迴歸所做的那樣。

scikit-learn中的調用命令是:

from sklearn.linear_model import LogisticRegression

from sklearn.svm import LinearSVC

​ 對於LogisticRegression 和LinearSVC, 決定正則化強度的權衡參數叫作C。C 值越大,對應的正則化越弱。>換句話說,如果參數C 值較大,那麼LogisticRegression 和LinearSVC 將盡可能將訓練集擬合到最好(模型會更復雜),而如果C 值較小,那麼模型更強調使係數向量(w)接近於0。

​ 參數C 的作用還有另一個有趣之處。較小的C 值(對應強正則化)可以讓算法儘量適應“大多數”數據點,而較大的C 值(對應弱正則化)更強調每個數據點都分類正確的重要性。

Tips:

  • 若由於訓練集和測試集的性能非常接近,所以模型很可能是欠擬合的。我們嘗試增大C 來擬合一個更靈活的模型,但也更復雜。
  • 用於二分類的線性模型與用於迴歸的線性模型有許多相似之處。與用於迴歸的線性模型一樣,模型的主要差別在於penalty 參數,這個參數會影響正則化,也會影響模型是使用所有可用特徵還是隻選擇特徵的一個子集。

2.5 用於多分類的線性模型

1、許多線性分類模型只適用於二分類問題,不能輕易推廣到多類別問題(除了Logistic 迴歸)。將二分類算法推廣到多分類算法的一種常見方法是“一對其餘”(one-vs.-rest)方法

2、在“一對其餘”方法中,對每個類別都學習一個二分類模型,將這個類別與所有其他類別儘量分開,這樣就生成了與類別個數一樣多的二分類模型。在測試點上運行所有二類分類器來進行預測。在對應類別上分數最高的分類器“勝出”,將這個類別標籤返回作爲預測結果。

3、多分類Logistic 迴歸背後的數學與“一對其餘”方法稍有不同,但它也是對每個類別都有一個係數向量和一個截距,也使用了相同的預測方法。

2.6 優點、缺點、參數

  • 線性模型的主要參數是正則化參數,在迴歸模型中叫作alpha;在LinearSVC 和Logistic-Regression 分類模型中中叫作C。

  • alpha 值較大或C 值較小,說明模型比較簡單。特別是對於迴歸模型而言,調節這些參數非常重要。通常在對數尺度上對C 和alpha 進行搜索。

  • 還需要確定的是用L1 正則化還是L2 正則化。

    • 如果你假定只有幾個特徵是真正重要的,那麼你應該用L1 正則化,否則應默認使用L2 正則化。
    • 如果模型的可解釋性很重要的話,使用L1 也會有幫助。由於L1 只用到幾個特徵,所以更容易解釋哪些特徵對模型是重要的,以及這些特徵的作用。
  • 線性模型的訓練速度非常快,預測速度也很塊。這種模型可以推廣到非常大的數據集,對稀疏數據也很有效。

疑問:

​ 如果特徵數量大於樣本數量,線性模型的表現通常都很好。它也常用於非常大的數據集,只是因爲訓練其他模型並不可行。但在更低維的空間中,其他模型的泛化性能可能更好。

3 樸素貝葉斯分類器

3.1 特點

  • 與線性模型非常相似的一種分類器,但它的訓練速度往往更快。
  • 泛化能力要比線性分類器稍差。
  • 通過單獨查看每個特徵來學習參數,並從每個特徵中收集簡單的類別統計數據。這也是其高效的原因。

3.2 實現

scikit-learn 中有三種實現的分類器:GaussianNB、BernoulliNB、MultinomialNB

  • GaussianNB 可應用於任意連續數據,主要用於高維數據

  • BernoulliNB 假定輸入數據爲二分類數據,廣泛用於稀疏計數數據

  • MultinomialNB 假定輸入數據爲計數數據(即每個特徵代表某個對象的整數計數,比如一個單詞在句子裏出現的次數),廣泛用於稀疏計數數據

BernoulliNB 和MultinomialNB 主要用於文本數據分類。

3.3 特徵計算方式

  • BernoulliNB 分類器計算每個類別中每個特徵不爲0 的元素個數

  • MultinomialNB 計算每個類別中每個特徵的平均值

  • GaussianNB 會保存每個類別中每個特徵的平均值和標準差

  • 要想做出預測,需要將數據點與每個類別的統計數據進行比較,並將最匹配的類別作爲預測結果。

  • MultinomialNB 和BernoulliNB 預測公式的形式都與線性模型完全相同,但是樸素貝葉斯模型coef_ 的含義與線性模型稍有不同,因爲coef_不同於w。

3.4 優點、缺點和參數

參數:

  • MultinomialNB 和BernoulliNB 都只有一個參數alpha,用於控制模型複雜度。

  • alpha 的工作原理:算法向數據中添加alpha 這麼多的虛擬數據點,這些點對所有特徵都取正值。這可以將統計數據“平滑化”(smoothing)

  • 特點:alpha 越大,平滑化越強,模型複雜度就越低。算法性能對alpha 值的魯棒性相對較好,也就是說,alpha 值對模型性能並不重要。但調整這個參數通常都會使精度略有提高。

  • GaussianNB 主要用於高維數據,而另外兩種樸素貝葉斯模型則廣泛用於稀疏計數數據,比如文本。

  • MultinomialNB 的性能通常要優於BernoulliNB,特別是在包含很多非零特徵的數據集(即大型文檔)上。

優缺點:

樸素貝葉斯模型的許多優點和缺點都與線性模型相同。

  • 訓練和預測速度都很快,訓練過程也很容易理解。
  • 對高維稀疏數據的效果很好,對參數的魯棒性也相對較好。
  • 樸素貝葉斯模型是很好的基準模型,常用於非常大的數據集,在這些數據集上即使訓練線性模型可能也要花費大量時間。

4 決策樹

廣泛用於分類和迴歸任務的模型。本質上,它從一層層的if/else 問題中進行學習,並得出結論。

4.1 構造決策樹

頂節點(根節點)、葉節點

4.2 控制決策樹的複雜度

​ 通常來說,構造決策樹直到所有葉結點都是純的葉結點,這會導致模型非常複雜,並且對訓練數據高度過擬合。純葉結點的存在說明這棵樹在訓練集上的精度是100%。

  • 防止過擬合有兩種常見的策略:

  • 預剪枝(pre-pruning):及早停止樹的生長

  • 後剪枝(post-pruning)或剪枝(pruning):先構造樹,但隨後刪除或摺疊信息量很少的結點

​ 預剪枝的限制條件可能包括限制樹的最大深度、限制葉結點的最大數目,或者規定一個結點中數據點的最小數目來防止繼續劃分。

Tips:

​ scikit-learn 的決策樹在DecisionTreeRegressor 類DecisionTreeClassifier 類中實現。

scikit-learn 只實現了預剪枝,沒有實現後剪枝。

4.3 分析決策樹

​ 可以利用tree 模塊的export_graphviz 函數來將樹可視化。這個函數會生成一個.dot 格式的文件,這是一種用於保存圖形的文本文件格式。我們設置爲結點添加顏色的選項,顏色表示每個結點中的多數類別,同時傳入類別名稱和特徵名稱,這樣可以對樹正確標記。

​ 樹的可視化有助於深入理解算法是如何進行預測的,也是易於向非專家解釋的機器學習算法的優秀示例。

4.4 樹的特徵重要性

​ 由於查看整個樹可能非常費勁,所以可以利用一些有用的屬性來總結樹的工作原理。

​ 最常用的是特徵重要性(feature importance),它爲每個特徵對樹的決策的重要性進行排序。對於每個特徵來說,它都是一個介於0 和1 之間的數字,其中0 表示“根本沒用到”,1 表示“完美預測目標值”。特徵重要性的求和始終爲1:

​ 但是如果某個特徵的feature_importance_ 很小,並不能說明這個特徵沒有提供任何信息。這隻能說明該特徵沒有被樹選中,可能是因爲另一個特徵也包含了同樣的信息。

​ 與線性模型的係數不同,特徵重要性始終爲正數,也不能說明該特徵對應哪個類別。

​ 對用於迴歸的決策樹來說,所有內容都是與用於分類的決策樹類似的,在DecisionTreeRegressor 中實現。迴歸樹的用法和分析與分類樹非常類似。但在將基於樹的模型用於迴歸時DecisionTreeRegressor(以及其他所有基於樹的迴歸模型)不能外推(extrapolate),也不能在訓練數據範圍之外進行預測。

4.5 優點、缺點和參數

參數:

​ 控制決策樹模型複雜度的參數是預剪枝參數,它在樹完全展開之前停止樹的構造。通常來說,選擇一種預剪枝策略(設置max_depth、max_leaf_nodes 或min_samples_leaf)足以防止過擬合。

兩個優點:

  • 得到的模型很容易可視化,非專家也很容易理解(至少對於較小的樹而言)
  • 算法完全不受數據縮放的影響。
    • 由於每個特徵被單獨處理,而且數據的劃分也不依賴於縮放,因此決策樹算法不需要特徵預處理,比如歸一化或標準化。特別是特徵的尺度完全不一樣時或者二元特徵和連續特徵同時存在時,決策樹的效果很好

缺點:

​ 即使做了預剪枝,它也經常會過擬合,泛化性能很差。因此,在大多數應用中,往往使用集成學習來替代單棵決策樹。

5 決策樹集成

​ 集成(ensemble)是合併多個機器學習模型來構建更強大模型的方法。在機器學習文獻中有許多模型都屬於這一類,但已證明有兩種集成模型對大量分類和迴歸的數據集都是有效的,二者都以決策樹爲基礎,分別是隨機森林(random forest)和梯度提升決策樹(gradient boosted decision tree)。

5.1 隨機森林

​ 決策樹的一個主要缺點是經常對訓練數據過擬合。隨機森林是解決這個問題的一種方法。隨機森林的名字來自於將隨機性添加到樹的構造過程中,以確保每棵樹都各不相同

本質:

​ 許多決策樹的集合,其中每棵樹都和其他樹略有不同。

思想:

​ 每棵樹的預測可能都相對較好,但可能對部分數據過擬合。需要構造很多樹,並且每棵樹的預測都很好(對目標值做出可以接受的預測),並且預測結果應該與其他樹不同,但都以不同的方式過擬合,那麼我們可以對這些樹的結果取平均值來降低過擬合。既能減少過擬合又能保持樹的預測能力,這可以在數學上嚴格證明。

關鍵點:

​ 隨機森林需要將隨機性添加到樹的構造過程中,以確保每棵樹都各不相同。

隨機化有兩種方式:
  • 通過選擇用於構造樹的數據點(自助採樣)
  • 通過選擇每次劃分測試的特徵(設置max_features參數)

​ 由於使用了自助採樣,隨機森林中構造每棵決策樹的數據集都是略有不同的。由於每個結點的特徵選擇,每棵樹中的每次劃分都是基於特徵的不同子集。這兩種方法共同保證隨機森林中所有樹都不相同

構造隨機森林的過程

​ 首先需要知道什麼是自助採樣( bootstrap sample),從n_samples 個數據點中有放回地(即同一樣本可以被多次抽取)重複隨機抽取一個樣本,共抽取n_samples 次。這樣會創建一個與原數據集大小相同的數據集,但有些數據點會缺失(大約三分之一),有些會重複。比如我們想要創建列表[‘a’, ‘b’, ‘c’, ‘d’] 的自助採樣。一種可能的自主採樣是[‘b’, ‘d’, ‘d’, ‘c’],另一種可能的採樣爲[‘d’, ‘a’, ‘d’, ‘a’]。

  • 確定用於構造的樹的個數

    • RandomForestRegressor 或 RandomForestClassifier 的 n_estimators 參數
    • 這些樹在構造時彼此完全獨立,算法對每棵樹進行不同的隨機選擇,以確保樹和樹之間是有區別的
  • 自助採樣,通過採樣獲得新的數據集

  • 基於這個新創建的數據集來構造決策樹

    • 這裏與決策樹稍有不同,在每個結點處,算法隨機選擇特徵的一個子集,並對其中一個特徵尋找最佳測試,而不是對每個結點都尋找最佳測試。選擇的特徵個數由max_features 參數來控制。每個結點中特徵子集的選擇是相互獨立的,這樣樹的每個結點可以使用特徵的不同子集來做出決策。
  • 分析隨機森林

參數:

  • 需要調節的重要參數有n_estimators 和max_features,可能還包括預剪枝選項(如max_depth)。

  • n_estimators 總是越大越好。對更多的樹取平均可以降低過擬合,從而得到魯棒性更好的集成。不過收益是遞減的,而且樹越多需要的內存也越多,訓練時間也越長。常用的經驗法則就是“在你的時間/ 內存允許的情況下儘量多”。

  • 如果我們設置max_features 等於n_features,那麼每次劃分都要考慮數據集的所有特徵,在特徵選擇的過程中沒有添加隨機性(不過自助採樣依然存在隨機性)。

  • 如果設置max_features 等於1,那麼在劃分時將無法選擇對哪個特徵進行測試,只能對隨機選擇的某個特徵搜索不同的閾值。

  • 因此,如果max_features 較大,那麼隨機森林中的樹將會分相似,利用最獨特的特徵可以輕鬆擬合數據。如果max_features 較小,那麼隨機森林中的樹將會差異很大,爲了很好地擬合數據,每棵樹的深度都要很大。

  • max_features 決定每棵樹的隨機性大小,較小的max_features 可以降低過擬合

  • 一般來說,好的經驗就是使用默認值:對於分類,默認值是max_features=sqrt(n_features); 對於迴歸, 默認值是max_features=n_features。

  • 增大max_features 或max_leaf_nodes 有時也可以提高性能。它還可以大大降低用於訓練和預測的時間和空間要求。

優缺點:

  • 用於迴歸和分類的隨機森林是目前應用最廣泛的機器學習方法之一。這種方法非常強大,通常不需要反覆調節參數就可以給出很好的結果,也不需要對數據進行縮放。
  • 從本質上看,隨機森林擁有決策樹的所有優點,同時彌補了決策樹的一些缺陷。
  • 如果你用的是多核處理器(幾乎所有的現代化計算機都是),你可以用n_jobs 參數來調節使用的內核個數。
  • 但設置n_jobs 大於內核個數是沒有用的。你可以設置n_jobs=-1 來使用計算機的所有內核。
  • 森林中的樹越多,它對隨機狀態選擇的魯棒性就越好。
  • 如果你希望結果可以重現,固定random_state 是很重要的**。**
  • 對於維度非常高的稀疏數據(比如文本數據),隨機森林的表現往往不是很好**。**對於這種數據,使用線性模型可能更合適。即使是非常大的數據集,隨機森林的表現通常也很好。
  • 隨機森林需要更大的內存,訓練和預測的速度也比線性模型要慢。對一個應用來說,如果時間和內存很重要的話,那麼換用線性模型可能更爲明智。

應用:

​ 想要利用隨機森林進行預測,算法首先對森林中的每棵樹進行預測。

對於迴歸問題,我們可以對這些結果取平均值作爲最終預測。

對於分類問題,則用到了“軟投票”(soft voting)策略。也就是說,每個算法做出“軟”預測,給出每個可能的輸出標籤的概率。對所有樹的預測概率取平均值,然後將概率最大的類別作爲預測結果。

5.2 梯度提升迴歸樹(梯度提升機)

可用於迴歸、分類

​ 與隨機森林方法不同,梯度提升採用連續的方式構造樹,每棵樹都試圖糾正前一棵樹的錯誤。默認情況下,梯度提升迴歸樹中沒有隨機化,而是用到了強預剪枝。梯度提升樹通常使用深度很小(1到5 之間)的樹,這樣模型佔用的內存更少,預測速度也更快。

主要思想:

​ 合併許多簡單的模型(在這個語境中叫作弱學習器),比如深度較小的樹。每棵樹只能對部分數據做出好的預測,因此,添加的樹越來越多,可以不斷迭代提高性能。

參數:4個

  • 預剪枝
  • n_estimators:集成中樹的數量,n_estimators 值總是越大越好,但梯度提升不同,增大n_estimators 會導致模型更加複雜,模型有更多機會糾正訓練集上的錯誤,進而可能導致過擬合。
  • learning_rate:學習率,用於控制每棵樹糾正前一棵樹的錯誤的強度。較高的學習率意味着每棵樹都可以做出較強的修正,這樣模型更爲複雜。降低學習率僅稍稍提高了泛化性能。
  • 通常的做法是根據時間和內存的預算選擇合適的n_estimators,然後對不同learning_rate 進行遍歷。
  • max_depth(或max_leaf_nodes),用於降低每棵樹的複雜度。梯度提升模型的max_depth 通常都設置得很小,一般不超過5。

優點和缺點:

  • 梯度提升樹經常是機器學習競賽的優勝者,並且廣泛應用於業界。與隨機森林相比,它通常對參數設置更爲敏感,但如果參數設置正確的話,模型精度更高。
  • 梯度提升決策樹是監督學習中最強大也最常用的模型之一
  • 主要缺點是需要仔細調參,而且訓練時間可能會比較長
  • 與其他基於樹的模型類似,這一算法不需要對數據進行縮放就可以表現得很好,而且也適用於二元特徵與連續特徵同時存在的數據集
  • 與其他基於樹的模型相同,它也通常不適用於高維稀疏數據。

6 核支持向量機

kernelized support vector machine,簡稱SVM,是線性支持向量機的推廣。可以推廣到更復雜模型的擴展,這些模型無法被輸入空間的超平面定義。

分類在SVC 中實現,迴歸在SVR 中實現。

6.1 線性模型與非線性特徵

​ 線性模型在低維空間中可能非常受限,因爲線和平面的靈活性有限。有一種方法可以讓線性模型更加靈活,就是添加更多的特徵——如,添加輸入特徵的交互項或多項式。

6.2 核技巧

​ 向數據表示中添加非線性特徵,可以讓線性模型變得更強大。但是,通常來說我們並不知道要添加哪些特徵,而且添加許多特徵的計算開銷可能會很大。因此,我們可以通過一種巧妙的數學技巧,讓我們可以在更高維空間中學習分類器,而不用實際計算可能非常大的新的數據表示。這種技巧叫作核技巧(kernel trick)——它的原理是直接計算擴展特徵表示中數據點之間的距離(更準確地說是內積),而不用實際對擴展進行計算。通過核技巧,可以將數據映射到更高維空間中。

​ 兩種常用的核技巧:一種是多項式核,在一定階數內計算原始特徵所有可能的多項式(比如feature1 ** 2 * feature2 ** 5);另一種是徑向基函數(radial basis function,RBF)核,也叫高斯核。高斯核有點難以解釋,因爲它對應無限維的特徵空間。一種對高斯核的解釋是它考慮所有階數的所有可能的多項式,但遵循指數映射的泰勒展開,所以階數越高,特徵的重要性越小。

6.3 對SVM的理解

​ 支持向量(support vector):位於類別之間邊界上的那些點,這部分部分訓練數據點對於定義決策邊界來說很重要。

​ 想要對新樣本點進行預測,需要測量它與每個支持向量之間的距離。分類決策是基於它與支持向量之間的距離以及在訓練過程中學到的支持向量重要性(保存在SVC 的dual_coef_屬性中)來做出的。

數據點之間的距離由高斯核給出:

img

6.4 SVM調參

  • gamma參數:控制高斯核的寬度,決定了點與點之間“靠近”是指多大的距離。gamma 較小,說明高斯核的半徑較大,許多點都被看作比較靠近。小的gamma 值表示決策邊界變化很慢,生成的是複雜度較低的模型,而大的gamma 值則會生成更爲複雜的模型。
  • C參數:正則化參數,與線性模型中用到的類似。它限制每個點的重要性(或者更確切地說,每個點的dual_coef_)。與線性模型相同,C 值很小,說明模型非常受限,每個數據點的影響範圍都有限。
  • 增大C 或gamma 可以擬合出更爲複雜的模型,兩個參數的設定通常是強烈相關的,應該同時調節。分類時默認情況下,C=1,gamma=1/n_features
  • 核SVM 的重要參數是正則化參數C、核的選擇以及與核相關的參數。
  • scikit-learn中有很多核函數

6.5 數據預處理

​ 雖然SVM 的表現通常都很好,但它對參數的設定和數據的縮放非常敏感。它要求所有特徵有相似的變化範圍。解決這個問題的一種方法就是對每個特徵進行縮放,使其大致都位於同一範圍。常用的縮放方法就是將所有特徵縮放到0 和1 之間。使用MinMaxScaler 預處理方法來做到。當然也可以手工完成。

# 計算訓練集中每個特徵的最小值
min_on_training = X_train.min(axis=0)
# 計算訓練集中每個特徵的範圍(最大值-最小值)
range_on_training = (X_train - min_on_training).max(axis=0)
# 減去最小值,然後除以範圍
# 這樣每個特徵都是min=0和max=1
X_train_scaled = (X_train - min_on_training)/range_on_training
# 利用訓練集的最小值和範圍對測試集做相同的變換
X_test_scaled = (X_test - min_on_training) / range_on_training

6.6 優點、缺點

  • 核支持向量機是非常強大的模型,在各種數據集上的表現都很好。SVM 允許決策邊界很複雜,即使數據只有幾個特徵。它在低維數據和高維數據(即很少特徵和很多特徵)上的表現都很好。
  • 對樣本個數的縮放表現不好。
  • 預處理數據和調參都需要非常小心。如今很多應用中用的都是基於樹的模型,比如隨機森林或梯度提升(需要很少的預處理,甚至不需要預處理)
  • SVM 模型很難檢查,可能很難理解爲什麼會這麼預測,而且也難以將模型向非專家進行解釋。
  • 當所有特徵的測量單位相似(比如都是像素密度)而且範圍也差不多時,使用SVM一般可以取得較好的效果。

7 神經網絡

多層感知機(multilayer perceptron,MLP):可用於分類和迴歸,可以作爲研究更復雜的深度學習方法的起點。MLP 也被稱爲(普通)前饋神經網絡,有時也簡稱爲神經網絡。

7.1 簡單神經網絡模型

​ MLP 可以被視爲廣義的線性模型執行多層處理後得到結論。

線性迴歸的預測公式:
img

將該公式可視化爲:

img

​ 上圖中,左邊的每個結點代表一個輸入特徵,連線代表學到的係數,右邊的結點代表輸出,是輸入的加權求和。

​ 在MLP 中,多次重複這個計算加權求和的過程,首先計算代表中間過程的隱單元(hidden unit),然後再計算這些隱單元的加權求和並得到最終結果如下,即單隱層的多層感知機。

img

​ 這個模型需要學習更多的係數(也叫作權重):在每個輸入與每個隱單元(隱單元組成了隱層)之間有一個係數,在每個隱單元與輸出之間也有一個係數。

從數學的角度看,計算一系列加權求和與只計算一個加權求和是完全相同的,那麼如何讓這個模型真正比線性模型更爲強大?

答案就是:在計算完每個隱單元的加權求和之後,對結果再應用一個非線性函數——通常是校正非線性(rectifying nonlinearity,也叫校正線性單元或ReLu)、正切雙曲(tangens hyperbolicus,tanh)。然後將這個非線性函數的結果用於加權求和,計算得到輸出ŷ。

​ ReLu 截斷小於0 的值,而tanh 在輸入值較小時接近-1,在輸入值較大時接近+1。有了這兩種非線性函數,神經網絡可以學習比線性模型複雜得多的函數。

img

​ 對於上述單隱層的多層感知機,使用tanh 非線性計算迴歸問題的ŷ 的完整公式如下:

img

​ where,w 是輸入x 與隱層h 之間的權重,v 是隱層h 與輸出ŷ 之間的權重。權重w 和v 要從數據中學習得到,x 是輸入特徵,ŷ 是計算得到的輸出,h 是計算的中間結果。

  • 需要用戶設置的一個重要參數是隱層中的結點個數。對於非常小或非常簡單的數據集,這個值可以小到10;對於非常複雜的數據,這個值可以大10 000。同時也可以添加多個隱含層,深層的網絡也就是這樣一層一層添加的(此部分屬於深度學習的內容)。

7.2 神經網絡構建和調參

​ 使用如下命令可以從scikit-learn框架中調用MLP分類器。

from sklearn.neural_network import MLPClassifier 
# optional表示可選參數,
mlp = MLPClassifier(solver='optional', activation='optional',
                    random_state=0,hidden_layer_sizes=size_num)
mlp.fit(X_train, y_train)

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

隱層個數、單元個數:默認情況下,MLP使用100個隱結點,這對於這個小型數據集來說已經相當多了。可以減少隱結點數量,從而降低模型複雜度。神經網絡學到的決策邊界完全是非線性的,但相對平滑。如果想得到更加平滑的決策邊界,可以添加更多的隱單元、添加多個隱層或者使用tanh非線性函數。

非線性函數:如果單隱層模型使用ReLU函數,那麼決策函數可看作是由若干個個直線段組成的。使用tanh非線性函數可得到更加平滑的決策邊界。

正則化(alpha)參數:我們還可以利L2懲罰使權重趨向0,從而控制神經網絡的複雜度,類似於嶺迴歸和線性分類器。MLPClassifier 中調節L2 懲罰的參數是alpha(與線性迴歸模型中的相同),它的默認值很小(弱正則化)。增大alpha 參數(調參時變化範圍要相當大,如從0.0001 到1),以此向權重添加更強的正則化,以降低模型複雜度來得到更好的泛化性能。

隨機化的權重:另外一個需要注意的地方就是,在開始學習之前其權重是隨機設置的,這種隨機初始化會影響學到的模型。即使使用完全相同的參數,如果隨機種子不同的話,我們也可能得到非常不一樣的模型。如果網絡很大,並且複雜度選擇合理的話,那麼這應該不會對精度有太大影響,但對於較小的網絡應該特別注意這一點。另外,權重可以通過優化算法訓練得到,如遺傳算法、模擬退火等。

​ 神經網絡也要求所有輸入特徵的變化範圍相似,最理想的情況是均值0、方差爲1。我們必須對數據進行縮放以滿足這些要求。使用 StandardScaler 可以自動完成,當然也可以手工完成。

# 計算訓練集中每個特徵的平均值
mean_on_train = X_train.mean(axis=0)
# 計算訓練集中每個特徵的標準差
std_on_train = X_train.std(axis=0)
# 減去平均值,然後乘以標準差的倒數
# 如此運算之後,mean=0,std=1
X_train_scaled = (X_train - mean_on_train) / std_on_train
# 對測試集做相同的變換(使用訓練集的平均值和標準差)
X_test_scaled = (X_test - mean_on_train) / std_on_train

常見的庫:

  • scikit-learn:MLPClassifier 和MLPRegressor,只包含神經網絡潛在應用的一部分
  • keras:既可以用tensor-flow 也可以用theano。
  • lasagna:基於theano 庫構建的
  • tensor-flow:谷歌的深度學習框架

​ 這些庫提供了更爲靈活的接口,可以用來構建神經網絡並跟蹤深度學習研究的快速發展。所有流行的深度學習庫也都允許使用高性能的圖形處理單元(GPU),而scikit-learn 不支持GPU。使用GPU 可以將計算速度加快10 到100倍。

神經網絡調參的常用方法:

  • 神經網絡調參本身也是一門藝術。調節神經網絡模型和訓練模型的方法有很多種。
  • 神經網絡調參的常用方法是,首先創建一個大到足以過擬合的網絡,確保這個網絡可以對任務進行學習。知道訓練數據可以被學習之後,要麼縮小網絡,要麼增大alpha 來增強正則化,這可以提高泛化性能。
  • 在我們的實驗中,主要關注模型的定義:層數、每層的結點個數、正則化和非線性。這些內容定義了我們想要學習的模型。

選擇如何學習模型或用來學習參數的算法:

​ 這一點的選擇是由solver 參數設定的。solver 有三個選項:‘adam’,‘lbfgs’,‘sgd’

  • ‘adam’:默認選項,在大多數情況下效果都很好,但對數據的縮放相當敏感(因此,始終將數據縮放爲均值爲0、方差爲1 是很重要的)。
  • ‘lbfgs’:其魯棒性相當好,但在大型模型或大型數據集上的時間會比較長。
  • ‘sgd’ :更高級的一個選項,許多深度學習研究人員都會用到。'sgd’選項還有許多其他參數需要調節,以便獲得最佳結果。

​ 可以在用戶指南中找到所有這些參數及其定義。建議初學者用’adam’ 和’lbfgs’

7.3 優點、缺點

  • 分析困難:雖然可以分析神經網絡學到了什麼,但這通常比分析線性模型或基於樹的模型更爲複雜。要想觀察模型學到了什麼,一種方法是查看模型的權重(權重可視化),見scikit-learn示例庫。
  • 能夠獲取大量數據中包含的信息,並構建無比複雜的模型。
  • 給定足夠的計算時間和數據,並且仔細調節參數,神經網絡通常可以打敗其他機器學習算法(無論是分類任務還是迴歸任務)。
  • 神經網絡——特別是功能強大的大型神經網絡——通常需要很長的訓練時間
  • 需要仔細地預處理數。與SVM 類似,神經網絡在“均勻”數據上的性能最好,其中“均勻”是指所有特徵都具有相似的含義,。如果數據包含不同種類的特徵,那麼基於樹的模型可能表現得更好。

8 監督學習模型的選擇原則

最近鄰:

​ 適用於小型數據集,是很好的基準模型,很容易解釋。對稀疏數據集不好。

線性模型:

​ 非常可靠的首選算法,適用於非常大的數據集,也適用於高維數據。需要縮放。

樸素貝葉斯:

​ 只適用於分類問題。比線性模型速度還快,適用於非常大的數據集和高維數據。精度通常要低於線性模型。

決策樹:

​ 速度很快,不需要數據縮放,可以可視化,很容易解釋。

隨機森林:

​ 幾乎總是比單棵決策樹的表現要好,魯棒性很好,非常強大。不需要數據縮放。不適用於高維稀疏數據。

梯度提升決策樹:

​ 精度通常比隨機森林略高。與隨機森林相比,訓練速度更慢,但預測速度更快,需要的內存也更少。比隨機森林需要更多的參數調節。

支持向量機:

​ 對於特徵含義相似的中等大小的數據集很強大。需要數據縮放,對參數敏感。

神經網絡:

​ 可以構建非常複雜的模型,特別是對於大型數據集而言。對數據縮放敏感,對參數選取敏感。大型網絡需要很長的訓練時間。

Tips:

含不同種類的特徵,那麼基於樹的模型可能表現得更好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章