sklearn和keras的數(shù)據(jù)切分與交叉驗證的實例詳解
在訓(xùn)練深度學(xué)習(xí)模型的時候,通常將數(shù)據(jù)集切分為訓(xùn)練集和驗證集.Keras提供了兩種評估模型性能的方法:
使用自動切分的驗證集
使用手動切分的驗證集
一.自動切分
在Keras中,可以從數(shù)據(jù)集中切分出一部分作為驗證集,并且在每次迭代(epoch)時在驗證集中評估模型的性能.
具體地,調(diào)用model.fit()訓(xùn)練模型時,可通過validation_split參數(shù)來指定從數(shù)據(jù)集中切分出驗證集的比例.
# MLP with automatic validation set from keras.models import Sequential from keras.layers import Dense import numpy # fix random seed for reproducibility numpy.random.seed(7) # load pima indians dataset dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",") # split into input (X) and output (Y) variables X = dataset[:,0:8] Y = dataset[:,8] # create model model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) # Compile model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # Fit the model model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10)
validation_split:0~1之間的浮點數(shù),用來指定訓(xùn)練集的一定比例數(shù)據(jù)作為驗證集。驗證集將不參與訓(xùn)練,并在每個epoch結(jié)束后測試的模型的指標(biāo),如損失函數(shù)、精確度等。
注意,validation_split的劃分在shuffle之前,因此如果你的數(shù)據(jù)本身是有序的,需要先手工打亂再指定validation_split,否則可能會出現(xiàn)驗證集樣本不均勻。
二.手動切分
Keras允許在訓(xùn)練模型的時候手動指定驗證集.
例如,用sklearn庫中的train_test_split()函數(shù)將數(shù)據(jù)集進行切分,然后在keras的model.fit()的時候通過validation_data參數(shù)指定前面切分出來的驗證集.
# MLP with manual validation set from keras.models import Sequential from keras.layers import Dense from sklearn.model_selection import train_test_split import numpy # fix random seed for reproducibility seed = 7 numpy.random.seed(seed) # load pima indians dataset dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",") # split into input (X) and output (Y) variables X = dataset[:,0:8] Y = dataset[:,8] # split into 67% for train and 33% for test X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed) # create model model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) # Compile model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # Fit the model model.fit(X_train, y_train, validation_data=(X_test,y_test), epochs=150, batch_size=10)
三.K折交叉驗證(k-fold cross validation)
將數(shù)據(jù)集分成k份,每一輪用其中(k-1)份做訓(xùn)練而剩余1份做驗證,以這種方式執(zhí)行k輪,得到k個模型.將k次的性能取平均,作為該算法的整體性能.k一般取值為5或者10.
優(yōu)點:能比較魯棒性地評估模型在未知數(shù)據(jù)上的性能.
缺點:計算復(fù)雜度較大.因此,在數(shù)據(jù)集較大,模型復(fù)雜度較高,或者計算資源不是很充沛的情況下,可能不適用,尤其是在訓(xùn)練深度學(xué)習(xí)模型的時候.
sklearn.model_selection提供了KFold以及RepeatedKFold, LeaveOneOut, LeavePOut, ShuffleSplit, StratifiedKFold, GroupKFold, TimeSeriesSplit等變體.
下面的例子中用的StratifiedKFold采用的是分層抽樣,它保證各類別的樣本在切割后每一份小數(shù)據(jù)集中的比例都與原數(shù)據(jù)集中的比例相同.
# MLP for Pima Indians Dataset with 10-fold cross validation from keras.models import Sequential from keras.layers import Dense from sklearn.model_selection import StratifiedKFold import numpy # fix random seed for reproducibility seed = 7 numpy.random.seed(seed) # load pima indians dataset dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",") # split into input (X) and output (Y) variables X = dataset[:,0:8] Y = dataset[:,8] # define 10-fold cross validation test harness kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed) cvscores = [] for train, test in kfold.split(X, Y): # create model model = Sequential() model.add(Dense(12, input_dim=8, activation='relu')) model.add(Dense(8, activation='relu')) model.add(Dense(1, activation='sigmoid')) # Compile model model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # Fit the model model.fit(X[train], Y[train], epochs=150, batch_size=10, verbose=0) # evaluate the model scores = model.evaluate(X[test], Y[test], verbose=0) print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) cvscores.append(scores[1] * 100) print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores)))
補充知識:訓(xùn)練集,驗證集和測試集
訓(xùn)練集:通過最小化目標(biāo)函數(shù)(損失函數(shù) + 正則項),用來訓(xùn)練模型的參數(shù)。當(dāng)目標(biāo)函數(shù)最小化時,完成對模型的訓(xùn)練。
驗證集:用來選擇模型的階數(shù)。目標(biāo)函數(shù)最小的模型對應(yīng)的階數(shù),為模型的最終選擇的階數(shù)。
注:
1. 驗證集會在訓(xùn)練過程中,反復(fù)使用,機器學(xué)習(xí)中作為選擇不同模型的評判標(biāo)準(zhǔn),深度學(xué)習(xí)中作為選擇網(wǎng)絡(luò)層數(shù)和每層節(jié)點數(shù)的評判標(biāo)準(zhǔn)。
2. 驗證集的使用并非必不可少,如果網(wǎng)絡(luò)的層數(shù)和節(jié)點數(shù)已經(jīng)確定,則不需要這一步操作。
測試集:評估模型的泛化能力。根據(jù)選擇的已經(jīng)訓(xùn)練好的模型,評估它的泛化能力。
注:
測試集評判的是最終訓(xùn)練好的模型的泛化能力,只進行一次評判。
以上這篇sklearn和keras的數(shù)據(jù)切分與交叉驗證的實例詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python Pandas list列表數(shù)據(jù)列拆分成多行的方法實現(xiàn)
這篇文章主要介紹了Python Pandas list(列表)數(shù)據(jù)列拆分成多行的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12python爬蟲headers設(shè)置后無效的解決方法
這篇文章主要為大家詳細(xì)介紹了python爬蟲headers設(shè)置后無效的解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10Pygame坦克大戰(zhàn)游戲開發(fā)實戰(zhàn)詳解代碼
《坦克大戰(zhàn)》以二戰(zhàn)坦克為題材,既保留了射擊類游戲的操作性,也改進了射擊類游戲太過于復(fù)雜難玩的高門檻特點,集休閑與競技于一身。經(jīng)典再度襲來,流暢的畫面,瘋狂的戰(zhàn)斗,讓玩家再次進入瘋狂坦克的世界。玩家的目標(biāo)是控制坦克躲避危險,消滅掉所有的敵人即可進入下一關(guān)2022-02-02在Python中實現(xiàn)函數(shù)重載的示例代碼
這篇文章主要介紹了在Python中實現(xiàn)函數(shù)重載的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12