我的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
的值只有0
和1
,并且csv中有40列以上的数据。
我使用此代码来预测1
与x_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'])
答案 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'
即可完成工作)。