Ita*_*alo 11 python regression machine-learning logistic-regression 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], )})
Run Code Online (Sandbox Code Playgroud)
我可以发布图像,因为我是新来的,但我们可以清楚地看到,当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))
Run Code Online (Sandbox Code Playgroud)
输出是:
array([[ 0.5, 0.5],
[ 0.5, 0.5]], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
我想,这意味着,对于第一次观察,它有50%的可能性属于每个类.
我想知道为什么算法输出一个正确的(1,0)或更接近于如果变量之间的关系是明确的.
仅供参考,我确实尝试过更多数据(为简单起见,我只使用了4行)并且行为几乎相同; 我注意到的是,不仅概率不总和为1,它们通常都非常小:(这个结果在不同的数据集上,与上面的例子无关)
array([[ 0.00356463, 0.00277259],
[ 0.00315137, 0.00268578],
[ 0.00453343, 0.00157113],
Run Code Online (Sandbox Code Playgroud)
好吧 - 这就是发生的事情..
关于它为什么不起作用的线索是,在较小的数据集中它无法正确训练。我训练了这个精确的模型,并观察所有树木的转储,你会发现它们无法分裂。
(下面的树堆)
没有分裂,它们已经被修剪过!
[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 版本访问,但是R如果您进行 github 安装,则可以从中获取它
http://xgboost.readthedocs.org/en/latest/parameter.html
lambda [default=1] 权重的 L2 正则化项
alpha [default=0] 权重的 L1 正则化项
基本上,这就是为什么当您添加更多数据时,您的示例训练得更好,但仅使用 4 个示例和默认设置根本无法训练。
| 归档时间: |
|
| 查看次数: |
4050 次 |
| 最近记录: |