代码之家  ›  专栏  ›  技术社区  ›  Milano

Keras/TensorFlow——acc高,预测差

  •  -1
  • Milano  · 技术社区  · 6 年前

    我是机器学习新手,我正在尝试训练一个能够检测 Prague 一句话中的城市。它可以有多种词形。

    布拉格,普拉哈,兹普拉希等等。。。

    所以我有一个火车数据集,包括 title result 哪里 后果 是二进制的-1或0(大约5000个示例)

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

    我的想法:

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

    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]
    

    这意味着它检测到了这个词 布拉格 在测试csv的这两句话中:

    1. 西尔维斯特诉杜布利诺·普拉希案
    2. 布鲁塞卢z普拉希下午518 K

    第一个句子是来自一个句子的子串 X_train 第二句等于 X_火车 句子。

    我试图增加 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 回复  |  直到 6 年前
        1
  •  0
  •   yugandhar    6 年前

    这可能有两个问题。 1.数据偏斜 2.过度装配

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

      • 精确性和召回率
      • f1成绩
    2. 过度拟合:也被称为泛化问题,理论上,如果训练参数更多(神经网络的权重和偏差),那么它可能会拟合参数,以便在训练中发挥作用,但不能泛化。理论上,VC维度是它的极限,这取决于你的训练示例(m),所以你可以试试

      • 增加培训数据量(通过获取更多)
      • 增加正规化
      • 使用辍学者
      • 你可以看看 into ,以了解神经网络中应该有多少个节点