機器學習模型五花八門不知道怎麼選?這份指南告訴你

本文約

4900字,建議閱讀10分鐘。

本文我們將探討不同的機器學習模型,以及每個模型合理的使用場景。

[ 導讀 ] 一般來說,基於樹形結構的模型在Kaggle競賽中是表現最好的,而其它的模型可以用於融合模型。對於計算機視覺領域的挑戰,CNNs (Convolutional Neural Network, 卷積神經網絡)是最適合不過的。而對於NLP(Natural Language Processing,自然語言處理),LSTMs或GRUs是最好的選擇。下面是一個不完全模型細目清單,同時列出了每個模型的一些優缺點。

1. 迴歸 — 預測連續值

A. 線性迴歸(Linear Regression)

I.Vanilla Linear Regressio優點善於獲取數據集中的線性關係;適用於在已有了一些預先定義好的變量並且需要一個簡單的預測模型的情況下使用;訓練速度和預測速度較快;在小數據集上表現很好;結果可解釋,並且易於說明;當新增數據時,易於更新模型;不需要進行參數調整(下面的正則化線性模型需要調整正則化參數);不需要特徵縮放(下面的正則化線性模型需要特徵縮放);如果數據集具有冗餘的特徵,那麼線性迴歸可能是不穩定的;缺點不適用於非線性數據;預測精確度較低;可能會出現過度擬合(下面的正則化模型可以抵消這個影響);分離信號和噪聲的效果不理想,在使用前需要去掉不相關的特徵;不瞭解數據集中的特徵交互; II. Lasso迴歸, Ridge迴歸, Elastic-Net迴歸優點這些模型是正則化的線性迴歸模型;有助於防止過度擬合;這些模型更善於正則化,因為它們更簡單;適用於當我們只關心幾個特徵的時候;缺點需要特徵縮放;需要調整正則化參數;

B. 迴歸樹(Regression Trees)

I.決策樹(Decision Tree)優點訓練速度和預測速度較快;善於獲取數據集中的非線性關係;瞭解數據集中的特徵交互;善於處理數據集中出現的異常值;善於在數據集中找到最重要的特徵;不需要特徵縮放;結果可解釋,並易於說明;缺點預測精確度較低;需要一些參數的調整;不適用於小型數據集;分離信號和噪聲的效果不理想;當新增數據時,不易更新模型;在實踐中很少使用,而是更多地使用集合樹;可能會出現過度擬合(見下面的融合模型);II.融合模型(RandomForest,XGBoost, CatBoost, LightGBM)優點多重樹結構整理預測;具有較高的預測精確度,在實踐中表現很好;是Kaggle競賽中推薦的算法;善於處理數據集中出現的異常值;善於在數據集中獲取非線性關係;善於在數據集中找到最重要的特徵;能夠分離信號和噪聲;不需要特徵縮放;特別適用於高維度的數據;缺點訓練速度較慢;具有較高的預測速度;結果不易解釋或說明;當新增數據時,不易更新模型;需要調整參數,但調整較為複雜;不適用於小型數據集;

C. 深度學習(Deep Learning)

優點在實踐中表現出較高的預測精確度;可以獲取數據中非常複雜的底層模式;特別適用於大型數據集和高維度數據集;當新增數據時,易於更新模型;網絡的隱藏層明顯減少了對特徵工程的需求;是適用於計算機視覺、機器翻譯、情感分析和語音識別任務的最新技術;缺點具有非常低的訓練速度;需要消耗巨大的計算資源;需要特徵縮放;結果不易解釋或說明;需要大量的訓練數據,因為它要學習大量的參數;在非圖像、非文本、非語音的任務中優於Boosting算法;非常靈活,帶有許多不同的體系結構構建塊,因此需要專業知識來設計體系結構;

D. 基於距離的K近鄰算法(K Nearest Neighbors – Distance Based)

