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