第四章 Python数据预处理之划分训练集与测试集
目錄
4.1Python代碼實(shí)現(xiàn)劃分訓(xùn)練集和測(cè)試集
4.2 交叉驗(yàn)證
4.2.1 交叉驗(yàn)證提出的目的? ? ? ?
4.2.2?留一交叉驗(yàn)證?
?4.2.3?K-折交叉驗(yàn)證
?4.2.3.1?重復(fù)隨機(jī)子抽樣驗(yàn)證
4.2.4?嵌套交叉驗(yàn)證
4.2.4.1?k*l 折交叉驗(yàn)證
4.2.4.2?帶有驗(yàn)證和測(cè)試集的 k 折交叉驗(yàn)證
4.2.4.3?擬合度量
4.2.4.4?時(shí)間序列模型的交叉驗(yàn)證? ??
4.2.5?應(yīng)用
4.2.6?Python代碼實(shí)現(xiàn)K-折交叉驗(yàn)證數(shù)據(jù)集劃
?4.1Python代碼實(shí)現(xiàn)劃分訓(xùn)練集和測(cè)試集
??????????偽隨機(jī)函數(shù)介紹網(wǎng)站:https://docs.python.org/3/library/random.html。?
# 導(dǎo)入庫 from random import seed # 用于固定每次生成的隨機(jī)數(shù)都是確定的(偽隨機(jī)數(shù)) from random import randrange # 用于生成隨機(jī)數(shù)def train_test_split(dataset,train=0.6):"""該函數(shù)用于劃分訓(xùn)練集和測(cè)試集Parameters----------dataset : 二維列表傳入需要?jiǎng)澐殖捎?xùn)練集和測(cè)試集的數(shù)據(jù)集.train : 浮點(diǎn)數(shù)傳入訓(xùn)練集占整個(gè)數(shù)據(jù)集的比例.默認(rèn)是0.6.Returns-------train_basket : 二維列表劃分好的訓(xùn)練集.dataset_copy : 二維列表劃分好的測(cè)試集."""# 創(chuàng)建一個(gè)空列表用于存放后面劃分好的訓(xùn)練集train_basket = list()# 根據(jù)輸入的訓(xùn)練集的比例計(jì)算出訓(xùn)練集的大小(樣本數(shù)量)train_size = train*len(dataset)# 復(fù)制出一個(gè)新的數(shù)據(jù)集來做切分,從而不改變?cè)嫉臄?shù)據(jù)集dataset_copy = list(dataset)# 執(zhí)行循環(huán)判斷,如果訓(xùn)練集的大小小于所占的比例,就一直往訓(xùn)練集里添加數(shù)據(jù)while len(train_basket) < train_size:# 通過randrange()函數(shù)隨機(jī)產(chǎn)生訓(xùn)練集的索引random_choose = randrange(len(dataset_copy))# 根據(jù)上面生成的訓(xùn)練集的索引將數(shù)據(jù)集中的樣本加到train_basket中# 注意pop函數(shù)會(huì)根據(jù)索引將數(shù)據(jù)集中的樣本給移除,所以循環(huán)結(jié)束之后剩下的樣本就是測(cè)試集train_basket.append(dataset_copy.pop(random_choose))return train_basket,dataset_copy# 主函數(shù) if '__main__' == __name__:# 定義一個(gè)隨機(jī)種子,使得每次生成的隨機(jī)數(shù)都是確定的(偽隨機(jī)數(shù))seed(666)dataset = [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]]# 調(diào)用手動(dòng)編寫的train_test_split函數(shù)劃分訓(xùn)練集和測(cè)試集train,test = train_test_split(dataset)4.2 交叉驗(yàn)證
????????有關(guān)交叉驗(yàn)證的網(wǎng)站介紹:https://en.wikipedia.org/wiki/Cross-validation_(statistics)#k-fold_cross-validation(注:下面的一些圖片轉(zhuǎn)載自該網(wǎng)站,并非原創(chuàng))。
????????交叉驗(yàn)證,[2]?[3]?[4]有時(shí)稱為旋轉(zhuǎn)估計(jì)[5]?[6]?[7]或樣本外測(cè)試,其是一種重采樣方法,它使用數(shù)據(jù)的不同部分在不同的迭代中測(cè)試和訓(xùn)練模型。在預(yù)測(cè)問題中,通常給模型一個(gè)已知數(shù)據(jù)集(訓(xùn)練數(shù)據(jù)集)和一個(gè)用于測(cè)試模型的未知數(shù)據(jù)集(或首次看到的數(shù)據(jù))(稱為驗(yàn)證數(shù)據(jù)集或測(cè)試)。[8]?[9]交叉驗(yàn)證的目標(biāo)是測(cè)試模型預(yù)測(cè)新數(shù)據(jù)的能力,以標(biāo)記過度擬合或選擇偏差等問題[10]并深入了解模型將如何推廣到獨(dú)立數(shù)據(jù)集(即未知數(shù)據(jù)集,例如來自實(shí)際問題)。一輪交叉驗(yàn)證涉及將數(shù)據(jù)樣本劃分為互補(bǔ)子集,對(duì)一個(gè)子集(稱為訓(xùn)練集)執(zhí)行分析,并在另一個(gè)子集(稱為驗(yàn)證集或測(cè)試集)上驗(yàn)證分析。為了減少可變性,在大多數(shù)方法中,使用不同的分區(qū)執(zhí)行多輪交叉驗(yàn)證,并將驗(yàn)證結(jié)果在各輪中組合(例如求平均準(zhǔn)確率)以估計(jì)模型的預(yù)測(cè)性能。總之,交叉驗(yàn)證在預(yù)測(cè)中結(jié)合平均準(zhǔn)確率,以得出更準(zhǔn)確的模型預(yù)測(cè)性能。[11]
圖1?比較五種分類模型的交叉驗(yàn)證準(zhǔn)確率和假陰性(高估)百分比。氣泡大小代表交叉驗(yàn)證準(zhǔn)確度的標(biāo)準(zhǔn)偏差(十倍)??
4.2.1 交叉驗(yàn)證提出的目的? ? ? ?
????????假設(shè)一個(gè)模型具有一個(gè)或多個(gè)未知參數(shù),以及一個(gè)模型可以擬合的數(shù)據(jù)集(訓(xùn)練數(shù)據(jù)集)。擬合過程優(yōu)化模型參數(shù),使模型盡可能地?cái)M合訓(xùn)練數(shù)據(jù)。如果從與訓(xùn)練數(shù)據(jù)相同的群體中獲取獨(dú)立的驗(yàn)證數(shù)據(jù)樣本,通常會(huì)證明該模型不適合驗(yàn)證數(shù)據(jù)而適合訓(xùn)練數(shù)據(jù)。這種差異的大小可能很大,尤其是當(dāng)訓(xùn)練數(shù)據(jù)集的大小很小,或者模型中的參數(shù)數(shù)量很大時(shí)。交叉驗(yàn)證是一種估計(jì)這種影響大小的方法。在線性回歸中,存在實(shí)際目標(biāo)值?y 1, ...,?y?n,和n?維向量??x?1?, ...,?x?n。向量x?i的分量表示為x?i?1?, ...,?x?ip。如果使用最小二乘法以超平面???=?a?+?β?T?x的形式將函數(shù)擬合到數(shù)據(jù) (?x?i?,?yi?)??1 ≤??i??≤??n,則可以使用均方誤差(MSE) 評(píng)估擬合。訓(xùn)練集 (?x?i?,?y?i?)??1 ≤??i??≤??n上給定估計(jì)參數(shù)值a和β的 MSE定義為:
?圖2?均方誤差公式
????????交叉驗(yàn)證可以用于檢查模型是否已經(jīng)過擬合,在這種情況下,驗(yàn)證集中的 MSE 將大大超過其預(yù)期值。(線性回歸中的交叉驗(yàn)證也很有用,因?yàn)樗梢杂脕磉x擇最優(yōu)的正則化?成本函數(shù))在大多數(shù)其他回歸過程中(例如邏輯回歸),沒有簡單的公式來計(jì)算預(yù)期的樣本外擬合。因此,交叉驗(yàn)證是一種普遍適用的方法,可以使用數(shù)值計(jì)算代替理論分析來預(yù)測(cè)模型在不可用數(shù)據(jù)上的性能。
4.2.2?留一交叉驗(yàn)證?
圖3 當(dāng) n = 8 個(gè)樣本時(shí),留一法交叉驗(yàn)證 (LOOCV) 的說明??偣矊⒂?xùn)練和測(cè)試 8 個(gè)模型
?4.2.3?K-折交叉驗(yàn)證
????????在k折交叉驗(yàn)證中,原始樣本被隨機(jī)劃分為k個(gè)大小相等的子樣本。在k個(gè)子樣本中,保留一個(gè)子樣本作為驗(yàn)證數(shù)據(jù)用于測(cè)試模型,剩余的k?-1 個(gè)子樣本用作訓(xùn)練數(shù)據(jù)。然后交叉驗(yàn)證過程重復(fù)k次,k個(gè)子樣本中的每個(gè)子樣本只使用一次作為驗(yàn)證數(shù)據(jù)。然后可以對(duì)結(jié)果進(jìn)行平均以產(chǎn)生單個(gè)估計(jì)。這種方法相對(duì)于重復(fù)的隨機(jī)子抽樣的優(yōu)勢(shì)在于,所有樣本都用于訓(xùn)練和驗(yàn)證,并且每個(gè)樣本只用于驗(yàn)證一次。通常使用10折交叉驗(yàn)證,[16]但一般來說,k仍然是一個(gè)不固定的參數(shù)。
????????例如,設(shè)置k?=?2則是?2 折交叉驗(yàn)證。在 2 折交叉驗(yàn)證中,我們將數(shù)據(jù)集隨機(jī)打亂為兩個(gè)集合d?0和d?1,使兩個(gè)集合大小相等(這通常通過打亂數(shù)據(jù)數(shù)組然后將其一分為二來實(shí)現(xiàn))。然后我們?cè)赿?0上進(jìn)行訓(xùn)練并在d?1上進(jìn)行驗(yàn)證,然后在d?1上進(jìn)行訓(xùn)練并在d?0上進(jìn)行驗(yàn)證?。當(dāng)k?=?n(樣本次數(shù))時(shí),k折交叉驗(yàn)證等效于留一法交叉驗(yàn)證。[17]
????????在分層?k折交叉驗(yàn)證中,選擇分區(qū)以使平均響應(yīng)值在所有分區(qū)中大致相等。在二分類的情況下,這意味著每個(gè)分區(qū)包含大致相同比例的兩種類別標(biāo)簽。在重復(fù)的交叉驗(yàn)證中,數(shù)據(jù)被隨機(jī)分成k個(gè)分區(qū)多次。因此,模型的性能可以在多次運(yùn)行中取平均值,但這在實(shí)踐中很少需要。[18]
圖4 K-折交叉驗(yàn)證圖
圖5 當(dāng) n = 12 個(gè)觀測(cè)值和 k = 3 時(shí)的 k 折交叉驗(yàn)證圖示。數(shù)據(jù)打亂后,總共將訓(xùn)練和測(cè)試 3 個(gè)模型。
?4.2.3.1?重復(fù)隨機(jī)子抽樣驗(yàn)證
????????這種方法,也稱為蒙特卡羅交叉驗(yàn)證,[21]將數(shù)據(jù)集的多個(gè)隨機(jī)拆分為訓(xùn)練和驗(yàn)證數(shù)據(jù)。[22]對(duì)于每個(gè)這樣的拆分,模型都適合訓(xùn)練數(shù)據(jù),并使用驗(yàn)證數(shù)據(jù)評(píng)估預(yù)測(cè)準(zhǔn)確性。然后在拆分上平均結(jié)果。這種方法的優(yōu)點(diǎn)(超過k折交叉驗(yàn)證)是訓(xùn)練/驗(yàn)證拆分的比例不依賴于迭代次數(shù)(即分區(qū)數(shù))。這種方法的缺點(diǎn)是某些樣本可能永遠(yuǎn)不會(huì)在驗(yàn)證子樣本中被選擇,而其他樣本可能會(huì)被多次選擇。換句話說,驗(yàn)證子集可能重疊。該方法還展示了蒙特卡羅變異,這意味著如果使用不同的隨機(jī)拆分重復(fù)分析,結(jié)果會(huì)有所不同。隨著隨機(jī)分裂的數(shù)量接近無窮大,重復(fù)隨機(jī)子抽樣驗(yàn)證的結(jié)果趨向于留出交叉驗(yàn)證的結(jié)果。在這種方法的分層變體中,隨機(jī)樣本的生成方式使得平均響應(yīng)值(即回歸中的因變量)在訓(xùn)練和測(cè)試集中相等。如果響應(yīng)是二分法且數(shù)據(jù)中兩個(gè)響應(yīng)值的表示不平衡,這將特別有用。一種應(yīng)用重復(fù)隨機(jī)子采樣的方法是RANSAC。[23]
4.2.4?嵌套交叉驗(yàn)證
????????當(dāng)交叉驗(yàn)證同時(shí)用于選擇最佳超參數(shù)集和誤差估計(jì)(和泛化能力評(píng)估)時(shí),需要嵌套交叉驗(yàn)證。存在許多變體。至少可以區(qū)分兩種變體:
4.2.4.1?k*l 折交叉驗(yàn)證
????????這是一個(gè)真正嵌套的變體,包含k個(gè)集合的外循環(huán)和l個(gè)集合的內(nèi)循環(huán)。整個(gè)數(shù)據(jù)集被分成k個(gè)集合。一個(gè)接一個(gè)地選擇一個(gè)集合作為(外)測(cè)試集,將其他k?-1個(gè)集合組合成對(duì)應(yīng)的外訓(xùn)練集。這對(duì)k個(gè)集合中的每一個(gè)重復(fù)。每個(gè)外部訓(xùn)練集進(jìn)一步細(xì)分為l個(gè)集合。一個(gè)接一個(gè)地選擇一個(gè)集合作為內(nèi)部測(cè)試(驗(yàn)證)集,并將其他l?-1 個(gè)集合組合成相應(yīng)的內(nèi)部訓(xùn)練集。這對(duì)每個(gè)l重復(fù)套。內(nèi)部訓(xùn)練集用于擬合模型參數(shù),而外部測(cè)試集用作驗(yàn)證集以提供模型擬合的無偏評(píng)估。通常,這會(huì)針對(duì)許多不同的超參數(shù)(甚至不同的模型類型)重復(fù),并且驗(yàn)證集用于確定該內(nèi)部訓(xùn)練集的最佳超參數(shù)集(和模型類型)。在此之后,使用來自內(nèi)部交叉驗(yàn)證的最佳超參數(shù)集,在整個(gè)外部訓(xùn)練集上擬合一個(gè)新模型。然后使用外部測(cè)試集評(píng)估該模型的性能。
4.2.4.2?帶有驗(yàn)證和測(cè)試集的 k 折交叉驗(yàn)證
????????當(dāng)l?=?k?- 1時(shí),這是一種 k*l 折交叉驗(yàn)證?。單個(gè) k 折交叉驗(yàn)證與驗(yàn)證集和測(cè)試集一起使用。整個(gè)數(shù)據(jù)集被分成k個(gè)集合。一個(gè)一個(gè)地選擇一個(gè)集合作為測(cè)試集。然后,一個(gè)接一個(gè),剩余的一組作為驗(yàn)證集,另一個(gè)k- 2 個(gè)集合用作訓(xùn)練集,直到所有可能的組合都被評(píng)估。與 k*l 折交叉驗(yàn)證類似,訓(xùn)練集用于模型擬合,驗(yàn)證集用于每個(gè)超參數(shù)集的模型評(píng)估。最后,對(duì)于選定的參數(shù)集,使用測(cè)試集來評(píng)估具有最佳參數(shù)集的模型。在這里,可能有兩種變體:要么評(píng)估在訓(xùn)練集上訓(xùn)練的模型,要么評(píng)估適合訓(xùn)練集和驗(yàn)證集組合的新模型。
4.2.4.3?擬合度量
????????交叉驗(yàn)證的目標(biāo)是估計(jì)模型與數(shù)據(jù)集的預(yù)期擬合程度,該數(shù)據(jù)集獨(dú)立于用于訓(xùn)練模型的數(shù)據(jù)。它可用于估計(jì)適合數(shù)據(jù)和模型的任何定量擬合測(cè)量。例如,對(duì)于二分類問題,驗(yàn)證集中的每個(gè)案例要么被正確預(yù)測(cè),要么被錯(cuò)誤預(yù)測(cè)。在這種情況下,可以使用錯(cuò)誤分類錯(cuò)誤率來總結(jié)擬合,盡管也可以使用其他度量,如陽性預(yù)測(cè)值。當(dāng)被預(yù)測(cè)的值連續(xù)分布時(shí),均方誤差、均方根誤差或中值絕對(duì)偏差可以用來總結(jié)錯(cuò)誤。
4.2.4.4?時(shí)間序列模型的交叉驗(yàn)證? ??
????????由于數(shù)據(jù)的順序很重要,交叉驗(yàn)證可能對(duì)時(shí)間序列模型有問題。更合適的方法是使用滾動(dòng)交叉驗(yàn)證。[31]但是,如果性能由單個(gè)匯總統(tǒng)計(jì)量描述,則 Politis 和 Romano 將其描述為固定引導(dǎo)
[32]的方法可能會(huì)起作用。bootstrap 的統(tǒng)計(jì)量需要接受時(shí)間序列的一個(gè)區(qū)間,并返回關(guān)于它的匯總統(tǒng)計(jì)量。對(duì)固定引導(dǎo)程序的調(diào)用需要指定適當(dāng)?shù)钠骄g隔長度。
4.2.5?應(yīng)用
????????交叉驗(yàn)證可用于比較不同預(yù)測(cè)建模程序的性能。例如,假設(shè)我們對(duì)光學(xué)字符識(shí)別感興趣,并且我們正在考慮使用支持向量機(jī)(SVM) 或k最近鄰(KNN) 從手寫字符的圖像中預(yù)測(cè)真實(shí)字符。使用交叉驗(yàn)證,我們可以客觀地比較這兩種方法各自的錯(cuò)誤分類字符分?jǐn)?shù)。如果我們簡單地根據(jù)樣本內(nèi)錯(cuò)誤率比較這些方法,那么一種方法可能會(huì)表現(xiàn)得更好,因?yàn)樗`活,因此更容易過度擬合與其他方法相比。
????????交叉驗(yàn)證也可用于變量選擇。[33]假設(shè)我們使用20 種蛋白質(zhì)的表達(dá)水平來預(yù)測(cè)癌癥患者是否會(huì)對(duì)藥物產(chǎn)生反應(yīng)。一個(gè)實(shí)際的目標(biāo)是確定應(yīng)該使用 20 個(gè)特征中的哪個(gè)子集來生成最佳預(yù)測(cè)模型。對(duì)于大多數(shù)建模過程,如果我們使用樣本內(nèi)錯(cuò)誤率比較特征子集,則當(dāng)使用所有 20 個(gè)特征時(shí),性能最佳。然而,在交叉驗(yàn)證下,具有最佳擬合的模型通常只包含被認(rèn)為是真正有用的特征的一個(gè)子集。
????????醫(yī)學(xué)統(tǒng)計(jì)學(xué)的最新發(fā)展是它在薈萃分析中的應(yīng)用。它構(gòu)成了驗(yàn)證統(tǒng)計(jì)量 Vn 的基礎(chǔ),Vn 用于測(cè)試薈萃分析匯總估計(jì)的統(tǒng)計(jì)有效性。[34]?
?4.2.6?Python代碼實(shí)現(xiàn)K-折交叉驗(yàn)證數(shù)據(jù)集劃分
# 導(dǎo)入庫 from random import seed # 用于固定每次生成的隨機(jī)數(shù)都是確定的(偽隨機(jī)數(shù)) from random import randrange # 用于生成隨機(jī)數(shù)def k_fold_cross_validation_split(dataset,folds=10):"""該函數(shù)用于將數(shù)據(jù)集執(zhí)行K-折交叉驗(yàn)證的劃分Parameters----------dataset : 二維列表傳入需要?jiǎng)澐纸徊骝?yàn)證的數(shù)據(jù)集.folds : 整型, 可選傳入交叉驗(yàn)證的折數(shù). 默認(rèn)是10.Returns-------basket_split_data : 三維列表存放的是劃分好的交叉驗(yàn)證的數(shù)據(jù)集,三維列表里的每一個(gè)二維列表就代表了劃分出的一部分樣本."""# 定義一個(gè)空列表,用于存放劃分好的數(shù)據(jù)集basket_split_data = list()# 計(jì)算每一折里的樣本數(shù)fold_size = int(len(dataset)/folds)# 復(fù)制出一個(gè)新的數(shù)據(jù)集來做劃分,從而不改變?cè)嫉臄?shù)據(jù)集dataset_copy = list(dataset)# 按照需要?jiǎng)澐值恼蹟?shù)來循環(huán)遍歷提取 for i in range(folds):# 定義一個(gè)空列表用于存放每一折里的樣本數(shù)basket_random_fold = list()# 開始遍歷,只要每一折里的樣本數(shù)小于fold_size,就一直往里面添加數(shù)據(jù)while len(basket_random_fold) < fold_size:# 通過randrange()函數(shù)隨機(jī)產(chǎn)生索引random_choose_index = randrange(len(dataset_copy))# 根據(jù)上面生成的隨機(jī)索引將數(shù)據(jù)集中的樣本加到basket_random_fold中basket_random_fold.append(dataset_copy.pop(random_choose_index))# 每一折的樣本數(shù)添加好后,再將其加入到basket_split_data,此變量用于存放后續(xù)劃分好的所有數(shù)據(jù)集basket_split_data.append(basket_random_fold)return basket_split_data# 主函數(shù) if '__main__' == __name__:# 定義一個(gè)隨機(jī)種子,使得每次生成的隨機(jī)數(shù)都是確定的(偽隨機(jī)數(shù))seed(1)dataset = [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]]# 調(diào)用手動(dòng)編寫的k_fold_cross_validation_split函數(shù)來實(shí)現(xiàn)K-折交叉驗(yàn)證數(shù)據(jù)集的劃分k_folds_split = k_fold_cross_validation_split(dataset,3)總結(jié)
以上是生活随笔為你收集整理的第四章 Python数据预处理之划分训练集与测试集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022年上半年软考高项考试真题(三个科
- 下一篇: Kettle下载与安装教程【保姆版】