優點訓練速度較快;不需要太多的參數調整;結果可解釋,並易於說明;適用於小型數據集(小於10萬個訓練集)缺點預測精確度較低;不適用於小型數據集;需要選擇合適的距離函數;需要特徵縮放;預測速度隨數據集增大而加快;分離信號和噪聲的效果不理想,在使用前需要去掉不相關的特徵;是內存密集型的算法,因為它可以保存所有的觀察結果;不適用於處理高維度的數據;

2. 分類 — 預測一個或多個類別的概率

A. 邏輯迴歸算法(Logistic Regression)

優點善於對線性可分離數據進行分類;具有較高的訓練速度和預測速度;適用於小型數據集;結果可解釋,並易於說明;當新增數據時,易於更新模型;在正則化時可以避免過度擬合;可以同時進行2個類和多個類的分類任務;不需要參數調整(除非在正則化的時候,我們需要調整正則化參數);不需要特徵縮放(正則化的時候除外);如果數據集具有冗餘特徵,則線性迴歸可能是不穩定的;缺點不適用於非線性可分離數據;具有較低的預測精確度;可能會出現過度擬合(見下面的正則化模型)分離信號和噪聲的效果不理想,在使用前需要去掉不相關的特徵;不瞭解數據集中的特徵交互;

B. 基於距離的支持向量機算法(Support Vector Machines – Distance based)

優點具有較高的預測精確度;即使在高維度數據集上也不會產生過度擬合,因此它適用於具有多個特徵的情況;適用於小型數據集(小於10萬個訓練集);適用於解決文本分類的問題;缺點當新增數據時,不易更新模型;屬於內存高度密集型算法;不適用於大型數據集;需要選擇正確的內核;線性內核對線性數據建模,運行速度快;非線性內核可以模擬非線性邊界,運行速度慢;用Boosting代替!

C. 基於概率的樸素貝葉斯算法(Naive Bayes — Probability based)

優點在文本分類問題上表現極佳;具有較高的訓練速度和預測速度;在小型數據集上表現良好;善於分離信號和噪聲;在實踐中表現出良好的性能;操作簡單,易於實現;適用於小型數據集(小於10萬個訓練集);關於特徵的和潛在分佈的獨立性避免了過度擬合;如果這種獨立性的條件成立,那麼樸素貝葉斯可以在更小的數據集上運行,並且可以以更快的速度進行訓練;不需要特徵縮放;不是內存密集型算法;結果可解釋,並易於說明;根據數據集的大小易於擴展;缺點具有較低的預測精確度;

D. 基於距離的K近鄰算法( K Nearest Neighbors — Distance Based)

優點具有較高的訓練速度;無需太多參數調整;結果可解釋,並易於說明;適用於小型數據集(小於10萬個訓練集);缺點預測精確度較低;在小型數據集上表現不好;需要選擇一個合適的距離函數;需要功能縮放;預測速度隨著數據集增大而加快;分離信號和噪聲的效果不理想,在使用前需要去掉不相關的特徵;是內存密集型算法,因為它可以保存所有的觀察結果;不善於處理高維度的數據;

E. 分類樹(Classification Tree)

I. 決策樹(Decision Tree)優點具有較高的訓練速度和預測速度;善於獲取數據集中的非線性關係;瞭解數據集中的特徵交互;善於處理數據集中出現的異常值;善於在數據集中找到最重要的特徵;可以同時進行2個類和多個類的分類任務;不需要特徵縮放;結果可解釋,並易於說明;缺點預測速度較慢;需要進行參數的調整;在小型數據集上表現不好;分離信號和噪聲的效果不理想;在實踐中很少使用,而是更多地使用集合樹;當新增數據時,不易更新模型;可能會出現過度擬合(見下面的融合模型)II.融合(RandomForest, XGBoost, CatBoost, LightGBM)優點多重樹結構整理預測;具有較高的預測精確度,在實踐中表現很好;是Kaggle競賽中推薦的算法;善於獲取數據集中的非線性關係;善於處理數據集中出現的異常值;善於在數據集中找到最重要的特徵;能夠分離信號和噪聲;無需特徵縮放;特別適用於高維度的數據;缺點訓練速度較慢;預測速度較快;結果不易解釋或說明;當新增數據時,不易更新模型;需要調整參數,但調整較為複雜;在小型數據集上表現不好;

