XGBoost二元逻辑回归

12

我在使用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'].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],

你的两个预测器只有0和1吗?如果是这样,那么你的特征只有4种可能的组合,因此应该只期望(最多)4个唯一的概率预测。 - David
是的,它们是。好的,只有4种可能的组合,这很有道理,但我不确定这如何回答我的问题。 - Italo
我有点困惑,你的问题是什么?我以为你不明白为什么你的概率预测方差很小。 - David
我的问题是:为什么预测值是(0.5, 0.5 - 意味着有50%的概率属于类别1,50%的概率属于类别0),而当X1=1且X2=0时,Y明显为0。 - Italo
1个回答

5

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

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

(以下是树转储)

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

[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个示例和默认设置的情况下根本无法训练。


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