1. 程式人生 > 其它 >歸納7種交叉驗證方法及python實現(轉載)

歸納7種交叉驗證方法及python實現(轉載)

交叉驗證是一種用於估計機器學習模型效能的統計方法,它是一種評估統計分析結果如何推廣到獨立資料集的方法。

在任何有監督機器學習專案的模型構建階段,我們訓練模型的目的是從標記的示例中學習所有權重和偏差的最佳值。

如果我們使用相同的標記示例來測試我們的模型,那麼這將是一個方法論錯誤,因為一個只會重複剛剛看到的樣本標籤的模型將獲得完美的分數,但無法預測任何有用的東西 - 未來的資料,這種情況稱為過擬合。

為了克服過度擬合的問題,我們使用交叉驗證。所以你必須知道什麼是交叉驗證?以及如何解決過擬合的問題?

什麼是交叉驗證?

交叉驗證是一種用於估計機器學習模型效能的統計方法,它是一種評估統計分析結果如何推廣到獨立資料集的方法。

它是如何解決過擬合問題的?

在交叉驗證中,我們將訓練資料生成多個小的訓練測試分割,使用這些拆分來調整您的模型。例如,在標準的 k 折交叉驗證中,我們將資料劃分為 k 個子集。然後,我們在 k-1 個子集上迭代訓練演算法,同時使用剩餘的子集作為測試集。通過這種方式,我們可以在未參與訓練的資料上測試我們的模型。

下面列出了這些技術方法:

  • HoldOut 交叉驗證

  • K-Fold 交叉驗證

  • 分層 K-Fold交叉驗證

  • Leave P Out 交叉驗證

  • 留一交叉驗證

  • 蒙特卡洛 (Shuffle-Split)

  • 時間序列(滾動交叉驗證)

1、HoldOut 交叉驗證

在這種交叉驗證技術中,整個資料集被隨機劃分為訓練集和驗證集。根據經驗,整個資料集的近 70% 用作訓練集,其餘 30% 用作驗證集。優點

1.快速執行:因為我們必須將資料集拆分為訓練集和驗證集一次,並且模型將在訓練集上僅構建一次,因此可以快速執行。

缺點

  1. 不適合不平衡資料集:假設我們有一個不平衡資料集,它具有“0”類和“1”類。假設 80% 的資料屬於“0”類,其餘 20% 的資料屬於“1”類。在訓練集大小為 80%,測試資料大小為資料集的 20% 的情況下進行訓練-測試分割。可能會發生“0”類的所有 80% 資料都在訓練集中,而“1”類的所有資料都在測試集中。所以我們的模型不能很好地概括我們的測試資料,因為它之前沒有看到過“1”類的資料。

  2. 大量資料無法訓練模型。

在小資料集的情況下,將保留一部分用於測試模型,其中可能具有我們的模型可能會錯過的重要特徵,因為它沒有對該資料進行訓練。

程式碼片段

