python-3.x - 使用 LSTM 训练的模型仅预测所有值相同的值

标签 python-3.x machine-learning keras deep-learning lstm

我有一个包含 4000 行和两列的数据集。第一列包含一些句子,第二列包含一些对应的数字。 大约有 4000 个句子,并按大约 100 个不同的数字进行分类。例如:

Sentences                                         Codes

Google headquarters is in California              87390
Steve Jobs was a great man                        70214
Steve Jobs has done great technology innovations  70214
Google pixel is a very nice phone                 87390
Microsoft is another great giant in technology    67012
Bill Gates founded Microsoft                      67012 

同样,包含这些句子的行共有 4000 行,这些行由 100 个这样的代码进行分类

我已经尝试了下面的代码,但是当我预测时,它为所有人预测一个相同的值。换句话说 y_pred 给出了一个相同值的数组。

请问代码哪里出了问题

import pandas as pd
import numpy as np

xl = pd.ExcelFile("dataSet.xlsx")
df = xl.parse('Sheet1') 

#df = df.sample(frac=1).reset_index(drop=True)# shuffling the dataframe


df = df.sample(frac=1).reset_index(drop=True)# shuffling the dataframe
X = df.iloc[:, 0].values
Y = df.iloc[:, 1].values

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import pickle 

count_vect = CountVectorizer()
X = count_vect.fit_transform(X)

tfidf_transformer = TfidfTransformer()
X = tfidf_transformer.fit_transform(X)

X = X.toarray()

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)
y = Y.reshape(-1, 1)  # Because Y has only one column

onehotencoder = OneHotEncoder(categories='auto')
Y = onehotencoder.fit_transform(y).toarray()


from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

inputDataLength = len(X_test[0])
outputDataLength = len(Y[0])

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
from keras.layers import Dropout

# fitting the model
embedding_vector_length = 100
model = Sequential()
model.add(Embedding(outputDataLength,embedding_vector_length, input_length=inputDataLength))
model.add(Dropout(0.2))
model.add(LSTM(outputDataLength))
model.add(Dense(outputDataLength, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=20)
y_pred = model.predict(X_test)
invorg = model.inverse_transform(y_test)
y_test = labelencoder_Y.inverse_transform(invorg)
inv = onehotencoder.inverse_transform(y_pred)
y_pred = labelencoder_Y.inverse_transform(inv)

最佳答案

即使您有 100 类,您仍在使用 binary_crossentropy。这不是正确的做法。您必须使用categorical_crossentropy来完成此任务。

像这样编译你的模型,

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

此外,您正在使用模型进行预测并转换为这样的类标签,

y_pred = model.predict(X_test)
inv = onehotencoder.inverse_transform(y_pred)
y_pred = labelencoder_Y.inverse_transform(inv)

由于您的模型是使用 softmax 激活的以便获取类标签,因此您必须找到预测的 argmax

例如,如果预测为 [0.2, 0.3, 0.0005, 0.99],您必须采用 argmax,这将为您提供输出 3。概率较高的类别。

所以你必须像这样修改预测代码,

y_pred = model.predict(X_test)
y_pred = np.argmax(y_pred, axis=1)
y_pred = labelencoder_Y.inverse_transform(y_pred)

invorg = np.argmax(y_test, axis=1)
invorg = labelencoder_Y.inverse_transform(invorg)

现在,您将在 invorg 中获得实际的类标签,并在 y_pred 中获得预测的类标签

关于python-3.x - 使用 LSTM 训练的模型仅预测所有值相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55566617/

相关文章:

machine-learning - 同质与异质集成

machine-learning - 如何在keras中将词嵌入和softmax权重结合起来?

python - 实现两个二维数组之间的加权平均值

python-3.x - plotly 有办法将 x 轴上的日期转换为一周中的某一天吗?

python - 将 JSON 导入 pandas 数据框错误

machine-learning - 红眼检测

django - 从 Redis 读取和写入数据时不要序列化和反序列化(Pickle 和 Unpickle)数据

machine-learning - 为什么应用数据增强时验证准确率高于训练准确率?

python - One-Hot 编码的 Keras 自定义损失

python - 使用 Keras 从短信中挑选有用的值