F. 深度學習(Deep Learning)

優點預測精確度較高,在實踐中表現良好;可以獲取數據中非常複雜的底層模式;適用於大型數據集和高維度數據集;當新增數據時,易於更新模型;網絡的隱藏層明顯減少了對特徵工程的需求;是適用於計算機視覺、機器翻譯、情感分析和語音識別任務的最新技術;缺點訓練速度較慢;結果不易解釋或說明;需要消耗巨大的計算資源;需要特徵縮放;需要大量的訓練數據,因為它要學習大量的參數;在非圖像、非文本、非語音的任務中優於Boosting算法;非常靈活,帶有許多不同的體系結構構建塊,因此需要專業知識來設計體系結構;

3. 聚類 — 將數據分類以便最大化相似性

A. DBSCAN聚類算法(Density-Based Spatial Clustering of Applications with Noise)

優點可擴展到大型數據集上;善於噪聲檢測;無需預先知道聚類的數量;可以發現任意形狀的聚類,不會假設聚類的形狀是球狀的;缺點如果整個數據集都是高密度區域,那麼該算法不總是有效的;需要調整密度參數epsilon和min_samples為正確的值,以便獲得好的效果;

B. Kmeans算法

優點特別適於獲取底層數據集的結構;算法簡單,易於解釋;適於預先知道聚類的數量;缺點如果聚類不是球狀的,並且大小相似,那麼該算法不總是有效的;需要預先知道聚類的數量,並需要調整k聚類的選擇以便獲得好的結果;屬於內存密集型的算法;無法擴展到大型數據集上;

4. Misc — 本文中未包含的模型

降維算法(Dimensionality Reduction Algorithms);聚類算法(Clustering algorithms);高斯混合模型(Gaussian Mixture Model);分層聚類(Hierarchical clustering);計算機視覺(CV);卷積神經網絡(Convolutional Neural Networks);圖像分類(Image classification);對象檢測(Object Detection)圖像分割(Image segmentation)自然語言處理(Natural Language Processing,NLP)循環神經網絡(Recurrent Neural Network,RNNs,包括LSTM 和 GRUs)強化學習(Reinforcement Learning)

融合模型

融合模型是一種非常強大的技術,有助於減少過度擬合,並通過組合來自不同模型的輸出以做出更穩定的預測。融合模型是贏得Kaggle競賽的一個重要工具,在選擇模型進行融合時,我們希望選擇不同類型的模型,以確保它們具有不同的優勢和劣勢,從而在數據集中獲取不同的模式。這種更明顯的多樣性特點使得偏差降低。我們還希望確保它們的性能是可以對比的,這樣就能確保預測的穩定性。

我們在這裡可以看到,這些模型的融合實際上比任何單一的模型生成的損失都要低得多。部分的原因是,儘管所有的這些模型都非常擅長預測,但它們都能得到不同的正確預測結果,通過把它們組合在一起,我們能夠根據它們所有不同的優勢組合成一個超級模型。

<code># in order to make the final predictions more robust to overfittingdef blended_predictions(X): return ((0.1 * ridge_model_full_data.predict(X)) + \\\\ (0.2 * svr_model_full_data.predict(X)) + \\\\ (0.1 * gbr_model_full_data.predict(X)) + \\\\ (0.1 * xgb_model_full_data.predict(X)) + \\\\ (0.1 * lgb_model_full_data.predict(X)) + \\\\ (0.05 * rf_model_full_data.predict(X)) + \\\\ (0.35 * stack_gen_model.predict(np.array(X))))/<code>

