首页 文章

Keras / TensorFlow - 高acc,糟糕的预测

提问于
浏览
-1

我试图训练一个在一个句子中检测 Prague 城市的模型 . 它可以是许多单词形式 .

布拉格,PRAHA,Z Prahy等......

所以我有一个火车数据集,包括 titleresult ,其中 result 是二进制 - 1或0(约5000个例子)

您可以在代码注释中看到示例 .

我的思想:

  • 加载列车数据集( Headers ,结果)和测试数据集( Headers )

  • 设置X_train,y_train

  • 将 Headers 列从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]

这意味着它在test csv的这两个句子中检测到单词 Prague

  • Silvestr v Dublinu z Prahy

  • Příméletydo BRUSELU z PRAHY od518Kč

第一个句子是来自 X_train 的一个句子的子字符串,第二个句子等于 X_train 个句子中的一个 .

我试图成功增加 epochs 数字ak batch_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 回答

  • 0

    这有两个可能的问题 . 1.数据偏斜2.过度拟合

    • 数据偏斜:您的数据集数据可能会偏斜,例如它只有1%的正数,然后预测0的简单算法将是99%准确 . 在这里,您需要使用以下指标来量化“善”

    • 精确和召回

    • f1-得分

    • 过度拟合:也称为泛化问题,理论上如果训练参数更多(你的神经网络的权重和偏差)那么它可能适合它的参数来做好训练但不能概括它 . 理论上VC-dimesion是它的限制,这取决于你的训练样例(m),所以你可以试试

    • 增加训练数据量(通过获得更多)

    • 添加正则化

    • 使用辍学

    • 你可以看一下into,了解神经网络中应该有多少个节点

相关问题