xgboost 二元逻辑回归

我在使用xgboost进行逻辑回归时遇到了问题,可以用以下示例来概括。

假设我有一个非常简单的包含两个预测变量和一个目标变量的数据框:

df= pd.DataFrame({'X1' : pd.Series([1,0,0,1]), 'X2' : pd.Series([0,1,1,0]), 'Y' : pd.Series([0,1,1,0], )})

由于我是新手,我不能上传图片,但我们可以清楚地看到,当X1=1且X2=0时,Y是0;当X1=0且X2=1时,Y是1。

我的想法是构建一个模型,输出观察值属于每个类别的概率,所以如果我运行xgboost来预测两个新观察值(1,0)和(0,1),如下所示:

X = df[['X1','X2']].values            y = df['Y'].valuesparams  = {'objective': 'binary:logistic',          'num_class': 2          } clf1 = xgb.train(params=params, dtrain=xgb.DMatrix(X, y), num_boost_round=100)                    clf1.predict(xgb.DMatrix(test.values)) 

输出结果是:

array([[ 0.5,  0.5],       [ 0.5,  0.5]], dtype=float32)

我猜测,这意味着对于第一个观察值,属于每个类别的概率各为50%。

我想知道为什么算法不能输出一个更接近(1,0)的结果,如果变量之间的关系是清晰的。

顺便提一下,我确实尝试了更多的数据(为了简便,我只使用了4行),行为几乎相同;我注意到的是,概率不仅不总和为1,它们通常非常小,如下所示:(这个结果是基于不同的数据集,与上面的示例无关)

array([[ 0.00356463,  0.00277259],       [ 0.00315137,  0.00268578],       [ 0.00453343,  0.00157113],

回答:

好的,这是发生的事情…

为什么它不起作用的线索在于在较小的数据集中它无法正确训练。我训练了这个确切的模型,并观察了所有树的转储,你会看到它们无法分裂。

(树的转储如下)

没有分裂,它们已经被修剪了!

[1] "booster[0]" "0:leaf=-0" "booster[1]" "0:leaf=-0" "booster[2]" "0:leaf=-0" [7] "booster[3]" "0:leaf=-0" "booster[4]" "0:leaf=-0" "booster[5]" "0:leaf=-0" [13] "booster[6]" "0:leaf=-0" "booster[7]" "0:leaf=-0" "booster[8]" "0:leaf=-0" [19] "booster[9]" "0:leaf=-0"

每片叶子上的权重不足以克服 xgboost内部正则化(它会因为生长而受到惩罚)

这个参数在Python版本中可能无法访问,但在通过github安装时可以在 R 中获取

http://xgboost.readthedocs.org/en/latest/parameter.html

lambda [默认值=1] 权重的L2正则化项

alpha [默认值=0] 权重的L1正则化项

基本上,这就是为什么你的示例在添加更多数据时训练得更好,但仅用4个示例和默认设置时无法训练的原因。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注