У меня проблема с keras sequential().predict(x_test)
.
Btw получает тот же результат, используя 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)
Если вы хотите вывести две вероятности, вам придется заменить 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
Последняя строка вашей модели определяет выходной уровень.
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'))
Мягкий макс гарантирует, что вероятности суммируются до единицы. Конечно, чтобы сделать это, вам придется разогревать кодировку ваших значений обучения.
В вашем случае вы можете выбрать любой из них. Я предпочитаю второй, так как он позволяет вам добавлять новые классы в будущем.