網(wǎng)站首頁 編程語言 正文
在任何有監(jiān)督機(jī)器學(xué)習(xí)項(xiàng)目的模型構(gòu)建階段,我們訓(xùn)練模型的目的是從標(biāo)記的示例中學(xué)習(xí)所有權(quán)重和偏差的最佳值。
如果我們使用相同的標(biāo)記示例來測試我們的模型,那么這將是一個方法論錯誤,因?yàn)橐粋€只會重復(fù)剛剛看到的樣本標(biāo)簽的模型將獲得完美的分?jǐn)?shù),但無法預(yù)測任何有用的東西 - 未來的數(shù)據(jù),這種情況稱為過擬合。
為了克服過度擬合的問題,我們使用交叉驗(yàn)證。 所以你必須知道什么是交叉驗(yàn)證? 以及如何解決過擬合的問題?
一、什么是交叉驗(yàn)證?
交叉驗(yàn)證是一種用于估計(jì)機(jī)器學(xué)習(xí)模型性能的統(tǒng)計(jì)方法,它是一種評估統(tǒng)計(jì)分析結(jié)果如何推廣到獨(dú)立數(shù)據(jù)集的方法。
二、它是如何解決過擬合問題的?
在交叉驗(yàn)證中,我們將訓(xùn)練數(shù)據(jù)生成多個小的訓(xùn)練測試分割,使用這些拆分來調(diào)整您的模型。 例如,在標(biāo)準(zhǔn)的 k 折交叉驗(yàn)證中,我們將數(shù)據(jù)劃分為 k 個子集。 然后,我們在 k-1 個子集上迭代訓(xùn)練算法,同時使用剩余的子集作為測試集。 通過這種方式,我們可以在未參與訓(xùn)練的數(shù)據(jù)上測試我們的模型。
在本文中,我將分享 7 種最常用的交叉驗(yàn)證技術(shù)及其優(yōu)缺點(diǎn),我還提供了每種技術(shù)的代碼片段。
下面列出了這些技術(shù)方法:
- HoldOut 交叉驗(yàn)證
- K-Fold 交叉驗(yàn)證
- 分層 K-Fold交叉驗(yàn)證
- Leave P Out 交叉驗(yàn)證
- 留一交叉驗(yàn)證
- 蒙特卡洛 (Shuffle-Split)
- 時間序列(滾動交叉驗(yàn)證)
1、HoldOut 交叉驗(yàn)證
在這種交叉驗(yàn)證技術(shù)中,整個數(shù)據(jù)集被隨機(jī)劃分為訓(xùn)練集和驗(yàn)證集。 根據(jù)經(jīng)驗(yàn),整個數(shù)據(jù)集的近 70% 用作訓(xùn)練集,其余 30% 用作驗(yàn)證集。
優(yōu)點(diǎn):
1.快速執(zhí)行:因?yàn)槲覀儽仨殞?shù)據(jù)集拆分為訓(xùn)練集和驗(yàn)證集一次,并且模型將在訓(xùn)練集上僅構(gòu)建一次,因此可以快速執(zhí)行。
缺點(diǎn):
- 不適合不平衡數(shù)據(jù)集:假設(shè)我們有一個不平衡數(shù)據(jù)集,它具有“0”類和“1”類。 假設(shè) 80% 的數(shù)據(jù)屬于“0”類,其余 20% 的數(shù)據(jù)屬于“1”類。在訓(xùn)練集大小為 80%,測試數(shù)據(jù)大小為數(shù)據(jù)集的 20% 的情況下進(jìn)行訓(xùn)練-測試分割。 可能會發(fā)生“0”類的所有 80% 數(shù)據(jù)都在訓(xùn)練集中,而“1”類的所有數(shù)據(jù)都在測試集中。 所以我們的模型不能很好地概括我們的測試數(shù)據(jù),因?yàn)樗皼]有看到過“1”類的數(shù)據(jù)。
- 大量數(shù)據(jù)無法訓(xùn)練模型。
在小數(shù)據(jù)集的情況下,將保留一部分用于測試模型,其中可能具有我們的模型可能會錯過的重要特征,因?yàn)樗鼪]有對該數(shù)據(jù)進(jìn)行訓(xùn)練。
代碼片段
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score iris=load_iris() X=iris.data Y=iris.target print("Size of Dataset {}".format(len(X))) logreg=LogisticRegression() x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.3,random_state=42) logreg.fit(x_train,y_train) predict=logreg.predict(x_test) print("Accuracy score on training set is {}".format(accuracy_score(logreg.predict(x_train),y_train))) print("Accuracy score on test set is {}".format(accuracy_score(predict,y_test)))
2、K 折交叉驗(yàn)證
在這種 K 折交叉驗(yàn)證技術(shù)中,整個數(shù)據(jù)集被劃分為 K 個相等大小的部分。 每個分區(qū)稱為一個“折疊”。因此,因?yàn)槲覀冇?K 個部分,所以我們稱之為 K 折疊。 一折用作驗(yàn)證集,其余 K-1 折用作訓(xùn)練集。
該技術(shù)重復(fù) K 次,直到每個折疊用作驗(yàn)證集,其余折疊用作訓(xùn)練集。
模型的最終精度是通過取k-models
驗(yàn)證數(shù)據(jù)的平均精度來計(jì)算的。
優(yōu)點(diǎn):
- 整個數(shù)據(jù)集既用作訓(xùn)練集又用作驗(yàn)證集:
缺點(diǎn):
- 不用于不平衡的數(shù)據(jù)集:正如在 HoldOut 交叉驗(yàn)證的情況下所討論的,在 K-Fold 驗(yàn)證的情況下也可能發(fā)生訓(xùn)練集的所有樣本都沒有樣本形式類“1”,并且只有 類“0”。驗(yàn)證集將有一個類“1”的樣本。
- 不適合時間序列數(shù)據(jù):對于時間序列數(shù)據(jù),樣本的順序很重要。 但是在 K 折交叉驗(yàn)證中,樣本是按隨機(jī)順序選擇的。
代碼片段:
from sklearn.datasets import load_iris from sklearn.model_selection import cross_val_score,KFold from sklearn.linear_model import LogisticRegression iris=load_iris() X=iris.data Y=iris.target logreg=LogisticRegression() kf=KFold(n_splits=5) score=cross_val_score(logreg,X,Y,cv=kf) print("Cross Validation Scores are {}".format(score)) print("Average Cross Validation score :{}".format(score.mean()))
3、分層 K 折交叉驗(yàn)證
分層 K-Fold 是 K-Fold 交叉驗(yàn)證的增強(qiáng)版本,主要用于不平衡的數(shù)據(jù)集。 就像 K-fold 一樣,整個數(shù)據(jù)集被分成大小相等的 K-fold。
但是在這種技術(shù)中,每個折疊將具有與整個數(shù)據(jù)集中相同的目標(biāo)變量實(shí)例比率。
優(yōu)點(diǎn):
- 對于不平衡數(shù)據(jù)非常有效:分層交叉驗(yàn)證中的每個折疊都會以與整個數(shù)據(jù)集中相同的比率表示所有類別的數(shù)據(jù)。
缺點(diǎn):
- 不適合時間序列數(shù)據(jù):對于時間序列數(shù)據(jù),樣本的順序很重要。 但在分層交叉驗(yàn)證中,樣本是按隨機(jī)順序選擇的。
代碼片段:
from sklearn.datasets import load_iris from sklearn.model_selection import cross_val_score,StratifiedKFold from sklearn.linear_model import LogisticRegression iris=load_iris() X=iris.data Y=iris.target logreg=LogisticRegression() stratifiedkf=StratifiedKFold(n_splits=5) score=cross_val_score(logreg,X,Y,cv=stratifiedkf) print("Cross Validation Scores are {}".format(score)) print("Average Cross Validation score :{}".format(score.mean()))
4、Leave P Out 交叉驗(yàn)證
Leave P Out
交叉驗(yàn)證是一種詳盡的交叉驗(yàn)證技術(shù),其中 p 樣本用作驗(yàn)證集,剩余的 np 樣本用作訓(xùn)練集。
假設(shè)我們在數(shù)據(jù)集中有 100 個樣本。 如果我們使用 p=10,那么在每次迭代中,10 個值將用作驗(yàn)證集,其余 90 個樣本將用作訓(xùn)練集。
重復(fù)這個過程,直到整個數(shù)據(jù)集在 p-樣本和 n-p 訓(xùn)練樣本的驗(yàn)證集上被劃分。
優(yōu)點(diǎn):
- 所有數(shù)據(jù)樣本都用作訓(xùn)練和驗(yàn)證樣本。
缺點(diǎn):
- 計(jì)算時間長:由于上述技術(shù)會不斷重復(fù),直到所有樣本都用作驗(yàn)證集,因此計(jì)算時間會更長。
- 不適合不平衡數(shù)據(jù)集:與 K 折交叉驗(yàn)證相同,如果在訓(xùn)練集中我們只有 1 個類的樣本,那么我們的模型將無法推廣到驗(yàn)證集。
代碼片段
from sklearn.model_selection import LeavePOut,cross_val_score from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier iris=load_iris() X=iris.data Y=iris.target lpo=LeavePOut(p=2) lpo.get_n_splits(X) tree=RandomForestClassifier(n_estimators=10,max_depth=5,n_jobs=-1) score=cross_val_score(tree,X,Y,cv=lpo) print("Cross Validation Scores are {}".format(score)) print("Average Cross Validation score :{}".format(score.mean()))
5、留一交叉驗(yàn)證
留一交叉驗(yàn)證是一種詳盡的交叉驗(yàn)證技術(shù),其中 1 個樣本點(diǎn)用作驗(yàn)證集,其余 n-1 個樣本用作訓(xùn)練集。
假設(shè)我們在數(shù)據(jù)集中有 100 個樣本。 然后在每次迭代中,1 個值將用作驗(yàn)證集,其余 99 個樣本作為訓(xùn)練集。 因此,重復(fù)該過程,直到數(shù)據(jù)集的每個樣本都用作驗(yàn)證點(diǎn)。
它與使用 p=1 的 LeavePOut 交叉驗(yàn)證相同。
代碼片段:
from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import LeaveOneOut,cross_val_score iris=load_iris() X=iris.data Y=iris.target loo=LeaveOneOut() tree=RandomForestClassifier(n_estimators=10,max_depth=5,n_jobs=-1) score=cross_val_score(tree,X,Y,cv=loo) print("Cross Validation Scores are {}".format(score)) print("Average Cross Validation score :{}".format(score.mean()))
6、蒙特卡羅交叉驗(yàn)證(Shuffle Split)
蒙特卡羅交叉驗(yàn)證,也稱為Shuffle Split交叉驗(yàn)證,是一種非常靈活的交叉驗(yàn)證策略。 在這種技術(shù)中,數(shù)據(jù)集被隨機(jī)劃分為訓(xùn)練集和驗(yàn)證集。
我們已經(jīng)決定了要用作訓(xùn)練集的數(shù)據(jù)集的百分比和用作驗(yàn)證集的百分比。 如果訓(xùn)練集和驗(yàn)證集大小的增加百分比總和不是 100,則剩余的數(shù)據(jù)集不會用于訓(xùn)練集或驗(yàn)證集。
假設(shè)我們有 100 個樣本,其中 60% 的樣本用作訓(xùn)練集,20% 的樣本用作驗(yàn)證集,那么剩下的 20%( 100-(60+20)) 將不被使用。
這種拆分將重復(fù)我們必須指定的“n”次。
優(yōu)點(diǎn):
- 1.我們可以自由使用訓(xùn)練和驗(yàn)證集的大小。
- 2.我們可以選擇重復(fù)的次數(shù),而不依賴于重復(fù)的折疊次數(shù)。
缺點(diǎn):
- 可能不會為訓(xùn)練集或驗(yàn)證集選擇很少的樣本。
- 不適合不平衡的數(shù)據(jù)集:在我們定義了訓(xùn)練集和驗(yàn)證集的大小后,所有的樣本都是隨機(jī)選擇的,所以訓(xùn)練集可能沒有測試中的數(shù)據(jù)類別 設(shè)置,并且該模型將無法概括為看不見的數(shù)據(jù)。
代碼片段:
from sklearn.model_selection import ShuffleSplit,cross_val_score from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression logreg=LogisticRegression() shuffle_split=ShuffleSplit(test_size=0.3,train_size=0.5,n_splits=10) scores=cross_val_score(logreg,iris.data,iris.target,cv=shuffle_split) print("cross Validation scores:n {}".format(scores)) print("Average Cross Validation score :{}".format(scores.mean()))
7、時間序列交叉驗(yàn)證
什么是時間序列數(shù)據(jù)?
時間序列數(shù)據(jù)是在不同時間點(diǎn)收集的數(shù)據(jù)。由于數(shù)據(jù)點(diǎn)是在相鄰時間段收集的,因此觀測值之間可能存在相關(guān)性。這是區(qū)分時間序列數(shù)據(jù)與橫截面數(shù)據(jù)的特征之一。
在時間序列數(shù)據(jù)的情況下如何進(jìn)行交叉驗(yàn)證?
在時間序列數(shù)據(jù)的情況下,我們不能選擇隨機(jī)樣本并將它們分配給訓(xùn)練集或驗(yàn)證集,因?yàn)槭褂梦磥頂?shù)據(jù)中的值來預(yù)測過去數(shù)據(jù)的值是沒有意義的。
由于數(shù)據(jù)的順序?qū)τ跁r間序列相關(guān)問題非常重要,所以我們根據(jù)時間將數(shù)據(jù)拆分為訓(xùn)練集和驗(yàn)證集,也稱為“前向鏈”方法或滾動交叉驗(yàn)證。
我們從一小部分?jǐn)?shù)據(jù)作為訓(xùn)練集開始。基于該集合,我們預(yù)測稍后的數(shù)據(jù)點(diǎn),然后檢查準(zhǔn)確性。
然后將預(yù)測樣本作為下一個訓(xùn)練數(shù)據(jù)集的一部分包括在內(nèi),并對后續(xù)樣本進(jìn)行預(yù)測。
優(yōu)點(diǎn):
- 最好的技術(shù)之一。
缺點(diǎn):
- 不適用于其他數(shù)據(jù)類型的驗(yàn)證:與其他技術(shù)一樣,我們選擇隨機(jī)樣本作為訓(xùn)練或驗(yàn)證集,但在該技術(shù)中數(shù)據(jù)的順序非常重要。
代碼片段:
import numpy as np from sklearn.model_selection import TimeSeriesSplit X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]]) y = np.array([1, 2, 3, 4, 5, 6]) time_series = TimeSeriesSplit() print(time_series) for train_index, test_index in time_series.split(X): ? ? print("TRAIN:", train_index, "TEST:", test_index) ? ? X_train, X_test = X[train_index], X[test_index] ? ? y_train, y_test = y[train_index], y[test_index]
結(jié)論:
在本文中,我試圖概述各種交叉驗(yàn)證技術(shù)的工作原理以及我們在實(shí)施這些技術(shù)時應(yīng)牢記的事項(xiàng),我真誠地希望在這個數(shù)據(jù)科學(xué)之旅中對你有所幫助。
原文鏈接:https://blog.csdn.net/weixin_38037405/article/details/121457837
相關(guān)推薦
- 2022-10-11 Flutter?語法進(jìn)階抽象類和接口本質(zhì)區(qū)別詳解_Dart
- 2022-11-16 Kotlin條件控制語句匯總講解_Android
- 2022-08-16 Kotlin實(shí)用語法糖空安全類型轉(zhuǎn)換及相等性判斷_Android
- 2022-08-12 Android學(xué)習(xí)之BottomSheetDialog組件的使用_Android
- 2023-02-10 Docker不同網(wǎng)段下的容器互聯(lián)的實(shí)現(xiàn)_docker
- 2022-12-04 python中的list字符串元素排序_python
- 2022-04-17 h5跳轉(zhuǎn)支付寶小程序
- 2024-02-26 Example動態(tài)(多條件)查詢
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支