6.3 API:XGBoost

1. XGBoost


XGBoostのパラメーターは、次の3つのカテゴリに分類されます。

  1. 一般的なパラメータ:マクロ関数制御
  2. ブースターパラメーター:各ステップのブースター(ツリー/回帰)を制御します。ブースターパラメーターは、通常、モデルの効果と計算コストを制御できます。私たちが呼んでチューニングすることはブースターパラメータを調整大幅にあり
  3. ターゲットパラメータの学習:トレーニングターゲットのパフォーマンスを制御します。問題の分割は、主に学習目標パラメータに反映されます。たとえば、分類または回帰を実行しますか、2つの分類または複数分類を実行しますか。これらはすべて、ターゲットパラメータによって提供されます。

1.一般的なパラメータ

ブースター:gbtreeとgblinearの2つのパラメーターオプションがあります。gbtreeはツリー構造を使用してデータを実行しますが、gblinearは線形モデルに基づいています。

サイレント:サイレントモード、モデルの実行中は出力なし

nthread:スレッドの数を使用します。通常は-1に設定し、すべてのスレッドを使用します。必要に応じて、できるだけ多くのスレッドを使用するように設定します

2.ブースターパラメーター

n_estimator:num_boosting_roundsとも呼ばれます。
これは、生成されるツリーの最大数と反復の最大数です。

Learning_rate:etaと呼ばれることもあり、システムのデフォルト値は0.3です。
各反復のステップ長は非常に重要です。大きすぎると動作精度が高くなく、小さすぎると動作速度が遅くなります。通常、デフォルト値よりも小さい値を使用します。約0.1で十分です。

ガンマ:システムのデフォルトは0で、多くの場合0を使用します。
ノードが分割されると、分割後に損失関数の値が低下した場合にのみ、ノードが分割されます。ガンマは、ノード分割に必要な最小損失関数ドロップ値を指定します。このパラメーターの値が大きいほど、アルゴリズムはより保守的になります。ガンマ値が大きいほど、ノードを分割するための損失関数が低下します。したがって、ツリーの生成時にノードを分割することは容易ではありません。範囲:[0、∞]

サブサンプル:システムのデフォルトは1です。
このパラメーターは、各ツリーのランダムサンプリングの比率を制御します。このパラメーターの値を減らすと、アルゴリズムはより保守的になり、過剰適合を回避できます。ただし、この値の設定が小さすぎると、フィッティングが不十分になる可能性があります。標準値:0.5-1、0.5は、過剰適合を防ぐための平均サンプリングを表します。範囲:(0,1]、0は望ましくないことに注意してください。

colsample_bytree:システムのデフォルト値は1です。通常は0.8前後に設定します。
ランダムにサンプリングされた各列の比率を制御するために使用されます(各列は機能です)。標準値:0.5-1範囲:(0,1]

colsample_bylevel:デフォルトは1で、これも1に設定します。
これは前のものよりも詳細で、各ツリーが分割されたときの列サンプリングの比率を示します。

max_depth:システムのデフォルト値は6
で、通常は3〜10の数値を使用します。この値は、ツリーの最大深度です。この値は、過剰適合を制御するために使用されます。max_depthが大きいほど、モデルはより具体的に学習します。0に設定すると、制限がないことを意味します。範囲:[0、∞]

max_delta_step:デフォルトは0で、通常は0を使用し
ます。このパラメーターは、各ツリーの重みの変更の最大ステップ長を制限します。このパラメーターの値が0の場合、制約がないことを意味します。彼に特定の正の値が割り当てられている場合、アルゴリズムはより保守的です。通常、このパラメーターを設定する必要はありませんが、カテゴリーのサンプルが極端に不均衡な場合、このパラメーターはロジスティック回帰オプティマイザーに非常に役立ちます。

lambda:reg_lambdaとも呼ばれ、デフォルト値は0です。
重みのL2正則化項。(リッジ回帰に似ています)。このパラメーターは、XGBoostの正則化部分を制御するために使用されます。このパラメーターは、過剰適合を減らすのに非常に役立ちます。

alpha:reg_alphaとも呼ばれ、デフォルトは0
で、重みのL1正則化項です。(ラッソ回帰に似ています)。非常に高次元の状況に適用できるため、アルゴリズムが高速になります。

scale_pos_weight:デフォルトは1
です。各カテゴリのサンプルのバランスが非常に悪い場合、このパラメータを正の値に設定すると、アルゴリズムの収束が速くなります。これは通常、陽性サンプルの数に対する陰性サンプルの数の比率として設定できます。

3.ターゲットパラメータの学習

目的[デフォルト= reg:線形]

