修改 Keras 模型中的参数时,精度变化很小

数据挖掘 深度学习 喀拉斯 张量流
2022-02-23 10:20:56

我见过其他类似的问题并遵循他们的解决方案,但几乎没有改善。我正在制作一个模型来识别名字的性别。作为训练数据,我使用的是在这里找到的婴儿名字列表:https ://www.ssa.gov/oact/babynames/limits.html 。我将这些数据提取到一个新的数据框中,只保留这些名称中的一个实例多次出现,并随机排序。

a 中的每个名称字符串都column被转换为长度的数值数组max_len并由函数规范化:

def text_to_numeric(column, max_len):
    word_characters = []
    for word in column:
        word_characters.append([c for c in word])

    letters_kept = 25
    tokenizer = tf.keras.preprocessing.text.Tokenizer(num_words=letters_kept, oov_token='<UNK>')
    tokenizer.fit_on_texts(word_characters)

    word_sequence = tokenizer.texts_to_sequences(word_characters)
    words_pre = tf.keras.preprocessing.sequence.pad_sequences(word_sequence, maxlen=max_len,padding="pre")
    words_pre = tf.keras.utils.normalize(input_data)

    return list(words_pre)

预期的输出是一个包含 2 个元素列表的数组,其中 [1,0] 表示“男性”,[0,1] 表示“女性”。该模型data_file包含已处理的名称和标签,如下所示:

input_length, input_data, output_data = data_reader(data_file)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(100, input_dim=input_length, activation='relu'))
model.add(tf.keras.layers.Dense(100, activation='relu'))
model.add(tf.keras.layers.Dense(2, activation='softmax'))

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

model.fit(input_data, output_data, epochs=30, verbose=1, validation_split=0.1)

无论如何,我的准确率总是在 75% 左右。我不知道如何选择模型参数,但是我尝试了很多组合,并且精度变化很小。到目前为止,我已经尝试过:标准化输入、平衡输入数据集以使男性和女性的数量相同、更改优化器、定义优化器并更改学习率、更改层数、每层节点和激活函数、增加纪元数。

所有这一切都没有显着改变模型的准确性。我错过了什么或做错了什么吗?这种准确度是否达到了它的水平?

1个回答

当你不能再改进模型时,改进数据。

  • 您的数据框中是否有任何中性名称?这些显然会损害您的准确性。现在要么把它们扔掉,要么做多标签二进制分类。

  • 可视化您的数据:标签是否清晰分开?哪些是最大的损失?

  • 刚才看到数据有一个名字的流行度。我认为在训练模型时尝试将这种流行度添加为每个数据点的权重是有意义的。直观地说,您希望您的模型理解名称女性化意味着什么。而“Anna”(score=2604)比“Jewel”(score=5)更能代表这个意思,你不觉得吗?

PS:我刚刚看到女性名字列表中包含“乔”。