超參數調整實戰:scikit-learn配合XGBoost的競賽top20策略

2020-12-05 deephub

快速學習如何為XGboost優化超參數!

在過去的幾年中,XGBoost被廣泛用於表格數據推斷,並且贏得了數百個挑戰。但是,僅僅通過XGBoost並不能完成完成整的解決方案,同樣的模型為什麼有些人能獲得更好的準確性呢?除了經驗方面的差異,還有一個事實,那就是他們優化了超參數!

因此,我們今天將告訴您如何獲取特定數據集的最佳超參數。

我們將在Hacker Earth挑戰的數據集上使用scikit-learn配合XGBoost。

以下我使用的全部代碼。我排除了分析部分和數據處理部分,因為這不是本文的目標。

#imported libsimport numpy as np

import pandas as pd

from xgboost import XGBClassifier

import matplotlib.pyplot as plt

from scipy import stats

import seaborn as sns

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.pipeline import Pipeline

from sklearn.model_selection import RandomizedSearchCV, GridSearchCV

import sys

train = pd.read_csv("train.csv")

X = train.drop(['DEFCON_Level','ID'],axis=1)

y = train['DEFCON_Level']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

#For classification #Random Search

xgb_pipeline = Pipeline([('scaler', StandardScaler()), ('classifier',XGBClassifier())])

params = {

'min_child_weight': [1, 5, 10],

'gamma': [0.5, 1, 1.5, 2, 5],

'subsample': [0.6, 0.8, 1.0],

'colsample_bytree': [0.6, 0.8, 1.0],

'max_depth': [3, 4, 5]

}

random_search = RandomizedSearchCV(xgb_pipeline, param_distributions=params, n_iter=100,

scoring='f1_weighted', n_jobs=4, verbose=3, random_state=1001 )

random_search.fit(X_train,y_train)

#OR#Grid Search

xgb_pipeline = Pipeline([('scaler', StandardScaler()), ('classifier',XGBClassifier())])

gbm_param_grid = {

'classifier__learning_rate': np.array([0.01,0.001]),

'classifier__n_estimators': np.array([100,200,300,400]),

'classifier__subsample': np.array([0.7,0.8,0.9]),

'classifier__max_depth': np.array([10,11,12,13,14,15,16,17]),

'classifier__lambda': np.array([1]),

'classifier__gamma': np.array([0])

#'classifier__colsample_bytree': np.arange(0,1.1,.2)

}

grid_search = GridSearchCV(estimator=xgb_pipeline, param_grid=gbm_param_grid, n_jobs= -1,

scoring='f1_weighted', verbose=10)

grid_search.fit(X_train,y_train)

#Print out best parameters

print(random_search.best_params_)

print(grid_search.best_params_)

#Print out scores on validation set

print(random_search.score(X_test,y_test))

print(grid_search.score(X_test,y_test))

隨機搜索優化

隨機搜索優化

讓我們分析一下隨機搜索的區塊:

#Random Search

xgb_pipeline = Pipeline([('scaler', StandardScaler()),

('classifier',XGBClassifier())])

params = {'min_child_weight': [1, 5, 10],

'gamma': [0.5, 1, 1.5, 2, 5],

'subsample': [0.6, 0.8, 1.0],

'colsample_bytree': [0.6, 0.8, 1.0],

'max_depth': [3, 4, 5]}random_search = RandomizedSearchCV(xgb_pipeline, param_distributions=params, n_iter=100, scoring='f1_weighted', n_jobs=4, verbose=3, random_state=1001 )random_search.fit(X_train,y_train)

當我們使用XGBClassifier時,XGBRegressor的工作原理相同。 您想搜索的參數在params中,可以簡單地添加要嘗試的值。

我們將f1_weighted作為指標,因為這是比賽中的要求。 作業數量(n_jobs)基本上取決於是否要並行化計算。 (如果有多個核心)

如前所述,這是一個隨機搜索,因此並不是所有的參數組合都將被試用,這有助於節省計算時間,並具有超參數的初步建議。

網格搜索優化

