使用样本权重训练xgboost(0.7)分类器

4

我正在尝试使用XGBClassifier中的sample_weight来改善我们模型之一的性能,但似乎sample_weight参数并未按预期工作。对于这个问题,sample_weight非常重要。请参见下面的代码。

基本上,模型的拟合似乎没有考虑到sample_weight参数-它从0.5开始并下降,建议使用0或1 n_estimators。底层数据没有问题-我们使用另一个工具使用样本权重构建了一个非常好的模型,获得了良好的基尼系数。

提供的示例数据并没有正确地展示这种行为,但是如果始终保持一致的随机种子,则可以看到是否提供weight/sample_weight,模型对象是相同的。

我已经尝试了xbgoost库中的不同组件,这些组件类似地具有可以定义权重的参数,但没有运气:

XGBClassifier.fit()
XGBClassifier.train()
Xgboost()
XGB.fit()
XGB.train()
Dmatrix()
XGBGridSearchCV()

我也尝试了将fit_params=fit_params作为一个参数,以及weight=weightsample_weight=sample_weight这些变化。
代码:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier

df = pd.DataFrame(columns = 
['GB_FLAG','sample_weight','f1','f2','f3','f4','f5'])
df.loc[0] = [0,1,2046,10,625,8000,2072]
df.loc[1] = [0,0.86836,8000,10,705,8800,28]
df.loc[2] = [1,1,2303.62,19,674,3000,848]
df.loc[3] = [0,0,2754.8,2,570,16300,46]
df.loc[4] = [1,0.103474,11119.81,6,0,9500,3885]
df.loc[5] = [1,0,1050.83,19,715,3000,-5]
df.loc[6] = [1,0.011098,7063.35,11,713,19700,486]
df.loc[7] = [0,0.972176,6447.16,18,681,11300,1104]
df.loc[8] = [1,0.054237,7461.27,18,0,0,4]
df.loc[9] = [0,0.917026,4600.83,8,0,10400,242]
df.loc[10] = [0,0.670026,2041.8,21,716,11000,3]
df.loc[11] = [1,0.112416,2413.77,22,750,4600,271]
df.loc[12] = [0,0,251.81,17,806,3800,0]
df.loc[13] = [1,0.026263,20919.2,17,684,8100,1335]
df.loc[14] = [0,1,1504.58,15,621,6800,461]
df.loc[15] = [0,0.654429,9227.69,4,0,22500,294]
df.loc[16] = [0,0.897051,6960.31,22,674,5400,188]
df.loc[17] = [1,0.209862,4481.42,18,745,11600,0]
df.loc[18] = [0,1,2692.96,22,651,12800,2035]

y = np.asarray(df['GB_FLAG'])
X = np.asarray(df.drop(['GB_FLAG'], axis=1))

X_traintest, X_valid, y_traintest, y_valid = train_test_split(X, y, 
train_size=0.7, stratify=y, random_state=1337)
traintest_sample_weight = X_traintest[:,0]
valid_sample_weight = X_valid[:,0]

X_traintest = X_traintest[:,1:]
X_valid = X_valid[:,1:]

model = XGBClassifier()
eval_set = [(X_valid, y_valid)]
model.fit(X_traintest, y_traintest, eval_set=eval_set, eval_metric="auc", e 
early_stopping_rounds=50, verbose = True, sample_weight = 
traintest_sample_weight)

在使用xgboost进行建模时,如何使用样本权重?

1个回答

4
问题在于对于评估数据集,权重不会通过sklearn API进行传播。
所以你似乎注定要使用本地API。只需用以下代码替换以model定义开头的行即可:
from xgboost import train, DMatrix
trainDmatrix = DMatrix(X_traintest, label=y_traintest, weight=traintest_sample_weight)
validDmatrix = DMatrix(X_valid, label=y_valid, weight=valid_sample_weight)
booster = train({'eval_metric': 'auc'}, trainDmatrix, num_boost_round=100, 
                evals=[(trainDmatrix,'train'), (validDmatrix, 'valid')], early_stopping_rounds=50, 
                verbose_eval=10)
更新: Xgboost社区已经注意到这个问题,并且进行了讨论,甚至提出了一项PR: https://github.com/dmlc/xgboost/issues/1804。然而,由于某种原因,这个问题从未传播到v0.71。 更新2: 在提出这个问题之后,相关的代码更新得到了恢复,并且PR已经在1 June 2018被合并到主版本中,以准备即将发布的xgboost 0.72版本。

@Ernie Halberg,尊敬的先生,您是否找到了在xgboost或lightgbm中如何使样本权重起作用的方法。我按照这篇文章中的指南使用最新的xgboost(0.81),但它仍然会像您观察到的那样从0.5开始下降。即使是本地API似乎也不能按预期工作。 - GivenX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接