我使用xgboost(R版本3.4.2的版本0.6-4)来解决二进制分类问题。我发现响应变量主要局限于非常窄的范围。这似乎与我选择用于培训的超参数(var sortedLinks = links.OrderBy(le => Array.IndexOf(linkTypes, le.linkType)).ToList()
,eta
和max_depth
)无关。
为了说明这个问题,我已经明确地创建了嵌套的for循环来存储各种超参数集的响应变量范围:
nround
因此,pred_df <- data_frame(eta = numeric(0),
depth = numeric(0),
round = numeric(0),
min_score = numeric(0),
first_quart = numeric(0),
median = numeric(0),
mean = numeric(0),
third_quart = numeric(0),
max = numeric(0)
)
for (this_eta in c(1.0, 0.7, 0.4, 0.1, 0.01, 0.001))
{
for (this_depth in seq(4, 16, 2))
{
for (this_round in c(5, 10, 25, 75, 150))
{
dtrain <- xgb.DMatrix(data = data.matrix(X_train), label = Y_train)
xgb_model <- xgboost(data = dtrain, eta = this_eta, max_depth = this_depth,
nround = this_round, objective = "binary:logistic",
verbose = 0, save_period = NULL, nthread = 4)
y_pred <- predict(xgb_model, data.matrix(X_test))
summ <- summary(y_pred)
this_entry <- data_frame(eta = this_eta,
depth = this_depth,
round = this_round,
min_score = as.numeric(summ[1]),
first_quart = as.numeric(summ[2]),
median = as.numeric(summ[3]),
mean = as.numeric(summ[4]),
third_quart = as.numeric(summ[5]),
max = as.numeric(summ[6])
)
pred_df <- bind_rows(pred_df, this_entry)
}
}
}
只是用于存储响应变量摘要的数据框。
让我们添加另一个变量来帮助显示问题:
pred_df
第一和第三四分位数彼此非常接近,表明响应变量的范围非常紧凑:
pred_df <- mutate(pred_df, quartile_diff = round(third_quart - first_quart, 3))
但这个狭窄的范围转移了很多:
> summary(pred_df$quartile_diff)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00000 0.01625 0.04600 0.05498 0.09400 0.14600
对于任何特定的超参数集,此范围更接近最小响应而非最大响应。
如果您想知道,> summary(pred_df$median)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0008036 0.0107366 0.0590362 0.1743002 0.4010580 0.4977787
有2856个病例,有33个预测因子。 X_train
有1209个案例。我有点担心对这么少的预测因素不合适,但我不知道是否应对此负责。
任何可能导致此类问题的想法?我需要我的响应变量是概率,因此使用X_test
。
objective = "binary:logistic"