xgb_pipeline = Pipeline([('scaler', StandardScaler()), ('classifier',XGBClassifier())])gbm_param_grid = {

'classifier__learning_rate': np.array([0.01,0.001]),

'classifier__n_estimators': np.array([100,200,300,400]), 'classifier__subsample': np.array([0.7,0.8,0.9]), 'classifier__max_depth': np.array([10,11,12,13,14,15,16,17]), 'classifier__lambda': np.array([1]),

'classifier__gamma': np.array([0])}grid_search = GridSearchCV(estimator=xgb_pipeline, param_grid=gbm_param_grid, n_jobs= -1, scoring='f1_weighted', verbose=10) grid_search.fit(X_train,y_train)

跟上面一樣,可以更改XGBClassifier()使其成為XGBRegressor()。 我們為變量n_jobs使用-1,以表明我們希望使用所有核進行計算。 詳細部署以顯示分數和用於在訓練時獲取分數的參數。

結論

最後,只需列印以下最佳參數即可。

#Print out best parameters

print(random_search.best_params_)print(grid_search.best_params_)#Print out scores on validation set

print(random_search.score(X_test,y_test))

print(grid_search.score(X_test,y_test))

看看驗證集的分數!

就這樣,現在你知道如何優化XGBoost模型的超參數了。顯然,您也可以對模型執行此操作,例如隨機林、決策樹等。

