使用 train_test_split 分割数据时的精度与随后加载 csv 文件的精度不同

2024-04-24

我建立了一个模型来预测客户是企业客户还是私人客户。训练模型后,我预测了 1000 个数据集的类别,但我没有将其用于训练。此预测将保存在 csv 文件中。 现在我有两种不同的行为:

  1. 在程序中分割样本数据

当我创建示例时train, sample = train_test_split(train, test_size=1000, random_state=seed)然后预测在训练期间获得相同的准确性(与验证相同的值)。

  1. 提前分割样本数据然后加载

但是,当我在学习之前手动分割数据时,通过获取原始 csv 文件的 1000 个数据集并将其复制到一个新的样本 csv 文件中(我在学习后进行预测之前加载该文件),我得到了更糟糕的结果(例如 76% 而不是90%)。 这种行为在我看来没有意义,因为原始数据(用于训练的 csv 文件)也被提前洗牌,因此我应该得到相同的结果。 下面是上述案例区分的相关代码:

1. 程序中样本数据的拆分

分裂

def getPreProcessedDatasetsWithSamples(filepath, batch_size):
    path = filepath
    data = __getPreprocessedDataFromPath(path) 
    
    train, test = train_test_split(data, test_size=0.2, random_state=42)
    train, val = train_test_split(train, test_size=0.2, random_state=42)
    train, sample = train_test_split(train, test_size=1000, random_state=seed)

    train_ds = __df_to_dataset(train, shuffle=False, batch_size=batch_size)
    val_ds = __df_to_dataset(val, shuffle=False, batch_size=batch_size)
    test_ds = __df_to_dataset(test, shuffle=False, batch_size=batch_size)
    sample_ds = __df_to_dataset(sample, shuffle=False, batch_size=batch_size)

    return (train_ds, val_ds, test_ds, sample, sample_ds)

使用样本进行预测,sample_ds

def savePredictionWithSampleToFileKeras(model, outputName, sample, sample_ds):
    predictions = model.predict(sample_ds)
    loss, accuracy = model.evaluate(sample_ds)


    print("Accuracy of sample", accuracy)


    sample['prediction'] = predictions
    sample.to_csv("./saved_samples/" + outputName + ".csv")

样品准确度:90%

2. 预先分割样本数据然后加载

通过加载csv文件进行预测

def savePredictionToFileKeras(model, sampleFilePath, outputName, batch_size):
    sample_ds = preprocessing.getPreProcessedSampleDataSets(sampleFilePath, batch_size)
    sample = preprocessing.getPreProcessedSampleDataFrames(sampleFilePath)

    predictions = model.predict(sample_ds)
    loss, accuracy = model.evaluate(sample_ds)

    print("Accuracy of sample", accuracy)

    sample['prediction'] = predictions
    sample.to_csv("./saved_samples/" + outputName + ".csv")

样本准确度:77%

EDIT

观察:当我将整个数据加载为样本数据时,我得到的值与预期的验证值相同(约 90%),但当我只是随机化同一文件的行顺序时,我得到的值是 82%。据我了解,准确性应该是相同的,因为文件是相同的。

一些附加信息: 我已将顺序实现更改为函数式 API。我在预处理中使用嵌入(我也尝试过 One-Hot-Encoding 但没有成功)。


最后我发现了问题:我正在使用 Tokenizer 来预处理 NAME 和 STREET 列,将每个单词转换为一个指示该单词出现频率的值。在我使用的情况下train_test_split我使用所有数据的相同总体单词来转换单词,但是当我之后加载示例数据集时,我仅使用示例数据集中出现的单词。例如,“家庭”一词可能是总体上最常用的词,但在样本数据集中仅排在第三位,因此编码将是完全错误的。 对所有数据使用相同的分词器实例后,我对所有数据都获得了相同的高精度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 train_test_split 分割数据时的精度与随后加载 csv 文件的精度不同 的相关文章

随机推荐