keras sequential (). предикат (x_test) возвращает только 1 столбец для двух классов - PullRequest
0 голосов
/ 15 октября 2018

У меня проблема с керасом sequential().predict(x_test).

Кстати, получаю тот же вывод, используя sequential().predict_proba(x_test), поскольку я обнаружил, что эти два безразличны в последовательном порядке.

Мои данные имеютдва класса: 0 или 1, я считаю, predict(x_test) должно давать два столбца, где первый столбец - это вероятность получения 0, а второй - вероятность получения 1. Однако у меня есть только один столбец с этим.

    In [85]:y_train.value_counts()
    Out[85]: 
    0    616751
    1     11140
    Name: _merge, dtype: int64

Не должно быть проблем с моими данными, поскольку я использовал один и тот же x_train, y_train, x_test, y_test как для модели LogisticRegression, так и для модели нейронной сети, она отлично работает в LogisticRegression.

In [87]:y_pred_LR
Out[87]: 
array([[  9.96117151e-01,   3.88284921e-03],
       [  9.99767583e-01,   2.32417329e-04],
       [  9.87375774e-01,   1.26242258e-02],
       ..., 
       [  9.72159138e-01,   2.78408623e-02],
       [  9.97232916e-01,   2.76708432e-03],
       [  9.98146985e-01,   1.85301489e-03]])

, но яполучить только 1 столбец в модели нейронной сети.

Итак, я думаю, что есть какая-то проблема с настройкой модели NN?Вот мои коды

NN = Sequential()
NN.add(Dense(40, input_dim = 65, kernel_initializer = 'uniform', activation = 'relu'))
NN.add(Dense(20, kernel_initializer = 'uniform', activation = 'relu'))
NN.add(Dense(1, kernel_initializer = 'uniform', activation = 'sigmoid'))
NN.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

NN.fit(x_train, y_train, batch_size = 50, epochs=5)
y_pred_NN = NN.predict(x_test)
print(y_pred_NN)

    In [86]: print(y_pred_NN)
    [[ 0.00157279]
     [ 0.0010451 ]
     [ 0.03178826]
     ..., 
     [ 0.01030775]
     [ 0.00584918]
     [ 0.00186538]]

На самом деле похоже, что это вероятность получения 1?Любая помощь приветствуется!

Кстати, мои прогнозы в обеих моделях следующие:

In [91]:y_pred_LR.shape
Out[91]: (300000, 2)

In [90]:y_pred_NN.shape
Out[90]: (300000, 1)

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Последняя строка вашей модели определяет выходной слой.

NN.add(Dense(1, kernel_initializer = 'uniform', activation = 'sigmoid'))

Ваша последняя строка имеет один узел с сигмовидной активацией.Это означает, что ваши выходные данные будут представлять собой одно число (на входную выборку) от 0 до 1, что, как я полагаю, вы можете интерпретировать как P (y = 1) в соответствии с логистической регрессией.

С более чем двумя классамив выходном слое будет n_classes:

NN.add(Dense(n_classes, kernel_initializer = 'uniform', activation = 'softmax'))

Softmax гарантирует, что вероятности суммируются в единицу.Конечно, чтобы сделать это, вам нужно в одно касание кодировать свои значения y обучения.

В вашем случае вы можете выбрать один из подходов.Я предпочитаю второе, так как оно позволяет добавлять больше классов в будущем.

0 голосов
/ 15 октября 2018

Если вы хотите вывести две вероятности, вам придется заменить y_train на to_categorical(y_train), а затем настроить сеть соответствующим образом:

from keras.utils import to_categorical

NN = Sequential()
NN.add(Dense(40, input_dim = 65, kernel_initializer = 'uniform', activation = 'relu'))
NN.add(Dense(20, kernel_initializer = 'uniform', activation = 'relu'))
NN.add(Dense(2, activation='sigmoid'))
NN.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

NN.fit(x_train, to_categorical(y_train), batch_size = 50, epochs=5)

Обратитесь сюда: https://keras.io/utils/#to_categorical

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