Keras/TensorFlow高acc,预测错误

2024-05-20 01:07:26 发布

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

我是机器学习的新手,我试图训练一个能在句子中检测出Prague城市的模型。它可以是多种文字形式。在

Prague, PRAHA, Z Prahy etc...

所以我有一个train数据集,它由title和{}组成,其中result是二进制-1或0(大约5000个例子)

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

我的想法是:

  1. 加载序列数据集(标题、结果)和测试数据集(标题)
  2. 设置X轴,y轴
  3. 将标题列从X列转换为数字序列
  4. 创建模型并设置图层(我不确定是否正确)
  5. 火车
  6. 试验

火车打印这个:

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

但test返回以下值:

^{pr2}$

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

  1. 西尔维斯特诉杜布利努z普拉希
  2. 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)

你知道我该怎么做才能使它正常工作吗?在


Tags: csvtestmodeltitletrainbedodataset
1条回答
网友
1楼 · 发布于 2024-05-20 01:07:26

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

  1. 数据偏斜:你的数据集数据可能是倾斜的,例如它只有1%的正值,那么预测0的简单算法将达到99%的准确率。这里您需要使用以下指标来量化“善”

    • 精确性和召回率
    • f1得分
  2. 过度拟合:也叫泛化问题,理论上,如果训练参数较多(你的权值和神经网络的偏差),那么它可能适合它的参数来训练,但不能泛化它。理论上VC维度是限制,这取决于你的培训例子(m),所以你可以试试

    • 增加培训数据大小(通过获得更多)
    • 添加规则化
    • 使用辍学
    • 您可以查看into,以了解神经网络中应该有多少个节点

相关问题 更多 >