快速學習如何為XGboost優化超引數!
在過去的幾年中,XGBoost被廣泛用于表格資料推斷,并且贏得了數百個挑戰,但是,僅僅通過XGBoost并不能完成完成整的解決方案,同樣的模型為什么有些人能獲得更好的準確性呢?除了經驗方面的差異,還有一個事實,那就是他們優化了超引數!
因此,我們今天將告訴您如何獲取特定資料集的最佳超引數,
我們將在Hacker Earth挑戰的資料集上使用scikit-learn配合XGBoost,
https://www.hackerearth.com/en-us/challenges/competitive/hackerearth-machine-learning-challenge-predict-defcon-level/problems/
以下我使用的全部代碼,我排除了分析部分和資料處理部分,因為這不是本文的目標,
#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)基本上取決于是否要并行化計算, (如果有多個核心)
如前所述,這是一個隨機搜索,因此并不是所有的引陣列合都將被試用,這有助于節省計算時間,并具有超引數的初步建議,
網格搜索優化
#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])}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模型的超引數了,顯然,您也可以對模型執行此操作,例如隨機林、決策樹等,
原文地址:https://imba.deephub.ai/p/68e85b106f0111ea90cd05de3860c663

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/43601.html
標籤:其他
