В настоящее время я работаю с данными с редким бинарным исходом, т.е. вектор отклика содержит в основном 0 и только несколько единиц (примерно 1,5%). У меня есть около 20 непрерывных объясняющих переменных. Я пытался обучать модели с помощью GBM, Random Forests, TensorFlow с бэкендом Keras.
Я наблюдал особое поведение моделей, независимо от того, какой метод я использовал:
Точность высокая (~98%), но модель предсказывает вероятности для класса «0» для всех исходов как ~98,5%, а для класса «1» ~1,5%.
Как я могу предотвратить такое поведение?
Я использую RStudio. Например, модель TF с Keras будет:
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
)
Но мое наблюдение не ограничивается ТФ. Это делает мой вопрос более общим. Я не прошу каких-то конкретных корректировок для приведенной выше модели, скорее я хотел бы обсудить, в какой момент всем исходам присваивается одинаковая вероятность.
Я могу предположить, что проблема связана с функцией потерь. Я знаю, что нет никакого способа использовать AUC в качестве функции потерь, поскольку она не дифференцируема. Если я тестирую модели с AUC с неизвестными данными, результат не лучше случайного угадывания.
Я не возражаю против ответов с кодом на Python, поскольку проблема не в кодировании, а в общем поведении и алгоритмах.