簡體   English   中英

使用 train_test_split 拆分數據時的准確性與之后加載 csv 文件的准確性不同

[英]Different accuracy when splitting data with train_test_split than loading csv file afterwards

我已經建立了一個模型來預測客戶是企業客戶還是私人客戶。 在訓練模型后,我預測了我沒有用於訓練的 1000 個數據集的類別。 此預測將保存在 csv 文件中。 現在我有兩種不同的行為:

  1. 在程序中拆分樣本數據

當我使用train, sample = train_test_split(train, test_size=1000, random_state=seed)創建樣本時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%

編輯

觀察:當我將整個數據作為樣本數據加載時,我得到的值與預期的驗證值相同(大約 90%),但是當我隨機化同一文件的行順序時,我得到的值為 82%。 據我了解,准確度應該是一樣的,因為文件是相等的。

一些附加信息:我已將實現形式從順序更改為功能 API。 我在預處理中使用了嵌入(我也嘗試過 One-Hot-Encoding 但沒有成功)。

最后我發現了問題:我使用 Tokenizer 預處理 NAME 和 STREET 列,我將每個單詞轉換為一個值,該值指示該單詞出現的頻率。 在我使用train_test_split的情況下,我使用所有數據的相同整體詞來轉換詞,但是當我之后加載樣本數據集時,我只使用樣本數據集中出現的詞。 例如,單詞“family”可能是總體上使用最多的單詞,但在樣本數據集中僅排在第三位,因此編碼將完全錯誤。 在對所有數據使用相同的標記器實例后,我對所有數據都獲得了相同的高精度。

以上兩種方法都不能預測正確的准確性。 只有當您的數據是平衡的時,准確度才是好的衡量標准。 對於不平衡的數據,這不是一個好的衡量標准,也不會總是正確的。 每次更改精度都會改變。 您應該首先使用 K 折交叉驗證,以便所有數據點都將用於訓練模型。 如果您的數據集不平衡,您可以嘗試不同的平衡技術,例如對訓練數據進行過采樣或欠采樣,並驗證模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM