【機(jī)器學(xué)習(xí)】xgboost使用技巧

sklearn api與原生api

python下的xgboost有兩套api,一套是原生api,一套是sklearn風(fēng)格的api。兩套api的邏輯還是區(qū)別較大的,但是考慮到使用習(xí)慣上的統(tǒng)一以及代碼集成的統(tǒng)一管理,比較推薦sklearn api。

快速上手,以分類為例:

from xgboost import XGBClassifier as xgbc
alg=xgbc()
alg.fit(x_train,y_train)
y_pred=alg.predict(x_test) 

參數(shù)解析

xgb的主要參數(shù)分為三類:常規(guī)參數(shù)、模型參數(shù)、學(xué)習(xí)任務(wù)參數(shù),具體解析如下:

常規(guī)參數(shù)General Parameters

image.png

模型參數(shù)Booster Parameters

image.png

學(xué)習(xí)任務(wù)參數(shù)(Learning Task Parameters)

image.png

調(diào)參

gridsearch暴力搜索

這種方法很懶人,缺點(diǎn)就是直接所有參數(shù)排列組合會(huì)很多。效率非常低。

串行調(diào)參,一次只調(diào)一個(gè)或兩個(gè)參數(shù)

調(diào)參順序

  • n_estimators

  • min_child_weight、max_depth

  • gamma

  • subsample、colsample_bytree

  • reg_alpha、reg_lambda

  • learning_rate

調(diào)參策略

  • 由粗到精

  • 調(diào)好一個(gè)參數(shù),立即更新基礎(chǔ)參數(shù)

  • 觀察學(xué)習(xí)曲線、訓(xùn)練集與驗(yàn)證集表現(xiàn)

    def search_best_params(cv_params,other_params):
            alg = xgbc(**other_params)
            optimized_alg = model_selection.GridSearchCV(estimator=alg,         
            param_grid=cv_params, scoring='accuracy', cv=5, verbose=2, n_jobs=-1)
            optimized_alg.fit(X_train, y_train)
            # evalute_result = optimized_alg.grid_scores_
    
            # print('每輪迭代運(yùn)行結(jié)果:{0}'.format(evalute_result))
            print('參數(shù)的最佳取值:{0}'.format(optimized_alg.best_params_))
            print('最佳模型得分:{0}'.format(optimized_alg.best_score_))
    
    other_params = {'learning_rate': 0.1, 'n_estimators': 500, 'max_depth': 3, 'min_child_weight': 5,'seed': 0,'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 0, 'reg_lambda': 1}
    cv_params = {'n_estimators':[10,100,200,500,1000]}
    search_best_params(cv_params,other_params)
    

防止過(guò)擬合

  • 增大min_child_weight、增大gamma

  • 增加正則項(xiàng)reg_alpha、reg_lambda

  • 減少max_depth、降低subsample、降低colsample_bytree

  • 使用early stop

    當(dāng)驗(yàn)證集的auc20次迭代中均不發(fā)生變化或變差,則停止迭代。
    alg.fit(x_train, y_train, eval_metric=‘a(chǎn)uc’, eval_set=[(x_train, y_train),         (x_eval, y_eval)],early_stopping_rounds=20)
    

自定義eval_metric

# sklearn api中自定義的eval_metric必須是越低越好的類型,故使用1-ks作為驗(yàn)證目標(biāo)。
  def my_ks(pred, y, n=1000):
      data = {"y": np.array(y), "pred": np.array(pred)}
  df = pd.DataFrame(data)
  all_true = sum(y)
  all_false = len(y) - all_true

  ks = 0.0
  for i in np.arange(0.0, 1.0, 1.0 / n):
      tp = sum((df.y == 1) & (df.pred >= i))  # o_pre[i])
      tpr = tp * 1.0 / all_true
      fp = sum((df.y == 0) & (df.pred >= i))  # o_pre[i])
      fpr = fp * 1.0 / all_false
      if (tpr - fpr) > ks:
          ks = tpr - fpr
  return ks

  def eval_ks(pred, y, n=1000):
      labels = y.get_label()
      return '1-ks_score', 1 - my_ks(pred, labels)

  def evalue(alg, x_train, x_test, y_train, y_test):
        x_train, x_eval, y_train, y_eval = model_selection.train_test_split(x_train, y_train, test_size=0.3, random_state=0)
        alg.fit(x_train, y_train, eval_metric=eval_ks, eval_set=[(x_train, y_train), (x_eval, y_eval)],early_stopping_rounds=20)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容