【问题标题】:keras sequential().predict(x_test) only returns 1 column for two classeskeras sequence().predict(x_test) 只为两个类返回 1 列
【发布时间】:2018-10-17 17:52:53
【问题描述】:

我在使用 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)

【问题讨论】:

    标签: python neural-network keras sequential


    【解决方案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

    【讨论】:

    • 如果是这样,y_pred_NN和y_train的形状是什么?
    • y_pred_NN.shape=(300000,1) ; y_train.shape=(627891,)
    • 我在一个类似的问题上测试了我更新的答案,它有效 - 试试吧。
    【解决方案2】:

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

    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 值进行一次热编码。

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

    【讨论】:

    • 所以基本上它只是 prob(y=1) 这里,如果我想知道 p(y=0) 它将是 1 减去我得到的列...谢谢! :)
    猜你喜欢
    • 2015-04-20
    • 2022-11-30
    • 1970-01-01
    • 2020-06-22
    • 2019-09-19
    • 2018-06-02
    • 2020-01-11
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多