reg:linear –線形回帰
reg:logistic –ロジスティック回帰
binary:logistic –バイナリロジスティック回帰、出力は確率
binary:logitraw –バイナリロジスティック回帰、出力結果はw T xw ^ TxwT x
count:poisson-カウント問題のポアソン回帰。出力結果はポアソン分布です。ポアソン回帰では、max_delta_stepのデフォルト値は0.7(最適化を保護するため
に使用)
です。multi:softmax–マルチクラス分類にsoftmax目的関数を使用するようにXGBoostを設定します。パラメーターnum_class(カテゴリー数)multi:softprobを設定する必要があります。 – softmaxと同様ですが、出力結果はndata * nclassのベクトルです。ここで、値は各データが各クラスに分割される確率です。

eval_metric [デフォルト値=目的関数によって選択]

rmse:二乗平均平方根誤差
mae:平均絶対値誤差
logloss:負の対数尤度
誤差:2つの分類の誤差率。その値は、すべての分類の数に対する誤分類の数の比率によって取得されます。予測の場合、0.5を超える予測値は正と見なされ、その他の値は負に分類されます。'
t 'によって異なるしきい値を設定できます。merror:マルチクラスエラー率、計算式は(間違ったケース)/(すべてのケース)
mlogloss:マルチクラスログ損失auc:
曲線下面積
ndcg:正規化された割引累積ゲイン
マップ:平均正解率

一般的に、xgboost.train(params、dtrain)関数を使用してモデルをトレーニングします。ここでのパラメーターはブースターパラメーターを参照します

2.パラメータの調整

公式の推奨事項は、過剰適合制御することです

トレーニングの精度は高いがテストの精度は低いことに気付いた場合は、過剰適合の問題が発生している可能性があります。
xgboostの過剰適合を制御するには、通常2つの方法があります。

最初の方法は、モデルの複雑さを直接制御することです。
これには、max_depth、min_child_weight、gammaが含まれます。2
番目の方法は、ランダム性を高めてトレーニングをノイズに対してロバストにすることです。
これには、サブサンプル、colsample_bytreeが含まれます。
ステップサイズetaを減らすこともできます。、しかしあなたがそれをするときそれをするときnum_roundを増やすことを忘れないでください

広告クリックログなどの一般的な状況では、データセットは非常に不均衡です。これはxgboostモデルのトレーニングに影響を与える可能性があり、
それを改善する2つの方法があります。

予測ランキング順(AUC)のみを気にする場合

  1. scale_pos_weightを使用して、正の重みと負の重みのバランスを取ります。
  2. 評価にAUCを使用する

正しい予測の確率が気になる場合

  1. この場合、データセットのバランスを取り直すことはできません
  2. この場合、パラメーターmax_delta_stepを有限数(たとえば1)に設定すると、収束に役立ちます

3つの例

xgb
データセットのダウンロード-抽出コード:1234

import xgboost as xgb
from sklearn.datasets import load_svmlight_file
from sklearn.metrics import roc_auc_score

# 读取数据并自动做一个分割(提取码:1234 把libsvm格式读取成以前我们常用的二维数组形式)
X_train, y_train = load_svmlight_file('agaricus_train.txt')
X_test, y_test = load_svmlight_file('agaricus_test.txt')

print(type(X_train))
# train函数下需要传入一个Dmatrix值
dtrain = xgb.DMatrix(X_train, y_train)
dtest = xgb.DMatrix(X_test, y_test)

params = {
    
    
    'max_depth': 15,
    'learning_rate': 0.1,
    'n_estimators': 2000,
    'min_child_weight': 5,
    'max_delta_step': 0,
    'subsample': 0.8,
    'colsample_bytree': 0.7,
    'reg_alpha': 0,
    'reg_lambda': 0.4,
    'scale_pos_weight': 0.8,
    'silent': True,
    'objective': 'binary:logistic',
    'missing': None,
    'eval_metric': 'auc',
    'seed': 1440,
    'gamma': 0
}  # 这里的params特指booster参数,注意这个eva_metric是评估函数

# early_stopping:这里指的是30轮迭代中效果未增长便停止训练
# verbose_eval=True表示每轮打印输出
xlf = xgb.train(params, dtrain, evals=[(dtest, 'eval')],
                num_boost_round=2000, early_stopping_rounds=30, verbose_eval=True)

y_pred = xlf.predict(dtest, ntree_limit=xlf.best_ntree_limit)
# xgboost没有直接使用效果最好的树作为模型的机制,这里采用最大树深限制的方法,目的是获取刚刚early_stopping效果最好的,实测性能可以
auc_score = roc_auc_score(y_test, y_pred)  # 算一下预测结果的roc值

