Python中sklearn實現(xiàn)交叉驗證示例分析
Python中sklearn實現(xiàn)交叉驗證
一、概述
1.1 交叉驗證的含義與作用
交叉驗證的思想是,將數(shù)據(jù)集分為k等份,其中k-1份作為訓(xùn)練集,單獨留出的一份作為測試集。進(jìn)行模型驗證的目的就是為了確定最合適的模型,對于監(jiān)督學(xué)習(xí)而言,為了使得創(chuàng)建的模型具有很好的泛化能力,通常需要將得到的數(shù)據(jù)預(yù)留出測試數(shù)據(jù)進(jìn)行交叉驗證。因此,交叉驗證的目的主要為了解決建立模型的過擬合問題。交叉驗證的具體過程為,將所有數(shù)據(jù)分為訓(xùn)練集與測試集兩部分,采用訓(xùn)練集對模型進(jìn)行訓(xùn)練。采用測試準(zhǔn)確度指標(biāo),對得到的模型用測試集來衡量模型的預(yù)測能力。
1.2 交叉驗證的分類
1、k折交叉驗證(KFold),將數(shù)據(jù)集劃分為k等份,使用python的sklearn.model_selection庫中的KFold方法實現(xiàn)。
2、p次k折交叉驗證(RepeatedKFold),在實際應(yīng)用中,只進(jìn)行以此k折交叉驗證往往不夠,需要進(jìn)行多次交叉驗證,使用python的sklearn.model_selection庫中RepeatedKFold方法實現(xiàn)。
3、留一法(LeaveOneOut),是對整個數(shù)據(jù)集每次選取一個樣本作為驗證集,其余樣本作為訓(xùn)練集。它是k折交叉驗證的一種特殊情況,即k=n(n為數(shù)據(jù)集的個數(shù))的情況,使用python的sklearn.model_selection庫中的LeaveOneOut方法實現(xiàn)。
4、留p法(LeavePOut),原理與留一法一樣,只不過是對整個數(shù)據(jù)集每次選取p個樣本作為驗證集,其余樣本作為訓(xùn)練集。它使用python的sklearn.model_selection庫中的LeavePOut方法實現(xiàn)。
5、隨機(jī)分配(ShuffleSplit),隨機(jī)把數(shù)據(jù)打亂,然后劃分訓(xùn)練集與測試集,使用python的sklearn.model_selection庫中的ShuffleSplit方法實現(xiàn)。
另外,針對某些特殊情況,通常采用特殊的交叉驗證方法:
1、對于分類數(shù)據(jù),預(yù)測目標(biāo)可能是不均勻分配的,比如抽煙的煙得肺癌的比率彼不抽的人大,這種情況的數(shù)據(jù)劃分通常采用StratifiedKFold、StratifiedShuffleSplit方法。
2、對于分組數(shù)據(jù)來說,它的劃分方法是不一樣的,主要的方法有 GroupKFold,LeaveOneGroupOut,LeavePGroupOut,GroupShuffleSplit。
3、對于時間關(guān)聯(lián)的數(shù)據(jù),方法有TimeSeriesSplit。
二、交叉驗證實例分析
本文python的版本為3.8,各個版本之間函數(shù)名字略有不同,但是原理都是一樣的,集成開發(fā)環(huán)境使用的是Anaconda的Spyder,以下程序都是經(jīng)過編譯后,順利執(zhí)行的,讀者如果有什么疑問,可以留言。
2.1 留一法實例
留一法的python源代碼如下所示:
from sklearn.datasets import load_iris #導(dǎo)入鳶尾花數(shù)據(jù)庫 #下面語句導(dǎo)入留一法LeaveOneOut,交叉驗證評價指標(biāo)cross_val_score評價指標(biāo) from sklearn.model_selection import LeaveOneOut, cross_val_score #下面語句導(dǎo)入邏輯斯特回歸LogisticRegression from sklearn.linear_model import LogisticRegression iris = load_iris() #將鳶尾花數(shù)據(jù)庫中的數(shù)據(jù)放入iris變量中 print('Iris labels:\n{}'.format(iris.target)) #輸出鳶尾花的目標(biāo)分類,共有三種分別表示為0,1,2 logreg = LogisticRegression() #邏輯斯特回歸對象logreg loout = LeaveOneOut() #留一法對象loout #下面的語句計算評價指標(biāo)并輸出到scores對象,采用cress_val_score方法, #方法參數(shù)含義為,采用邏輯斯特回歸方法logreg擬合數(shù)據(jù):iris.data,iris.target, #交叉驗證的方法為留一法loout scores = cross_val_score(logreg,iris.data,iris.target,cv=loout) #下面語句輸出每個樣本的擬合評價結(jié)果 print("leave-one-out cross validation scores:{}".format(scores)) #下面語句輸出整體評價結(jié)果,即所有樣本的評價結(jié)果平均值 print("Mean score of leave-one-out cross validation:{:.2f}".format(scores.mean()))
輸出結(jié)果如下圖所示:
2.2 留p法實例
留p法的python源代碼如下所示:
#導(dǎo)入訓(xùn)練集數(shù)據(jù)劃分方法庫train_test_split、留p法庫LevePOut from sklearn.model_selection import train_test_split, LeavePOut from sklearn import datasets #導(dǎo)入數(shù)據(jù)集 from sklearn import svm #導(dǎo)入支持向量機(jī)svm from sklearn.metrics import accuracy_score #導(dǎo)入評價指標(biāo)庫 import numpy as np #導(dǎo)入數(shù)學(xué)分析庫 iris = datasets.load_iris() #將鳶尾花數(shù)數(shù)據(jù)放入iris變量中 clf_svc = svm.SVC(kernel='linear') #線性核函數(shù)svm模型對象為clf_svc lpo = LeavePOut(p=3) #留p法對象lpo lpo.get_n_splits(iris.data) #對鳶尾花數(shù)據(jù)進(jìn)行劃分 mean_accuracy_score_list = [] for train_index, test_index in lpo.split(iris.data): clf_svc.fit(iris.data[train_index], iris.target[train_index]) prediction = clf_svc.predict(iris.data[test_index]) mean_accuracy_score_list.append(accuracy_score(iris.target[test_index],prediction)) print(np.average(mean_accuracy_score_list))
輸出結(jié)果如下圖所示:
2.3 k折交叉驗證(Standard Cross Validation)實例
在python語言中,該方法需要通過 train_test_split
方法對數(shù)據(jù)集進(jìn)行劃分,然后再不同的數(shù)據(jù)集上進(jìn)行訓(xùn)練、測試評估,進(jìn)而得到評價結(jié)果。k通常取5或者10,如果取10,則表示再原始數(shù)據(jù)集上,進(jìn)行10次劃分,每次劃分都進(jìn)行以此訓(xùn)練、評估,對5次劃分結(jié)果求取平均值作為最終的評價結(jié)果。10折交叉驗證的原理圖如下所示:
這里以python自帶的乳腺癌數(shù)據(jù)為分析對象,采用k折交叉驗證分析擬合模型的準(zhǔn)確性,k折交叉驗證的python源代碼如下所示:
#以下幾行代碼,例行公事,載入需要的庫函數(shù) from sklearn.datasets import load_breast_cancer from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression cancer = load_breast_cancer() logreg = LogisticRegression() #以下指令中的cross_val_score自動對乳腺癌數(shù)據(jù)進(jìn)行k折交叉驗證, #注意:cross_val_score的參數(shù)cv沒有設(shè)置,默認(rèn)是3,可以修改cv為5或10, #則該方法則成為5或10折交叉驗證 scores = cross_val_score(logreg,cancer.data,cancer.target) #打印分析結(jié)果,由于默認(rèn)cv為3,即3折交叉驗證,所以第一個輸出為三個指標(biāo)值 print("Cross validation scores:{}".format(scores)) print("Mean cross validation score:{:2f}".format(scores.mean()))
輸出結(jié)果如下圖所示:
2.4 隨機(jī)分配交叉驗證(Shuffle-split cross-validation)實例
使用ShuffleSplit方法,可以隨機(jī)的把數(shù)據(jù)打亂,然后分為訓(xùn)練集和測試集。隨機(jī)分配交叉驗證的python源代碼如下所示:
from sklearn.datasets import load_iris from sklearn.model_selection import ShuffleSplit,cross_val_score from sklearn.linear_model import LogisticRegression iris = load_iris() shufspl = ShuffleSplit(train_size=.5,test_size=.4,n_splits=8) #迭代8次; logreg = LogisticRegression() scores = cross_val_score(logreg,iris.data,iris.target,cv=shufspl) print("shuffle split cross validation scores:\n{}".format(scores)) print("Mean score of shuffle split cross validation:{:.2f}".format(scores.mean()))
輸出結(jié)果如下圖所示:
2.5 分層交叉驗證(Stratified k-fold cross validation)實例
分層交叉驗證(Stratified k-fold cross validation):首先它屬于交叉驗證類型,分層的意思是說在每一折中都保持著原始數(shù)據(jù)中各個類別的比例關(guān)系,比如說:原始數(shù)據(jù)有3類,比例為1:2:1,采用3折分層交叉驗證,那么劃分的3折中,每一折中的數(shù)據(jù)類別保持著1:2:1的比例,這樣的驗證結(jié)果更加可信。通常情況下,可以設(shè)置cv參數(shù)來控制幾折,但是我們希望對其劃分等加以控制,所以出現(xiàn)了KFold,KFold控制劃分折,可以控制劃分折的數(shù)目,是否打亂順序等,可以賦值給cv,用來控制劃分。分層交叉驗證的python源代碼如下所示:
from sklearn.datasets import load_iris from sklearn.model_selection import ShuffleSplit,cross_val_score from sklearn.linear_model import LogisticRegression iris = load_iris() shufspl = ShuffleSplit(train_size=.5,test_size=.4,n_splits=8) #迭代8次; logreg = LogisticRegression() scores = cross_val_score(logreg,iris.data,iris.target,cv=shufspl) print("shuffle split cross validation scores:\n{}".format(scores)) print("Mean score of shuffle split cross validation:{:.2f}".format(scores.mean()))
輸出結(jié)果如下圖所示:
到此這篇關(guān)于Python中sklearn實現(xiàn)交叉驗證的文章就介紹到這了,更多相關(guān)Python sklearn交叉驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python函數(shù)值傳遞引用傳遞及形式參數(shù)和實際參數(shù)的區(qū)別
這篇文章主要介紹了Python函數(shù)值傳遞引用傳遞及形式參數(shù)和實際參數(shù)的區(qū)別,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助2022-05-05Python?pass函數(shù)使用及其應(yīng)用的詳解
Python中,pass是一種空語句,即不做任何事情,只起到占位符的作用,本文主要介紹了Python?pass函數(shù)使用及其應(yīng)用的詳解,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Python-Tkinter Text輸入內(nèi)容在界面顯示的實例
今天小編就為大家分享一篇Python-Tkinter Text輸入內(nèi)容在界面顯示的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python基礎(chǔ)練習(xí)之用戶登錄實現(xiàn)代碼分享
這篇文章主要介紹了Python基礎(chǔ)練習(xí)之用戶登錄實現(xiàn)代碼分享,還是比較不錯的,這里分享給大家,供需要的朋友參考。2017-11-11