Здесь можно изменить некоторые вещи в архитектуре вашей модели.
Во-первых, потери не должны быть loss='mean_squared_error'
, лучше использовать loss='binary_crossentropy'
, что лучше подходит для задач двоичной классификации.Я не буду объяснять здесь разницу, это то, что можно легко найти в документации Keras.
Вам также необходимо изменить определение вашего последнего слоя.Вам нужен только один последний узел, который будет вероятностью принадлежности к классу 1 (следовательно, наличие узла для вероятности принадлежности к классу 0 является избыточным), и вы должны использовать activation=tf.nn.sigmoid
вместо softmax.
Что-то еще, что вы можете сделать, это определить вес классов, чтобы справиться с дисбалансом ваших данных.Похоже, учитывая то, как вы определяете здесь свою выборку, взвешивание класса 0 будет в 4 раза больше, чем будет иметь смысл класс 1.
После того, как все эти изменения сделаны, вы должны остаться с чем-то, похожим на это:
model = keras.Sequential([
keras.layers.Dense(1),
keras.layers.Dense(5, activation=tf.nn.relu),
keras.layers.Dense(5, activation=tf.nn.relu),
keras.layers.Dense(1, activation=tf.nn.sigmoid)
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(np.array(inputs_training), np.array(targets_training), epochs=5, verbose=1, class_weight = {0:4, 1:1})
Это дает мне 96% точности в наборе валидации, и каждая эпоха уменьшает потери.
(С другой стороны, мне кажется, что дерево решенийздесь будет лучше подходить, поскольку он будет вести себя точно так же, как вы описали для выполнения классификации)