python - Keras/TensorFlow - 高acc,不好的预测
问题描述
我是机器学习的新手,我正在尝试训练一个Prague
在句子中检测城市的模型。它可以是多种单词形式。
布拉格、PRAHA、Z Prahy 等...
所以我有一个火车数据集,其中包含title
二进制result
- result
1 或 0(大约 5000 个示例)
您可以在代码注释中查看示例。
我的想法:
- 加载训练数据集(标题,结果)和测试数据集(标题)
- 设置 X_train, y_train
- 将标题列从 X_train 转换为数字序列
- 创建模型并设置图层(我不确定我是否做对了)
- 火车
- 测试
火车打印这个:
Epoch 15/20
- 0s - loss: 0.0303 - acc: 0.9924
Epoch 16/20
- 0s - loss: 0.0304 - acc: 0.9922
Epoch 17/20
- 0s - loss: 0.0648 - acc: 0.9779
Epoch 18/20
- 0s - loss: 0.0589 - acc: 0.9816
Epoch 19/20
- 0s - loss: 0.0494 - acc: 0.9844
Epoch 20/20
但是测试返回这个值:
[0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0]
这意味着它Prague
从测试 csv 中检测到这两个句子中的单词:
- 西尔维斯特 v 都柏林 z Prahy
- Přímé lety do BRUSELU z PRAHY od 518 Kč
第一个句子是来自一个句子的子字符串,X_train
第二个句子等于其中一个X_train
句子。
我试图增加epochs
数字 akbatch_size
数字但没有成功......
其他测试句子是随机或通过修改X_test
句子创建的。
def train():
# load train dataset
# "TIP! Ukraine Airlines - Thajsko - levné letenky Bangkok z Prahy (a zpět) 9.790,- kč",1
# Predvianočná MALAGA s odletom z Viedne už za 18€,0
# S 5* Singapore Airlines z Prahy do Singapuru a pak na Maledivy za 15.940 Kč,1
# Athény z Katowic či Blavy,0
# Z Prahy na kanárský ostrov Tenerife vč. zavazadla. Letenky od 1 990 Kč,1
# Hotel v Praze i na víkend za 172Kč! (i jednolůžkové pokoje),1
dataframe = pandas.read_csv("prague_train_set.csv")
dataframe['title'] = dataframe['title'].str.lower()
dataset = dataframe.values
# load test dataset
# v Praze je super # Should be 1, predicts 0
# Silvestr v Dublinu z Prahy # Should be 1, predicts 1
# do Prahy zavita peter # Should be 1, predicts 0
# toto nie # Should be 0, predicts 0
# xxx # Should be 0, predicts 0
# Praha **** # Should be 1, predicts 0
# z Prahy Přímo # Should be 1, predicts 0
# Tip na dárek: Řím z Prahy za 778Kč (letfdenky tam i zpět) # Should be 1, predicts 0
# lety do BRUSELU z PRAHY od 518 K # Should be 1, predicts 0
# Přímé lety do BRUSELU z PRAHY od 518 Kč # Should be 1, predicts 1
# Gelachovský stit # Should be 0, predicts 0
tdataframe = pandas.read_csv("prague_test_set.csv")
tdataframe['title'] = tdataframe['title'].str.lower()
tdataset = tdataframe.values
# Preprocess dataset
X_train = dataset[:,0]
X_test = tdataset[:,0]
y_train = dataset[:,1]
tokenizer = Tokenizer(char_level=True)
tokenizer.fit_on_texts(X_train)
X_train = tokenizer.texts_to_sequences(X_train)
SEQ_MAX_LEN = 200
X_train = sequence.pad_sequences(X_train, maxlen=SEQ_MAX_LEN)
X_test = tokenizer.texts_to_sequences(X_test)
X_test = sequence.pad_sequences(X_test, maxlen=SEQ_MAX_LEN)
# create model
model = Sequential()
# model.add(Embedding(tokenizer.word_index.__len__(), 32, input_length=100))
model.add(Dense(SEQ_MAX_LEN, input_dim=SEQ_MAX_LEN, init='uniform', activation='relu'))
model.add(Dense(10, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X_train, y_train, epochs=20, batch_size=32, verbose=2)
# model.save("trainmodel.h5")
# model = load_model("trainmodel.h5")
# calculate predictions
predictions = model.predict(X_test)
# round predictions
rounded = [round(x[0]) for x in predictions]
print(rounded)
你知道我应该怎么做才能让它正常工作吗?
解决方案
这有两个可能的问题。1. 数据偏度 2. 过拟合
数据偏斜:您的数据集数据可能存在偏斜,例如它只有 1% 的正数,那么预测 0 的简单算法将有 99% 的准确率。在这里你需要使用以下指标来量化“好”
- 准确率和召回率
- f1-分数
过度拟合:也称为泛化问题,理论上如果训练参数更多(你的神经网络的权重和偏差),那么它可能适合它的参数以在训练中做得很好但不能泛化它。理论上VC-dimesion是它的极限,这取决于你的训练例子(m),所以你可以试试
- 增加训练数据大小(通过获得更多)
- 添加正则化
- 使用辍学
- 您可以查看,了解神经网络中应该有多少节点
推荐阅读
- arrays - 在 PowerShell 中以优雅的方式简化一列中包含重复条目的表,聚合另一列中的值
- http-status-code-400 - 运行 admin-ajax.php 返回 400
- java - Android:getHolder().setFixedSize(1920,1080) 导致屏幕分辨率问题
- javascript - 打字稿从字典和键列表构造一个子字典
- gitlab - Gitlab-runner 运行 python2 而不是 python 3
- javascript - Express-validator 测试项的数组独立
- c# - 获取复选框名称 ASP.NET Core
- powershell - 使用 Powershell 删除 SFTP 上的文件
- ios - 当我将渐变图像插入我的收藏视图单元格时,标签文本会迅速变暗
- java - 如何将数组列表从最小到最大?