为什么使用keras预报_proba来预测具有相同值的概率?

时间:2020-10-29 04:09:03

标签: python machine-learning keras

我的csv中的数据如下:

[
[0, 0,……, 0],
[0, 1,……, 0],
[0, 2,……, 0],
[0, 3,……, 0],
[1, 0,……, 0],
[2, 0,……, 0],
[3, 0,……, 0],
[1, 1,……, 1],
[2, 1,……, 1],
[1, 2,……, 1],
[3, 1,……, 1],
]

训练集有40万行数据,测试集有20万行数据。

y_train的值只有01,并且csv中有40列以上的数据。

我使用此代码来预测1x_test的概率,但是结果中的所有概率都具有相同的值,为什么?

import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from sklearn.preprocessing import LabelEncoder
from keras.utils import np_utils

train = pd.read_csv(r'train.csv')
test = pd.read_csv(r'test.csv')

x_train = train[:, :-1]
y_train = train[:, -1]

encoder = LabelEncoder()
encoder.fit(y_train)
encoded_y = encoder.transform(y_train)
y_train = np_utils.to_categorical(encoded_y)
x_test = test

model = Sequential()
model.add(Dense(512, activation='relu', input_dim=48))
model.add(Dense(256, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(2, activation='softmax'))
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['binary_accuracy'])

model.fit(x_train, y_train, epochs=15, batch_size=50000, verbose=1)
predict = model.predict_proba(x_test, batch_size=50000)
print(predict[:,1]) #same value

输出:

[[0.8432461],
[0.8432461],
[0.8432461],
[0.8432461],
[0.8432461],
[0.8432461],
……
[0.8432461]]

我不知道这些代码行的参数是否合适。从我的数据来看,只有两个类别0和1。我需要预测标签为1的类别的概率。

model = Sequential()
model.add(Dense(512, activation='relu', input_dim=48))
model.add(Dense(256, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(2, activation='softmax'))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['binary_accuracy'])

1 个答案:

答案 0 :(得分:1)

当标签y是个数字,而不是像此处那样进行一元编码时,应该使用二进制交叉熵损失。来自docs

对于每个示例,每个预测应该有一个浮点值。

因此,您应该删除一键编码:

y_train = np_utils.to_categorical(encoded_y) # remove this line

将最后一层更改为

model.add(Dense(1, activation='sigmoid')

并直接使用encoded_y作为适合的标签:

model.fit(x_train, encoded_y, epochs=15, batch_size=50000, verbose=1)

在此设置下,您将获得的唯一数字是1级的概率(我刚刚在此看到了您的previous question)。

或者,您可以保持设置(标签和模型)不变,但更改为loss='categorical_crossentropy'(只需metrics='accuracy'即可完成工作)。