Как рассчитать показатель достоверности прогноза нейронной сети - PullRequest
2 голосов
/ 22 января 2020

Я использую модель глубоких нейронных сетей (реализована в keras) для прогнозирования. Примерно так:

def make_model():
 model = Sequential()       
 model.add(Conv2D(20,(5,5), activation = "relu"))
 model.add(MaxPooling2D(pool_size=(2,2)))    
 model.add(Flatten())
 model.add(Dense(20, activation = "relu"))
 model.add(Lambda(lambda x: tf.expand_dims(x, axis=1)))
 model.add(SimpleRNN(50, activation="relu"))
 model.add(Dense(1, activation="sigmoid"))    
 model.compile(loss = "binary_crossentropy", optimizer = adagrad, metrics = ["accuracy"])

 return model

model = make_model()
model.fit(x_train, y_train, validation_data = (x_validation,y_validation), epochs = 25, batch_size = 25, verbose = 1)

##Prediciton:
prediction = model.predict_classes(x)
probabilities = model.predict_proba(x) #I assume these are the probabilities of class being predictied

Моя проблема - проблема классификации (двоичная). Я буду sh рассчитывать показатель достоверности каждого из этих prediction, т.е. я буду sh знать - моя модель на 99% уверена, что это "0" или 58%, это "0".

Я нашел несколько мнений о том, как это сделать, но не могу их реализовать. Подход, которому я буду следовать sh, гласит: «С помощью классификаторов, когда вы выводите данные, вы можете интерпретировать значения как вероятность принадлежности к каждому указанному классу c. Вы можете использовать их распределение как грубую меру того, насколько вы уверены в этом. наблюдение принадлежит этому классу. "

Как я должен прогнозировать с помощью чего-то подобного модели, чтобы получить уверенность в каждом прогнозе? Буду признателен за некоторые практические примеры (желательно в Керасе).

Ответы [ 4 ]

1 голос
/ 22 января 2020

Softmax - это проблемный c способ оценить достоверность прогноза модели.

Есть несколько недавних статей об этой теме c.

Вы можете искать "калибровку" нейронных сетей, чтобы найти соответствующие документы.

Это один пример, который вы можете начать с - https://arxiv.org/pdf/1706.04599.pdf

0 голосов
/ 22 января 2020

Несмотря на то, что предыдущие ответы представляют различные подходы к работе с концепцией вероятности, самый верный / самый близкий ответ к получению доверительной оценки для прогноза состоял бы в использовании байесовских сетей.

Для базовых c концепций о Bayesian Networks, вы можете начать здесь: https://towardsdatascience.com/introduction-to-bayesian-networks-81031eeed94e

Для быстрого запуска в TensorFlow, обратитесь по следующей ссылке: https://towardsdatascience.com/bayesian-neural-networks-in-10-mins-in-tfp-c735ec99384f

0 голосов
/ 22 января 2020

В Керасе есть метод, называемый predict(), который доступен как для последовательной, так и для функциональной моделей. В вашем случае он будет работать нормально, если вы используете binary_crossentropy в качестве функции потерь и конечный плотный слой с функцией активации сигмоида.

Вот как это вызывать с одним экземпляром тестовых данных. Ниже mymodel.predict() вернет массив из двух вероятностей, суммирующий до 1,0. Эти значения являются оценками доверия, которые вы упомянули. Вы также можете использовать np.where(), как показано ниже, чтобы определить, какая из двух вероятностей (более 50%) будет последним классом.

yhat_probabilities = mymodel.predict(mytestdata, batch_size=1)
yhat_classes = np.where(yhat_probabilities > 0.5, 1, 0).squeeze().item()

Я понял, что вероятности, которые выводятся с помощью регрессии logisti c, можно интерпретировать как достоверность.

Вот несколько ссылок, которые помогут вам прийти к своим собственным заключение.

https://machinelearningmastery.com/how-to-score-probability-predictions-in-python/

как оценить достоверность прогноза с помощью scikit-learn

https://stats.stackexchange.com/questions/34823/can-logistic-regressions-predicted-probability-be-interpreted-as-the-confidence

https://kiwidamien.github.io/are-you-sure-thats-a-probability.html

Не стесняйтесь высказать мой ответ, если вы найдете его полезным.

0 голосов
/ 22 января 2020

Как насчет использования softmax в качестве активации в последнем слое? Давайте скажем что-то вроде этого:

model.add(Dense(2, activation='softmax'))    
model.compile(loss='categorical_crossentropy', optimizer = adagrad, metrics = ["accuracy"])

Таким образом, для каждой точки данных вы получите вероятностный c -i sh результат по модели, который говорит о вероятности того, что Ваша точка данных принадлежит каждому из двух классов.

Например, для данного X, если модель возвращает (0.3,0.7), вы будете знать, что более вероятно, что X принадлежит к классу 1, чем к классу 0. и вы знаете, что вероятность была оценена как быть 0,7 над 0,3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...