keras sequential().predict(x_test) 仅 returns 1 列用于两个 类
keras sequential().predict(x_test) only returns 1 column for two classes
我在使用 keras 时遇到问题 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
我的数据应该没有问题,因为我对 LogisticRegression 模型和神经网络模型使用了相同的 x_train、y_train、x_test、y_test,它在 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)
如果你想输出两个概率,你将不得不用to_categorical(y_train)
替换你的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)
模型的最后一行定义了输出层。
NN.add(Dense(1, kernel_initializer = 'uniform', activation = 'sigmoid'))
你的最后一行有一个节点,有一个 sigmoid 激活函数。这意味着您的输出将是一个介于 0 和 1 之间的数字(每个输入样本),我相信您可以根据逻辑回归将其解释为 P(y=1)。
如果超过两个 类,您将在输出层中有 n_classes
:
NN.add(Dense(n_classes, kernel_initializer = 'uniform', activation = 'softmax'))
softmax 确保概率总和为一。当然,要做到这一点,您将不得不一次性编码您的训练 y 值。
对于您的情况,您可以选择两种方法之一。我赞成第二种,因为它允许您在将来添加更多 类。
我在使用 keras 时遇到问题 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
我的数据应该没有问题,因为我对 LogisticRegression 模型和神经网络模型使用了相同的 x_train、y_train、x_test、y_test,它在 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)
如果你想输出两个概率,你将不得不用to_categorical(y_train)
替换你的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)
模型的最后一行定义了输出层。
NN.add(Dense(1, kernel_initializer = 'uniform', activation = 'sigmoid'))
你的最后一行有一个节点,有一个 sigmoid 激活函数。这意味着您的输出将是一个介于 0 和 1 之间的数字(每个输入样本),我相信您可以根据逻辑回归将其解释为 P(y=1)。
如果超过两个 类,您将在输出层中有 n_classes
:
NN.add(Dense(n_classes, kernel_initializer = 'uniform', activation = 'softmax'))
softmax 确保概率总和为一。当然,要做到这一点,您将不得不一次性编码您的训练 y 值。
对于您的情况,您可以选择两种方法之一。我赞成第二种,因为它允许您在将来添加更多 类。