[英]Different accuracy when splitting data with train_test_split than loading csv file afterwards
我已經建立了一個模型來預測客戶是企業客戶還是私人客戶。 在訓練模型后,我預測了我沒有用於訓練的 1000 個數據集的類別。 此預測將保存在 csv 文件中。 現在我有兩種不同的行為:
當我使用train, sample = train_test_split(train, test_size=1000, random_state=seed)
創建樣本時train, sample = train_test_split(train, test_size=1000, random_state=seed)
然后預測在訓練期間獲得相同的准確性(與驗證相同的值)。
但是,當我在學習之前通過獲取原始 csv 文件的 1000 個數據集並將其復制到我在學習后進行預測之前加載的新樣本 csv 文件中手動拆分數據時,我得到了更糟糕的結果(例如 76% 而不是90%)。 這種行為在我看來沒有意義,因為原始數據(用於訓練的 csv 文件)也被高級混洗,因此我應該得到相同的結果。 這里是提到的案例區分的相關代碼:
分裂
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%
通過加載 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%
編輯
觀察:當我將整個數據作為樣本數據加載時,我得到的值與預期的驗證值相同(大約 90%),但是當我隨機化同一文件的行順序時,我得到的值為 82%。 據我了解,准確度應該是一樣的,因為文件是相等的。
一些附加信息:我已將實現形式從順序更改為功能 API。 我在預處理中使用了嵌入(我也嘗試過 One-Hot-Encoding 但沒有成功)。
最后我發現了問題:我使用 Tokenizer 預處理 NAME 和 STREET 列,我將每個單詞轉換為一個值,該值指示該單詞出現的頻率。 在我使用train_test_split
的情況下,我使用所有數據的相同整體詞來轉換詞,但是當我之后加載樣本數據集時,我只使用樣本數據集中出現的詞。 例如,單詞“family”可能是總體上使用最多的單詞,但在樣本數據集中僅排在第三位,因此編碼將完全錯誤。 在對所有數據使用相同的標記器實例后,我對所有數據都獲得了相同的高精度。
以上兩種方法都不能預測正確的准確性。 只有當您的數據是平衡的時,准確度才是好的衡量標准。 對於不平衡的數據,這不是一個好的衡量標准,也不會總是正確的。 每次更改精度都會改變。 您應該首先使用 K 折交叉驗證,以便所有數據點都將用於訓練模型。 如果您的數據集不平衡,您可以嘗試不同的平衡技術,例如對訓練數據進行過采樣或欠采樣,並驗證模型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.