xgb使用sklearn接口(推薦)
XGBClassifier
from xgboost.sklearn import XGBClassifier clf = XGBClassifier( silent=0 ,#設置成1則沒有運行信息輸出,最好是設置為0.是否在運行升級時打印消息。 #nthread=4,# cpu 線程數 默認最大 learning_rate= 0.3, # 如同學習率 min_child_weight=1, # 這個參數默認是 1,是每個葉子里面 h 的和至少是多少,對正負樣本不均衡時的 0-1 分類而言 #,假設 h 在 0.01 附近,min_child_weight 為 1 意味着葉子節點中最少需要包含 100 個樣本。 #這個參數非常影響結果,控制葉子節點中二階導的和的最小值,該參數值越小,越容易 overfitting。 max_depth=6, # 構建樹的深度,越大越容易過擬合 gamma=0, # 樹的葉子節點上作進一步分區所需的最小損失減少,越大越保守,一般0.1、0.2這樣子。 subsample=1, # 隨機采樣訓練樣本 訓練實例的子采樣比 max_delta_step=0,#最大增量步長,我們允許每個樹的權重估計。 colsample_bytree=1, # 生成樹時進行的列采樣 reg_lambda=1, # 控制模型復雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。 #reg_alpha=0, # L1 正則項參數 #scale_pos_weight=1, #如果取值大於0的話,在類別樣本不平衡的情況下有助於快速收斂。平衡正負權重 #objective= 'multi:softmax', #多分類的問題 指定學習任務和相應的學習目標 #num_class=10, # 類別數,多分類與 multisoftmax 並用 n_estimators=100, #樹的個數 seed=1000 #隨機種子 #eval_metric= 'auc' ) clf.fit(X_train,y_train,eval_metric='auc')
5.3 基於Scikit-learn接口的分類
# ==============基於Scikit-learn接口的分類================ from sklearn.datasets import load_iris import xgboost as xgb from xgboost import plot_importance from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 加載樣本數據集 iris = load_iris() X,y = iris.data,iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234565) # 數據集分割 # 訓練模型 model = xgb.XGBClassifier(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective='multi:softmax') model.fit(X_train, y_train) # 對測試集進行預測 y_pred = model.predict(X_test) # 計算准確率 accuracy = accuracy_score(y_test,y_pred) print("accuarcy: %.2f%%" % (accuracy*100.0)) # 顯示重要特征 plot_importance(model) plt.show()
輸出結果:Accuracy: 96.67 %

基於Scikit-learn接口的回歸
# ================基於Scikit-learn接口的回歸================ import xgboost as xgb from xgboost import plot_importance from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split from sklearn.datasets import load_boston boston = load_boston() X,y = boston.data,boston.target # XGBoost訓練過程 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) model = xgb.XGBRegressor(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective='reg:gamma') model.fit(X_train, y_train) # 對測試集進行預測 ans = model.predict(X_test) # 顯示重要特征 plot_importance(model) plt.show()

參數調優的一般方法
我們會使用和GBM中相似的方法。需要進行如下步驟:
1. 選擇較高的學習速率(learning rate)。一般情況下,學習速率的值為0.1。但是,對於不同的問題,理想的學習速率有時候會在0.05到0.3之間波動。選擇對應於此學習速率的理想決策樹數量。XGBoost有一個很有用的函數“cv”,這個函數可以在每一次迭代中使用交叉驗證,並返回理想的決策樹數量。
2. 對於給定的學習速率和決策樹數量,進行決策樹特定參數調優(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在確定一棵樹的過程中,我們可以選擇不同的參數,待會兒我會舉例說明。
3. xgboost的正則化參數的調優。(lambda, alpha)。這些參數可以降低模型的復雜度,從而提高模型的表現。
4. 降低學習速率,確定理想參數。
咱們一起詳細地一步步進行這些操作。
第一步:確定學習速率和tree_based 參數調優的估計器數目。
為了確定boosting 參數,我們要先給其它參數一個初始值。咱們先按如下方法取值:
1、max_depth = 5 :這個參數的取值最好在3-10之間。我選的起始值為5,但是你也可以選擇其它的值。起始值在4-6之間都是不錯的選擇。
2、min_child_weight = 1:在這里選了一個比較小的值,因為這是一個極不平衡的分類問題。因此,某些葉子節點下的值會比較小。
3、gamma = 0: 起始值也可以選其它比較小的值,在0.1到0.2之間就可以。這個參數后繼也是要調整的。
4、subsample,colsample_bytree = 0.8: 這個是最常見的初始值了。典型值的范圍在0.5-0.9之間。
5、scale_pos_weight = 1: 這個值是因為類別十分不平衡。
注意哦,上面這些參數的值只是一個初始的估計值,后繼需要調優。這里把學習速率就設成默認的0.1。然后用xgboost中的cv函數來確定最佳的決策樹數量。
第二步: max_depth 和 min_weight 參數調優
我們先對這兩個參數調優,是因為它們對最終結果有很大的影響。首先,我們先大范圍地粗調參數,然后再小范圍地微調。
注意:在這一節我會進行高負荷的柵格搜索(grid search),這個過程大約需要15-30分鍾甚至更久,具體取決於你系統的性能。你也可以根據自己系統的性能選擇不同的值。
第三步:gamma參數調優
第四步:調整subsample 和 colsample_bytree 參數
第五步:正則化參數調優。
第6步:降低學習速率
最后,我們使用較低的學習速率,以及使用更多的決策樹。我們可以用XGBoost中的CV函數來進行這一步工作。