fromsklearn.datasetsimportload_iris
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.linear_modelimportLogisticRegression
fromsklearn.metricsimportaccuracy_score
iris=load_iris()
X=iris.data
Y=iris.target
print("SizeofDataset{}"
.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("Accuracyscoreontrainingsetis{}".format(accuracy_score(logreg.predict(x_train),y_train)))
print("Accuracyscoreontestsetis{}".format(accuracy_score(predict,y_test)))

2、K 折交叉驗證

在這種 K 折交叉驗證技術中,整個資料集被劃分為 K 個相等大小的部分。每個分割槽稱為一個“摺疊”。因此,因為我們有 K 個部分,所以我們稱之為 K 摺疊。一折用作驗證集,其餘 K-1 折用作訓練集。

該技術重複 K 次,直到每個摺疊用作驗證集,其餘摺疊用作訓練集。

模型的最終精度是通過取 k-models 驗證資料的平均精度來計算的。優點

  1. 整個資料集既用作訓練集又用作驗證集:

缺點

  1. 不用於不平衡的資料集:正如在 HoldOut 交叉驗證的情況下所討論的,在 K-Fold 驗證的情況下也可能發生訓練集的所有樣本都沒有樣本形式類“1”,並且只有 類“0”。驗證集將有一個類“1”的樣本。

  2. 不適合時間序列資料:對於時間序列資料,樣本的順序很重要。但是在 K 折交叉驗證中,樣本是按隨機順序選擇的。

程式碼片段

fromsklearn.datasetsimportload_iris
fromsklearn.model_selectionimportcross_val_score,KFold
fromsklearn.linear_modelimportLogisticRegression
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("CrossValidationScoresare{}".format(score))
print("AverageCrossValidationscore:{}".format(score.mean()))

3、分層 K 折交叉驗證

分層 K-Fold 是 K-Fold 交叉驗證的增強版本,主要用於不平衡的資料集。就像 K-fold 一樣,整個資料集被分成大小相等的 K-fold。

但是在這種技術中,每個摺疊將具有與整個資料集中相同的目標變數例項比率。

優點

  1. 對於不平衡資料非常有效:分層交叉驗證中的每個摺疊都會以與整個資料集中相同的比率表示所有類別的資料。

缺點

  1. 不適合時間序列資料:對於時間序列資料,樣本的順序很重要。但在分層交叉驗證中,樣本是按隨機順序選擇的。

程式碼片段

fromsklearn.datasetsimportload_iris
fromsklearn.model_selectionimportcross_val_score,StratifiedKFold
fromsklearn.linear_modelimportLogisticRegression
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("CrossValidationScoresare{}".format(score))
print("AverageCrossValidationscore:{}".format(score.mean()))

4、Leave P Out 交叉驗證

Leave P Out 交叉驗證是一種詳盡的交叉驗證技術,其中 p 樣本用作驗證集,剩餘的 np 樣本用作訓練集。

假設我們在資料集中有 100 個樣本。如果我們使用 p=10,那麼在每次迭代中,10 個值將用作驗證集,其餘 90 個樣本將用作訓練集。

重複這個過程,直到整個資料集在 p-樣本和 n-p 訓練樣本的驗證集上被劃分。

優點

所有資料樣本都用作訓練和驗證樣本。

缺點

  1. 計算時間長:由於上述技術會不斷重複,直到所有樣本都用作驗證集,因此計算時間會更長。

  2. 不適合不平衡資料集:與 K 折交叉驗證相同,如果在訓練集中我們只有 1 個類的樣本,那麼我們的模型將無法推廣到驗證集。

程式碼片段

fromsklearn.model_selectionimportLeavePOut,cross_val_score
fromsklearn.datasetsimportload_iris
fromsklearn.ensembleimportRandomForestClassifier
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("CrossValidationScoresare{}".format(score))
print("AverageCrossValidationscore:{}".format(score.mean()))

5、留一交叉驗證

留一交叉驗證是一種詳盡的交叉驗證技術,其中 1 個樣本點用作驗證集,其餘 n-1 個樣本用作訓練集。

假設我們在資料集中有 100 個樣本。然後在每次迭代中,1 個值將用作驗證集,其餘 99 個樣本作為訓練集。因此,重複該過程,直到資料集的每個樣本都用作驗證點。

它與使用 p=1 的 LeavePOut 交叉驗證相同。「程式碼片段」

fromsklearn.datasetsimportload_iris
fromsklearn.ensembleimportRandomForestClassifier
fromsklearn.model_selectionimportLeaveOneOut,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("CrossValidationScoresare{}".format(score))
print("AverageCrossValidationscore:{}".format(score.mean()))

6、蒙特卡羅交叉驗證(Shuffle Split)

蒙特卡羅交叉驗證,也稱為Shuffle Split交叉驗證,是一種非常靈活的交叉驗證策略。在這種技術中,資料集被隨機劃分為訓練集和驗證集。

我們已經決定了要用作訓練集的資料集的百分比和用作驗證集的百分比。如果訓練集和驗證集大小的增加百分比總和不是 100,則剩餘的資料集不會用於訓練集或驗證集。

假設我們有 100 個樣本,其中 60% 的樣本用作訓練集,20% 的樣本用作驗證集,那麼剩下的 20%( 100-(60+20)) 將不被使用。

這種拆分將重複我們必須指定的“n”次。

優點

1.我們可以自由使用訓練和驗證集的大小。

2.我們可以選擇重複的次數,而不依賴於重複的摺疊次數。

缺點

  1. 可能不會為訓練集或驗證集選擇很少的樣本。

  2. 不適合不平衡的資料集:在我們定義了訓練集和驗證集的大小後,所有的樣本都是隨機選擇的,所以訓練集可能沒有測試中的資料類別 設定,並且該模型將無法概括為看不見的資料。

程式碼片段

fromsklearn.model_selectionimportShuffleSplit,cross_val_score
fromsklearn.datasetsimportload_iris
fromsklearn.linear_modelimportLogisticRegression
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("crossValidationscores:n{}".format(scores))
print("AverageCrossValidationscore:{}".format(scores.mean()))

7、時間序列交叉驗證

什麼是時間序列資料?

時間序列資料是在不同時間點收集的資料。由於資料點是在相鄰時間段收集的,因此觀測值之間可能存在相關性。這是區分時間序列資料與橫截面資料的特徵之一。

在時間序列資料的情況下如何進行交叉驗證?

在時間序列資料的情況下,我們不能選擇隨機樣本並將它們分配給訓練集或驗證集,因為使用未來資料中的值來預測過去資料的值是沒有意義的。

由於資料的順序對於時間序列相關問題非常重要,所以我們根據時間將資料拆分為訓練集和驗證集,也稱為“前向鏈”方法或滾動交叉驗證。

我們從一小部分資料作為訓練集開始。基於該集合,我們預測稍後的資料點,然後檢查準確性。

然後將預測樣本作為下一個訓練資料集的一部分包括在內,並對後續樣本進行預測。

優點

最好的技術之一。

缺點

不適用於其他資料型別的驗證:與其他技術一樣,我們選擇隨機樣本作為訓練或驗證集,但在該技術中資料的順序非常重要。

程式碼片段

importnumpyasnp
fromsklearn.model_selectionimportTimeSeriesSplit
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)
fortrain_index,test_indexintime_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]

轉載於:https://mp.weixin.qq.com/s/k4O4xrftsAO47pUKt2kErg

預覽時標籤不可點 收錄於話題 # 上一篇 下一篇 閱讀 已同步到看一看 看一看入口已關閉 在“設定”-“通用”-“發現頁管理”開啟“看一看”入口 我知道了

已傳送

【機器學習】深度盤點:詳細介紹 Python 中的 7 種交叉驗證方法!

傳送中

有時會發現學習是一件很快樂的事情 比一直跑步容易多了 不是嘛