日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

第四章 Python数据预处理之划分训练集与测试集

發布時間:2023/12/31 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第四章 Python数据预处理之划分训练集与测试集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

4.1Python代碼實現劃分訓練集和測試集

4.2 交叉驗證

4.2.1 交叉驗證提出的目的? ? ? ?

4.2.2?留一交叉驗證?

?4.2.3?K-折交叉驗證

?4.2.3.1?重復隨機子抽樣驗證

4.2.4?嵌套交叉驗證

4.2.4.1?k*l 折交叉驗證

4.2.4.2?帶有驗證和測試集的 k 折交叉驗證

4.2.4.3?擬合度量

4.2.4.4?時間序列模型的交叉驗證? ??

4.2.5?應用

4.2.6?Python代碼實現K-折交叉驗證數據集劃


?4.1Python代碼實現劃分訓練集和測試集

??????????偽隨機函數介紹網站:https://docs.python.org/3/library/random.html。?

# 導入庫 from random import seed # 用于固定每次生成的隨機數都是確定的(偽隨機數) from random import randrange # 用于生成隨機數def train_test_split(dataset,train=0.6):"""該函數用于劃分訓練集和測試集Parameters----------dataset : 二維列表傳入需要劃分成訓練集和測試集的數據集.train : 浮點數傳入訓練集占整個數據集的比例.默認是0.6.Returns-------train_basket : 二維列表劃分好的訓練集.dataset_copy : 二維列表劃分好的測試集."""# 創建一個空列表用于存放后面劃分好的訓練集train_basket = list()# 根據輸入的訓練集的比例計算出訓練集的大小(樣本數量)train_size = train*len(dataset)# 復制出一個新的數據集來做切分,從而不改變原始的數據集dataset_copy = list(dataset)# 執行循環判斷,如果訓練集的大小小于所占的比例,就一直往訓練集里添加數據while len(train_basket) < train_size:# 通過randrange()函數隨機產生訓練集的索引random_choose = randrange(len(dataset_copy))# 根據上面生成的訓練集的索引將數據集中的樣本加到train_basket中# 注意pop函數會根據索引將數據集中的樣本給移除,所以循環結束之后剩下的樣本就是測試集train_basket.append(dataset_copy.pop(random_choose))return train_basket,dataset_copy# 主函數 if '__main__' == __name__:# 定義一個隨機種子,使得每次生成的隨機數都是確定的(偽隨機數)seed(666)dataset = [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]]# 調用手動編寫的train_test_split函數劃分訓練集和測試集train,test = train_test_split(dataset)

4.2 交叉驗證

????????有關交叉驗證的網站介紹:https://en.wikipedia.org/wiki/Cross-validation_(statistics)#k-fold_cross-validation(注:下面的一些圖片轉載自該網站,并非原創)。

????????交叉驗證,[2]?[3]?[4]有時稱為旋轉估計[5]?[6]?[7]或樣本外測試,其是一種重采樣方法,它使用數據的不同部分在不同的迭代中測試和訓練模型。在預測問題中,通常給模型一個已知數據集(訓練數據集)和一個用于測試模型的未知數據集(或首次看到的數據)(稱為驗證數據集或測試)。[8]?[9]交叉驗證的目標是測試模型預測新數據的能力,以標記過度擬合或選擇偏差等問題[10]并深入了解模型將如何推廣到獨立數據集(即未知數據集,例如來自實際問題)。一輪交叉驗證涉及將數據樣本劃分為互補子集,對一個子集(稱為訓練集)執行分析,并在另一個子集(稱為驗證集或測試集)上驗證分析。為了減少可變性,在大多數方法中,使用不同的分區執行多輪交叉驗證,并將驗證結果在各輪中組合(例如求平均準確率)以估計模型的預測性能。總之,交叉驗證在預測中結合平均準確率,以得出更準確的模型預測性能。[11]

圖1?比較五種分類模型的交叉驗證準確率和假陰性(高估)百分比。氣泡大小代表交叉驗證準確度的標準偏差(十倍)??

4.2.1 交叉驗證提出的目的? ? ? ?

????????假設一個模型具有一個或多個未知參數,以及一個模型可以擬合的數據集(訓練數據集)。擬合過程優化模型參數,使模型盡可能地擬合訓練數據。如果從與訓練數據相同的群體中獲取獨立的驗證數據樣本,通常會證明該模型不適合驗證數據而適合訓練數據。這種差異的大小可能很大,尤其是當訓練數據集的大小很小,或者模型中的參數數量很大時。交叉驗證是一種估計這種影響大小的方法。在線性回歸中,存在實際目標值?y 1, ...,?y?n,和n?維向量??x?1?, ...,?x?n。向量x?i的分量表示為x?i?1?, ...,?x?ip。如果使用最小二乘法以超平面???=?a?+?β?T?x的形式將函數擬合到數據 (?x?i?,?yi?)??1 ≤??i??≤??n,則可以使用均方誤差(MSE) 評估擬合。訓練集 (?x?i?,?y?i?)??1 ≤??i??≤??n上給定估計參數值a和β的 MSE定義為:

