我应该如何为数据集建模以预测y_测试值?

2024-04-23 14:59:48 发布

您现在位置:Python中文网/ 问答频道 /正文

正在对模型进行修改,以将模型的预测调整到所需的方向,但存在困难

数据集说明

训练/验证/测试集

(1)X_列车:(6000,4)外形

(2)y_列车:(6000,4)外形

(3)X_验证:(2000,4)形状

(4)y_验证:(2000,4)形状

(5)X_检验:(2000,4)形状

(6)y_检验:(2000,4)形状

enter image description here

预测结果希望是,例如,(1,0,0,0),(0,1,0,0)

from numpy import array
import numpy as np
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
from keras.callbacks import EarlyStopping, ModelCheckpoint
from keras.callbacks import ModelCheckpoint
import sys
import argparse
import time
import pandas as pd

es = EarlyStopping(monitor='val_loss', mode='min',verbose=1,patience = 10)

X_train, y_train, X_valid, y_valid, X_test, y_test, tr_set_size = loaddata(filename)

**model = Sequential()
model.add(Dense(64,activation='relu', input_shape=(X_train.shape[1],)))
model.add(Dense(64, activation='relu'))
model.add(Dense(46, activation='relu')) # relu 
model.add(Dense(12, activation='relu'))
model.add(Dense(4))**

model.compile(optimizer='rmsprop', loss ='mse', metrics=['accuracy']) #mse

hist = model.fit(X_train, y_train, epochs=100, batch_size=1, verbose= 1, validation_data=(X_valid, y_valid), callbacks= es)

result = model.evaluate(X_test, y_test)
prediction = model.predict(X_test)
print(prediction)

Tags: fromtestimportaddmodeltrainactivationkeras
2条回答

您可以尝试在NN模型的最后一层上使用activation='softmax',这样它将返回所有类的概率之和为1的每个类的概率。因此,最后一层将是:

model.add(Dense(4, activation='softmax'))

然后,您可以通过以下代码将最大值更改为1,将数组的其余部分更改为0来调整该值:

prediction = (prediction == prediction.max(axis=1)[:,None]).astype(int)
print(prediction)

您不必给出完整的预测,只需使用以下方法获得概率最高的指数:

n = 2 # Define how many classes that having highest probability you want to take
pred = np.argsort(-prediction)[:n]

它将给出从最高概率到最低概率排序的具有最高概率的指数的结果

似乎您希望输出是类的一个热向量——在这种情况下,您希望在输出上使用argmax。然而,argmax不是一个可微函数,这就是为什么经常使用softmax的原因。您需要为网络的最后一层使用Softmax激活函数

比如说

    model = Sequential()
model.add(Dense(64,activation='relu', input_shape=(X_train.shape[1],)))
model.add(Dense(64, activation='relu'))
model.add(Dense(46, activation='relu')) # relu 
model.add(Dense(12, activation='relu'))
model.add(Dense(4, activation='softmax'))

假设它是一个分类器,你的损失函数应该反映这一点。考虑到你的标签示例,我建议使用分类交叉熵

model.compile(optimizer='rmsprop', loss ='categorical_crossentropy', metrics=['accuracy'])

然后,您可以使用

prediction = model.predict(X_test)
out = tf.one_hot(np.argmax(prediction, axis=1), depth=4).numpy()

相关问题 更多 >