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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

5折交叉验证_数据集的划分——交叉验证法

發布時間:2023/12/10 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5折交叉验证_数据集的划分——交叉验证法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文作者:王 歌
文字編輯:戴 雯
技術總編:張 邯

前面我們在舉例時,通常是將所使用的數據集按照75%和25%的比例劃分為訓練集和測試集,這主要是為了我們舉例方便,同時劃分后的數據量也依然符合大樣本的要求。其實在機器學習中還有其他劃分數據集的方法,可以在本身數據總量就比較小時使模型達到很好的效果,我們今天介紹的交叉驗證法就是比較常用的方法,它在我們將要介紹的集成學習的Stacking算法中經常使用到。

1方法介紹

我們往往會得到多個模型,而最終選擇的模型必定是泛化能力強,也就是在未知的新數據上效果最好的模型,因此我們在訓練模型前就要將我們所掌握的數據進行劃分,嚴格來說一般會劃分為訓練集、驗證集和測試集,在訓練集上進行訓練模型,在驗證集上試驗效果、調整參數設置,在測試集上進行最終的測試。為了保證最終的效果,這三個集合不能有交集,常見的比例是8:1:1。當然,通常我們只有訓練集和測試集也是可以的,前面我們使用的樣例數據集只有幾百個,因此也沒有劃分驗證集。我們所使用的train_ test_split屬于留出法,也就是隨機將一部分數據作為訓練集,剩下的作為測試集。但對樣本信息的利用往往不充分,并且需要的樣本量較大。如果我們本身樣本量有限,并且想充分利用數據集中的信息,我們可以采用交叉驗證法。

交叉驗證法是將數據集劃分為k個大小相似的互斥子集,并在劃分時保持數據分布的一致性,每次用k-1個子集的并集作為訓練集,剩余的做測試集,進行k次訓練,最后取k次結果的均值。該方法依賴于k值的選取,通常取10,因此也稱為k折交叉驗證(k-fold-cross-validation),當k=1時稱為留一法(Leave-One-Out)。由于留一法在樣本量大時計算量較大,所以主要用于樣本量比較少的情況。在實際應用中,我們只進行一次交叉驗證可能是不夠的,而要進行多次,稱為p次k折交叉驗證,一般取p=k=10。以上方法在sklearn中都有相應的類來實現,我們下面來看一下。

2程序實現

我們這里依然使用的是鳶尾花的數據,同時使用Logistic回歸訓練模型。在sklearn中,通常使用 cross_val_predict實現k折交叉驗證,它返回的是一個使用交叉驗證以后的輸出值,若要返回準確度評分,可以使用 cross_val_score。兩者參數相同,第一個參數為所使用的分類器,第二個和第三個參數分別是屬性值和標簽值,最后一個參數 cv確定折數。我們這里進行5折的交叉驗證,程序如下:

from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score, cross_val_predict iris_sample = load_iris() x = iris_sample.data y = iris_sample.target lrclf = LogisticRegression() predicted = cross_val_predict(lrclf, x, y, cv=5) #計算預測值 print('5折交叉驗證預測值:', predicted) scores = cross_val_score(lrclf, x, y, cv=5) #計算模型的評分情況 print('評分:', scores) print('準確度:', metrics.accuracy_score(predicted, y)) #計算評分的均值

結果如下:

若使用留一法,則要使用 LeaveOneOut類,沒有參數需要設置。具體程序如下:

from sklearn.model_selection import LeaveOneOut loo = LeaveOneOut() scores = cross_val_score(lrclf, x, y, cv=loo) predicted = cross_val_predict(lrclf, x, y, cv=loo) print('留一法預測值:', predicted) scores = cross_val_score(lrclf, x, y, cv=loo) print('評分:', scores) print('準確度:', metrics.accuracy_score(predicted, y))

結果如下:

假設進行5次5折交叉驗證,我們使用 RepeatedKFold類,有三個參數:

(1) n_split表示要劃分的折數;

(2) n_repeats表示重復幾次;

(3) random_state設置隨機種子。

程序如下:

from sklearn.model_selection import RepeatedKFold kf = RepeatedKFold(n_splits=5, n_repeats=5, random_state=0) #種子設為0 predicted = cross_val_predict(lrclf, x, y, cv=5) print('5次5折交叉驗證預測值:', predicted) scores = cross_val_score(lrclf, x, y, cv=kf) print('評分:', scores) print('準確度:', metrics.accuracy_score(predicted, y))

結果如下:

在sklearn中還提供了許多其它交叉驗證的類,比如使用 ShuffleSplit類可以隨機的把數據打亂,然后分為訓練集和測試集;對于時間序列的數據,可以使用 TimeSeriesSplit;若要實現分層抽樣式的交叉驗證,可以使用 StratifiedKFold;分層隨機劃分可以使用 StratifiedShuffleSplit,等等,大家可以根據自己的需要來選擇合適的交叉驗證方式。

今天的內容就分享到這里啦,感興趣的小伙伴快動手試試吧~

總結

以上是生活随笔為你收集整理的5折交叉验证_数据集的划分——交叉验证法的全部內容,希望文章能夠幫你解決所遇到的問題。

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