首页 文章

keras sequential() . predict(x_test)只返回两列的1列

提问于
浏览
1

我遇到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)

2 回答

  • 1

    模型的最后一行定义输出层 .

    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确保概率总和为1 . 当然要做到这一点,你必须对你的训练y值进行一次热编码 .

    在您的情况下,您可以选择任何一种方法 . 我赞成第二个,因为它允许你将来添加更多的类 .

  • 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

相关问题