【发布时间】:2019-12-21 19:09:26
【问题描述】:
我目前正在处理具有罕见二元结果的数据,即响应向量大部分包含 0,只有少数 1(大约 1.5% 的)。我有大约 20 个连续的解释变量。我尝试使用 GBM、随机森林、TensorFlow 和 Keras 后端来训练模型。
无论我使用哪种方法,我都观察到模型的特殊行为:
准确度很高 (~98%),但模型预测所有结果的“0”类概率为 ~98.5%,“1”类的概率约为 1.5%。
如何防止这种行为?
我正在使用 RStudio。例如,带有 Keras 的 TF 模型将是:
model <- keras_model_sequential()
model %>%
layer_dense(units = 256, activation = "relu", input_shape = c(20)) %>%
layer_dense(units = 256, activation = "relu") %>%
layer_dense(units = 2, activation = "sigmoid")
parallel_model <- multi_gpu_model(model, gpus=2)
parallel_model %>% compile(
optimizer = "adam",
loss = "binary_crossentropy",
metrics = "binary_accuracy")
histroy <- parallel_model %>% fit(
x_train, y_train,
batch_size = 64,
epochs = 100,
class_weight = list("0"=1,"1"=70),
verbose = 1,
validation_split = 0.2
)
但我的观察不仅限于 TF。这使我的问题更加笼统。我不是要求对上述模型进行具体调整,而是想讨论在什么时候所有结果都被赋予相同的概率。
我可以猜到,问题与损失函数有关。 我知道没有办法将 AUC 用作损失函数,因为它不可微。如果我用未知数据测试 AUC 模型,结果并不比随机猜测好。
我不介意用 Python 代码回答问题,因为这不是关于编码的问题,而是关于一般行为和算法的问题。
【问题讨论】:
-
我看到你有两个班级,每个班级的值可以是 0 或 1。我不确定班级权重是否正确考虑了事情。问题:样本中的“两个类”是否都正确?或者它是一个严格的分类问题(只有一个类是正确的)。
-
@DanielMöller 结果是 0 或 1。永远不会发生 1,1 或 0,0。我从来没有想过这个。这将如何影响模型?
-
所以,我的回答如下。最重要的是拥有大批量(我会说 >200)并使用适当的指标。
标签: tensorflow machine-learning keras xgboost gbm