我建立了一个模型来预测客户是企业客户还是私人客户。训练模型后,我预测了 1000 个数据集的类别,但我没有将其用于训练。此预测将保存在 csv 文件中。
现在我有两种不同的行为:
- 在程序中分割样本数据
当我创建示例时train, sample = train_test_split(train, test_size=1000, random_state=seed)
然后预测在训练期间获得相同的准确性(与验证相同的值)。
- 提前分割样本数据然后加载
但是,当我在学习之前手动分割数据时,通过获取原始 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 但没有成功)。