?圖2?均方誤差公式

????????交叉驗證可以用于檢查模型是否已經過擬合,在這種情況下,驗證集中的 MSE 將大大超過其預期值。(線性回歸中的交叉驗證也很有用,因為它可以用來選擇最優的正則化?成本函數)在大多數其他回歸過程中(例如邏輯回歸),沒有簡單的公式來計算預期的樣本外擬合。因此,交叉驗證是一種普遍適用的方法,可以使用數值計算代替理論分析來預測模型在不可用數據上的性能。

4.2.2?留一交叉驗證?

圖3 當 n = 8 個樣本時,留一法交叉驗證 (LOOCV) 的說明。總共將訓練和測試 8 個模型

?4.2.3?K-折交叉驗證

????????在k折交叉驗證中,原始樣本被隨機劃分為k個大小相等的子樣本。在k個子樣本中,保留一個子樣本作為驗證數據用于測試模型,剩余的k?-1 個子樣本用作訓練數據。然后交叉驗證過程重復k次,k個子樣本中的每個子樣本只使用一次作為驗證數據。然后可以對結果進行平均以產生單個估計。這種方法相對于重復的隨機子抽樣的優勢在于,所有樣本都用于訓練和驗證,并且每個樣本只用于驗證一次。通常使用10折交叉驗證,[16]但一般來說,k仍然是一個不固定的參數。

????????例如,設置k?=?2則是?2 折交叉驗證。在 2 折交叉驗證中,我們將數據集隨機打亂為兩個集合d?0和d?1,使兩個集合大小相等(這通常通過打亂數據數組然后將其一分為二來實現)。然后我們在d?0上進行訓練并在d?1上進行驗證,然后在d?1上進行訓練并在d?0上進行驗證?。當k?=?n(樣本次數)時,k折交叉驗證等效于留一法交叉驗證。[17]

????????在分層?k折交叉驗證中,選擇分區以使平均響應值在所有分區中大致相等。在二分類的情況下,這意味著每個分區包含大致相同比例的兩種類別標簽。在重復的交叉驗證中,數據被隨機分成k個分區多次。因此,模型的性能可以在多次運行中取平均值,但這在實踐中很少需要。[18]

圖4 K-折交叉驗證圖

圖5 當 n = 12 個觀測值和 k = 3 時的 k 折交叉驗證圖示。數據打亂后,總共將訓練和測試 3 個模型。

?4.2.3.1?重復隨機子抽樣驗證

????????這種方法,也稱為蒙特卡羅交叉驗證,[21]將數據集的多個隨機拆分為訓練和驗證數據。[22]對于每個這樣的拆分,模型都適合訓練數據,并使用驗證數據評估預測準確性。然后在拆分上平均結果。這種方法的優點(超過k折交叉驗證)是訓練/驗證拆分的比例不依賴于迭代次數(即分區數)。這種方法的缺點是某些樣本可能永遠不會在驗證子樣本中被選擇,而其他樣本可能會被多次選擇。換句話說,驗證子集可能重疊。該方法還展示了蒙特卡羅變異,這意味著如果使用不同的隨機拆分重復分析,結果會有所不同。隨著隨機分裂的數量接近無窮大,重復隨機子抽樣驗證的結果趨向于留出交叉驗證的結果。在這種方法的分層變體中,隨機樣本的生成方式使得平均響應值(即回歸中的因變量)在訓練和測試集中相等。如果響應是二分法且數據中兩個響應值的表示不平衡,這將特別有用。一種應用重復隨機子采樣的方法是RANSAC。[23]

4.2.4?嵌套交叉驗證

????????當交叉驗證同時用于選擇最佳超參數集和誤差估計(和泛化能力評估)時,需要嵌套交叉驗證。存在許多變體。至少可以區分兩種變體:

4.2.4.1?k*l 折交叉驗證

????????這是一個真正嵌套的變體,包含k個集合的外循環和l個集合的內循環。整個數據集被分成k個集合。一個接一個地選擇一個集合作為(外)測試集,將其他k?-1個集合組合成對應的外訓練集。這對k個集合中的每一個重復。每個外部訓練集進一步細分為l個集合。一個接一個地選擇一個集合作為內部測試(驗證)集,并將其他l?-1 個集合組合成相應的內部訓練集。這對每個l重復套。內部訓練集用于擬合模型參數,而外部測試集用作驗證集以提供模型擬合的無偏評估。通常,這會針對許多不同的超參數(甚至不同的模型類型)重復,并且驗證集用于確定該內部訓練集的最佳超參數集(和模型類型)。在此之后,使用來自內部交叉驗證的最佳超參數集,在整個外部訓練集上擬合一個新模型。然后使用外部測試集評估該模型的性能。

4.2.4.2?帶有驗證和測試集的 k 折交叉驗證