相關焦點

  • CDA承接的全球頂級機器學習Scikit-learn 中文社區上線啦!
    基於CDA全國教研團隊近5年的Scikit-learn課程研發經驗,為了響應越來越多的數據科學愛好者的學習需求,CDA通過一年多的Scikit-learn文檔的翻譯和認真校對,並在CDA研發部門的密切配合下,Scikit-learn中文社區終於上線了。
  • Scikit-learn玩得很熟了?這些功能你都知道嗎?
    Scikit-learn是Python所有的機器學習程序包中,你必須掌握的最重要的一個包,它包含各種分類算法,回歸算法和聚類算法,其中包括支持向量機、隨機森林、梯度提升、k均值和基於密度的聚類算法(DBSCAN),且旨在與Python數值庫NumPy和科學庫SciPy進行相互配合。它通過一個接口,提供了一系列的有監督和無監督算法。
  • 利用Spark 和 scikit-learn 將你的模型訓練加快 100 倍
    該項目的目標是為使用 Spark 分發 scikit 學習元估計器提供一個通用框架。元估計器的例子有決策樹集合(隨機林和額外隨機樹)、超參數調解器(網格搜索和隨機搜索)和多分類技術(一對多和多對一)。我們可以很快在一臺機器上訓練 1797 條記錄的支持向量機,花費的時間不到一秒鐘。但超參數調整需要在訓練數據的不同子集上進行大量的訓練。如下圖所示,我們已經構建了一個總計需要 1050 個訓練的參數網格。在擁有 100 多個核的 Spark 上使用 sk dist 只需 3.4 秒。這項工作的總時間是 7.2 分鐘,意思是在沒有並行化的單機上訓練要花這麼長時間。
  • 開源機器學習框架:Scikit-learn API簡介
    模型選擇:是指對於給定參數和模型的比較、驗證和選擇,其主要目的是通過參數調整來提升精度。目前Scikit-learn實現的模塊包括:格點搜索,交叉驗證和各種針對預測誤差評估的度量函數。數據預處理:是指數據的特徵提取和歸一化,是機器學習過程中的第一個也是最重要的一個環節。
  • 百聞不如一練:可視化調試模型超參數!
    該例子以手寫數據集為例,使用支持向量機的方法對數據進行建模,然後調用scikit-learn中validation_surve方法將模型交叉驗證的結果進行可視化。需要注意的是,在使用validation_curve方法時,只能驗證一個超參數與模型訓練集和驗證集得分的關係(即二維的可視化),而不能實現多參數與得分間關係的可視化。
  • 如何在Apache Pyspark中運行Scikit-learn模型
    在本文中,我們將了解如何在Apache Pyspark中運行Scikit-learn模型,並討論有關每個步驟的細節。如果您已經準備好了機器學習模型,則可以直接跳到「 pyspark wrapper」部分,也可以通過以下步驟創建一個簡單的scikit learn機器學習模型。
  • Python粉都應該知道的開源機器學習框架:Scikit-learn入門指南
    和其他眾多的開源項目一樣,Scikit-learn目前主要由社區成員自發進行維護。可能是由於維護成本的限制,Scikit-learn相比其他項目要顯得更為保守。這主要體現在兩個方面:一是Scikit-learn從來不做除機器學習領域之外的其他擴展,二是Scikit-learn從來不採用未經廣泛驗證的算法。
  • WePay機器學習反欺詐實踐:Python+scikit-learn+隨機森林
    WePay採用了流行的Python、scikit-learn開源學習機器學習工具以及隨機森林算法。以下是文章內容:什麼是shellselling?雖然欺詐幾乎涉及各種領域,但相對於傳統的買方或賣方僅僅擔心對方是否是騙子,支付平臺需要擔心的是交易雙方。
  • 劍指LightGBM和XGboost!斯坦福發表NGBoost算法
    該算法由 Base learners 、參數概率分布和評分規則組成。我將簡要地解釋一下這些術語是什麼。這些 Base learners 使用 scikit-learn 的決策樹作為樹型學習者,使用嶺回歸作為線性學習者。參數概率分布參數概率分布是一種條件分布。這是由 Base learners 輸出的加法組合形成的。
  • Python機器學習5:使用scikit-learn實現三種集成學習Bagging算法
    在這篇文章中,將主要講解Bagging算法的常見三種模型,並介紹如何使用scikit-learn實現這三種模型。後面幾篇文章將講解Boosting和Majority Voting算法。Bagging算法Bagging算法指的是利用數據集訓練多個子模型,然後對多個子模型進行綜合,最終對所有子模型預測結果取平均值,作為最終的模型預測結果。
  • Scikit-Learn 學得如何?程式設計師不容錯過十大實用功能來襲
    Scikit-learn擁有內置數據集Scikit-learnAPI內置了各種實驗以及真實的數據集。只需一行代碼即可訪問這些數據集,如果你正在學習或者想快速嘗試新功能,那麼這些數據集能助你一臂之力。例如,對於分類數據和數字數據混合而成的數據,你可能希望通過one-hot編碼將分類數據轉換為數字值,並調整數字變量的比例。Scikit-learn流水線擁有一個名叫ColumnTransformer的函數,可通過索引或列名稱來指定將最合適的預處理應用到哪些列。
  • 使用scikit-learn進行特徵選擇
    scikit-learn中提供了用於特徵選擇的模塊feature_selection,主要方法包括方差移除法,卡方檢驗法,基於L1的特徵選擇和基於樹的特徵選擇
  • 如何使用XGBoost模型進行時間序列預測
    它在諸如Kaggle等數據科學競賽的獲勝者中最受歡迎。XGBoost也可以被用於時間序列預測,儘管它需要將時間序列數據集先轉換成監督學習問題。它需要用到一種被稱為前進式驗證的特殊方法來評估模型,因為使用k折驗證來評估模型容易導致偏向樂觀的結果。本教程中,你將探索如何為時間序列預測開發一個XGBoost模型。
  • 代碼詳解:一文掌握神經網絡超參數調優
    其中可調優的超參數是學習速度,動量,衰變和nesterov項。學習速度在每批結束時控制重量,並且動量控制先前重量如何影響當前重量。衰變表示每次更新時學習速度的下降幅度。nesterov取值「True」或「False」取決於是否要應用Nesterov動量。這些超參數的通常數值是lr = 0.01,衰變= 1e-6,動量= 0.9,nesterov = True。
  • 《基於Scikit-Learn、Keras和TensorFlow的機器學習實戰》:集成學習和隨機森林
    事實上,在機器學習競賽中獲得勝利的算法經常會包含一些集成方法。在本章中我們會討論一下特別著名的集成方法,包括bagging, boosting和stacking。我們也會討論隨機森林。(這些超參數決定數怎麼生長),以及BaggingClassifier的超參數(用於控制集成本身)。