Контекст: У меня есть набор документов, каждый из которых имеет два связанных значения вероятности: вероятность принадлежать классу A или вероятность принадлежать классу B. Эти классы являются взаимоисключающими, а вероятности составляют до одного. Так, например, документ D имеет вероятности (0,6, 0,4), связанные как основная истина.Сокращение прогнозов регрессии нейронных сетей
Каждый документ представлен tfidf содержащихся в нем терминов, нормированный от 0 до 1. Я также пробовал doc2vec (нормализованная форма от -1 до 1) и несколько других методов.
Я построил очень простую нейронную сеть, чтобы предсказать это распределение вероятности.
- Входной слой с таким количеством узлов, как особенности
- один скрытый слой один с узлом
- Выходной слой SoftMax и два узла
- функция Cross потеря энтропии
- Я также попытался с различными функциями обновления и курсы обучения
Это код, который я написал, используя nolearn:
net = nolearn.lasagne.NeuralNet(
layers=[('input', layers.InputLayer),
('hidden1', layers.DenseLayer),
('output', layers.DenseLayer)],
input_shape=(None, X_train.shape[1]),
hidden1_num_units=1,
output_num_units=2,
output_nonlinearity=lasagne.nonlinearities.softmax,
objective_loss_function=lasagne.objectives.binary_crossentropy,
max_epochs=50,
on_epoch_finished=[es.EarlyStopping(patience=5, gamma=0.0001)],
regression=True,
update=lasagne.updates.adam,
update_learning_rate=0.001,
verbose=2)
net.fit(X_train, y_train)
y_true, y_pred = y_test, net.predict(X_test)
Моя проблема в том, что мои предсказания имеют точку отсечки, и предсказание не идет ниже этой точки (проверьте изображение, чтобы понять, что я имею в виду). This plot shows the difference between the true probability and my predictions. Чем ближе точка к красной линии, тем лучше прогноз. В идеале все точки лежат на линии. Как я могу это решить и почему это происходит?
Edit: на самом деле я решил эту проблему, просто удалив скрытый слой:
net = nolearn.lasagne.NeuralNet(
layers=[('input', layers.InputLayer),
('output', layers.DenseLayer)],
input_shape=(None, X_train.shape[1]),
output_num_units=2,
output_nonlinearity=lasagne.nonlinearities.softmax,
objective_loss_function=lasagne.objectives.binary_crossentropy,
max_epochs=50,
on_epoch_finished=[es.EarlyStopping(patience=5, gamma=0.0001)],
regression=True,
update=lasagne.updates.adam,
update_learning_rate=0.001,
verbose=2)
net.fit(X_train, y_train)
y_true, y_pred = y_test, net.predict(X_test)
Но я до сих пор не понимаю, почему у меня была эта проблема и почему удаление скрытого слоя решил. Есть идеи?
Вот новый сюжет:
Я не понимаю, почему это было бы проблемой. Насколько я знаю, выходы softmax добавляют до 1, а кросс-энтропия измеряет разницу между двумя распределениями вероятностей. –