????????當l?=?k?- 1時,這是一種 k*l 折交叉驗證?。單個 k 折交叉驗證與驗證集和測試集一起使用。整個數據集被分成k個集合。一個一個地選擇一個集合作為測試集。然后,一個接一個,剩余的一組作為驗證集,另一個k- 2 個集合用作訓練集,直到所有可能的組合都被評估。與 k*l 折交叉驗證類似,訓練集用于模型擬合,驗證集用于每個超參數集的模型評估。最后,對于選定的參數集,使用測試集來評估具有最佳參數集的模型。在這里,可能有兩種變體:要么評估在訓練集上訓練的模型,要么評估適合訓練集和驗證集組合的新模型。

4.2.4.3?擬合度量

????????交叉驗證的目標是估計模型與數據集的預期擬合程度,該數據集獨立于用于訓練模型的數據。它可用于估計適合數據和模型的任何定量擬合測量。例如,對于二分類問題,驗證集中的每個案例要么被正確預測,要么被錯誤預測。在這種情況下,可以使用錯誤分類錯誤率來總結擬合,盡管也可以使用其他度量,如陽性預測值。當被預測的值連續分布時,均方誤差、均方根誤差或中值絕對偏差可以用來總結錯誤。

4.2.4.4?時間序列模型的交叉驗證? ??

????????由于數據的順序很重要,交叉驗證可能對時間序列模型有問題。更合適的方法是使用滾動交叉驗證。[31]但是,如果性能由單個匯總統計量描述,則 Politis 和 Romano 將其描述為固定引導
[32]的方法可能會起作用。bootstrap 的統計量需要接受時間序列的一個區間,并返回關于它的匯總統計量。對固定引導程序的調用需要指定適當的平均間隔長度。

4.2.5?應用

????????交叉驗證可用于比較不同預測建模程序的性能。例如,假設我們對光學字符識別感興趣,并且我們正在考慮使用支持向量機(SVM) 或k最近鄰(KNN) 從手寫字符的圖像中預測真實字符。使用交叉驗證,我們可以客觀地比較這兩種方法各自的錯誤分類字符分數。如果我們簡單地根據樣本內錯誤率比較這些方法,那么一種方法可能會表現得更好,因為它更靈活,因此更容易過度擬合與其他方法相比。

????????交叉驗證也可用于變量選擇。[33]假設我們使用20 種蛋白質的表達水平來預測癌癥患者是否會對藥物產生反應。一個實際的目標是確定應該使用 20 個特征中的哪個子集來生成最佳預測模型。對于大多數建模過程,如果我們使用樣本內錯誤率比較特征子集,則當使用所有 20 個特征時,性能最佳。然而,在交叉驗證下,具有最佳擬合的模型通常只包含被認為是真正有用的特征的一個子集。

????????醫學統計學的最新發展是它在薈萃分析中的應用。它構成了驗證統計量 Vn 的基礎,Vn 用于測試薈萃分析匯總估計的統計有效性。[34]?

?4.2.6?Python代碼實現K-折交叉驗證數據集劃分

# 導入庫 from random import seed # 用于固定每次生成的隨機數都是確定的(偽隨機數) from random import randrange # 用于生成隨機數def k_fold_cross_validation_split(dataset,folds=10):"""該函數用于將數據集執行K-折交叉驗證的劃分Parameters----------dataset : 二維列表傳入需要劃分交叉驗證的數據集.folds : 整型, 可選傳入交叉驗證的折數. 默認是10.Returns-------basket_split_data : 三維列表存放的是劃分好的交叉驗證的數據集,三維列表里的每一個二維列表就代表了劃分出的一部分樣本."""# 定義一個空列表,用于存放劃分好的數據集basket_split_data = list()# 計算每一折里的樣本數fold_size = int(len(dataset)/folds)# 復制出一個新的數據集來做劃分,從而不改變原始的數據集dataset_copy = list(dataset)# 按照需要劃分的折數來循環遍歷提取 for i in range(folds):# 定義一個空列表用于存放每一折里的樣本數basket_random_fold = list()# 開始遍歷,只要每一折里的樣本數小于fold_size,就一直往里面添加數據while len(basket_random_fold) < fold_size:# 通過randrange()函數隨機產生索引random_choose_index = randrange(len(dataset_copy))# 根據上面生成的隨機索引將數據集中的樣本加到basket_random_fold中basket_random_fold.append(dataset_copy.pop(random_choose_index))# 每一折的樣本數添加好后,再將其加入到basket_split_data,此變量用于存放后續劃分好的所有數據集basket_split_data.append(basket_random_fold)return basket_split_data# 主函數 if '__main__' == __name__:# 定義一個隨機種子,使得每次生成的隨機數都是確定的(偽隨機數)seed(1)dataset = [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]]# 調用手動編寫的k_fold_cross_validation_split函數來實現K-折交叉驗證數據集的劃分k_folds_split = k_fold_cross_validation_split(dataset,3)

總結

以上是生活随笔為你收集整理的第四章 Python数据预处理之划分训练集与测试集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。