融合模型分為四種類型(包括混合型):

Bagging:使用隨機選擇的不同數據子集訓練多個基礎模型,並進行替換。讓基礎模型對最終的預測進行投票。常用於隨機森林算法(RandomForests);Boosting:迭代地訓練模型,並且在每次迭代之後更新獲得每個訓練示例的重要程度。常用於梯度增強算法(GradientBoosting);Blending:訓練許多不同類型的基礎模型,並在一個holdout set上進行預測。從它們的預測結果中再訓練一個新的模型,並在測試集上進行預測(用一個holdout set堆疊);Stacking:訓練多種不同類型的基礎模型,並對數據集的k-folds進行預測。從它們的預測結果中再訓練一個新的模型,並在測試集上進行預測;

模型對比

權重和偏差讓我們可以用一行代碼來跟蹤和比較模型的性能表現。選擇要測試的模型後,對其進行訓練並添加wandb.log({‘score’: cv_score})來記錄模型的運行狀態。完成訓練之後,你就可以在一個簡單的控制檯中對比模型的性能了!

<code># WandBimport wandbimport tensorflow.kerasfrom wandb.keras import WandbCallbackfrom sklearn.model_selection import cross_val_score# Import models (Step 1: add your models here)from sklearn import svmfrom sklearn.linear_model import Ridge, RidgeCVfrom xgboost import XGBRegressor# Model 1# Initialize wandb run# You can change your project name here. For more config options, see https://docs.wandb.com/docs/init.htmlwandb.init(anonymous='allow', project="pick-a-model")# Initialize model (Step 2: add your classifier here)clf = svm.SVR(C= 20, epsilon= 0.008, gamma=0.0003)# Get CV scorescv_scores = cross_val_score(clf, X_train, train_labels, cv=5)# Log scoresfor cv_score in cv_scores: wandb.log({'score': cv_score})# Model 2# Initialize wandb run# You can change your project name here. For more config options, see https://docs.wandb.com/docs/init.htmlwandb.init(anonymous='allow', project="pick-a-model")# Initialize model (Step 2: add your classifier here)clf = XGBRegressor(learning_rate=0.01, n_estimators=6000, max_depth=4, min_child_weight=0, gamma=0.6, subsample=0.7, colsample_bytree=0.7, objective='reg:linear', nthread=-1, scale_pos_weight=1, seed=27, reg_alpha=0.00006, random_state=42)# Get CV scorescv_scores = cross_val_score(clf, X_train, train_labels, cv=5)# Log scoresfor cv_score in cv_scores: wandb.log({'score': cv_score})# Model 3# Initialize wandb run# You can change your project name here. For more config options, see https://docs.wandb.com/docs/init.htmlwandb.init(anonymous='allow', project="pick-a-model")# Initialize model (Step 2: add your classifier here)ridge_alphas = [1e-15, 1e-10, 1e-8, 9e-4, 7e-4, 5e-4, 3e-4, 1e-4, 1e-3, 5e-2, 1e-2, 0.1, 0.3, 1, 3, 5, 10, 15, 18, 20, 30, 50, 75, 100]clf = Ridge(alphas=ridge_alphas)# Get CV scorescv_scores = cross_val_score(clf, X_train, train_labels, cv=5)# Log scoresfor cv_score in cv_scores: wandb.log({'score': cv_score})/<code>

就這樣,在有了所有的工具和算法之後,就可以為你的問題選擇正確的模型了!

模型的選擇可能是非常複雜的,但我希望本指南能給你帶來一些啟發,讓你找到模型選擇的好方法。

原文鏈接:

https://lavanya.ai/2019/09/18/part-ii-whirlwind-tour-of-machine-learning-models/

校對:林亦霖

—完—

關注清華-青島數據科學研究院官方微信公眾平臺“ THU數據派 ”及姊妹號“ 數據派THU ”獲取更多講座福利及優質內容。