我在使用xgboost运行logistic回归时遇到问题,可以在以下示例中进行总结。

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

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'].values

params  = {'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],

最佳答案

好的-这是正在发生的事情..

关于它为什么不起作用的线索是,在较小的数据集中,它不能正确训练。我训练了这个精确的模型,并观察了所有树木的倾销,您将看到它们无法 split 。

(下面的树转储)

没有 split ,他们已经被修剪!
[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



基本上,这就是为什么您在添加更多数据时可以更好地训练示例,但是仅使用4个示例和默认设置根本无法进行训练。

关于python - xgboost二进制逻辑回归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35136404/

10-12 17:48