# 结果
y_pred = [0.33062753 0.6676669  0.33062753 ... 0.66978204 0.3305031  0.66978204]

予測される出力は、一連の連続値です。これは、これらのカテゴリでxgboostの確率が最大の確率値です。xGBoostClassifier()の
形式
で、xgboostは、gridsearchなどのsklearnの使用に適合するために、XGBoostClassifier()とXGBoostRegression()の2つの関数を開発しました。分類と回帰処理は、より簡単かつ迅速に実行できます。xgboostのsklearnパッケージにはfeature_importanceメジャーがありませんが、get_fscore()関数には同じ関数があることに注意してください。

import xgboost as xgb
from sklearn.datasets import load_svmlight_file
from sklearn.metrics import roc_auc_score

# 读取数据并自动做一个分割(把libsvm格式读取成以前我们常用的二维数组形式)
X_train, y_train = load_svmlight_file('agaricus_train.txt')
X_test, y_test = load_svmlight_file('agaricus_test.txt')

print(type(X_train))

# 这里不需要Dmatrix

xlf = xgb.XGBClassifier(max_depth=10,
                        learning_rate=0.01,
                        n_estimators=2000,
                        silent=True,
                        objective='binary:logistic',
                        nthread=-1,
                        gamma=0,
                        min_child_weight=1,
                        max_delta_step=0,
                        subsample=0.85,
                        colsample_bytree=0.7,
                        colsample_bylevel=1,
                        reg_alpha=0,
                        reg_lambda=1,
                        scale_pos_weight=1,
                        seed=1440,
                        missing=None)
xlf.fit(X_train, y_train, eval_metric='error', verbose=True, eval_set=[(X_test, y_test)], early_stopping_rounds=30)
# 这个verbose主要是调节系统输出的,如果设置成10,便是每迭代10次就有输出。
# 注意我们这里eval_metric=‘error’便是准确率。这里面并没有accuracy命名的函数,网上大多例子为auc,我这里特意放了个error。
y_pred = xlf.predict(X_test, ntree_limit=xlf.best_ntree_limit)
auc_score = roc_auc_score(y_test, y_pred)

print(auc_score)
print('y_pred =', y_pred)


1.0
y_pred = [0. 1. 0. ... 1. 0. 1.]

ここで予測される出力はカテゴリです

4つの一般的に使用されるチューニング-GridSearch

徹底的な検索:すべての候補パラメーターの選択で、ループしてすべての可能性を試してください。最もパフォーマンスの高いパラメーターは最終結果です。原理は、配列の最大値を見つけるようなものです。(なぜグリッド検索と呼ばれるのですか?例として2つのパラメーターを持つモデルを取り上げます。パラメーターaには3つの可能性があり、パラメーターbには4つの可能性があります。すべての可能性をリストすると、3 * 4テーブルとして表すことができます。セルはグリッドであり、サイクルプロセスは各グリッドをトラバースして検索するようなものであるため、グリッド検索と呼ばれます)
実際、これは通常のトラバースと同じです。sklearnのGridSearch関数を使用することをお勧めします。これは簡潔で高速です。

import xgboost as xgb
from sklearn.datasets import load_svmlight_file
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import GridSearchCV

# 读取数据并自动做一个分割(把libsvm格式读取成以前我们常用的二维数组形式)
X_train, y_train = load_svmlight_file('agaricus_train.txt')
X_test, y_test = load_svmlight_file('agaricus_test.txt')

print(type(X_train))

# 这里不需要Dmatrix

# 可调参数
parameters = {
    
    
    'max_depth': [5, 10, 15, 20, 25],
    'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],
    'n_estimators': [500, 1000, 2000, 3000, 5000],
    'min_child_weight': [0, 2, 5, 10, 20],
    'max_delta_step': [0, 0.2, 0.6, 1, 2],
    'subsample': [0.6, 0.7, 0.8, 0.85, 0.95],
    'colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9],
    'reg_alpha': [0, 0.25, 0.5, 0.75, 1],
    'reg_lambda': [0.2, 0.4, 0.6, 0.8, 1],
    'scale_pos_weight': [0.2, 0.4, 0.6, 0.8, 1]
}

xlf = xgb.XGBClassifier()
gs_xgb = GridSearchCV(xlf, param_grid=parameters, scoring='accuracy', cv=5)
gs_xgb.fit(X_train, y_train)
print(gs_xgb.best_score_)
print(gs_xgb.best_params_)
print(gs_xgb.best_estimator_)

おすすめ

転載: blog.csdn.net/weixin_46649052/article/details/113029742