天天看點

七種交叉驗證及其代碼

前言

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

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

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

      

七種交叉驗證及其代碼

什麼是交叉驗證?

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

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

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

在本文中,我将分享 7 種最常用的交叉驗證技術及其優缺點,我還提供了每種技術的代碼片段,歡迎收藏學習,喜歡點贊支援。

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

  • HoldOut 交叉驗證
  • K-Fold 交叉驗證
  • 分層 K-Fold交叉驗證
  • Leave P Out 交叉驗證
  • 留一交叉驗證
  • 蒙特卡洛 (Shuffle-Split)
  • 時間序列(滾動交叉驗證)

1、HoldOut 交叉驗證

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

七種交叉驗證及其代碼

優點

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

缺點

  • 不适合不平衡資料集:
    • 假設我們有一個不平衡資料集,它具有“0”類和“1”類。假設 80% 的資料屬于“0”類,其餘 20% 的資料屬于“1”類。在訓練集大小為 80%,測試資料大小為資料集的 20% 的情況下進行訓練-測試分割。可能會發生“0”類的所有 80% 資料都在訓練集中,而“1”類的所有資料都在測試集中。是以我們的模型不能很好地概括我們的測試資料,因為它之前沒有看到過“1”類的資料。
  • 大量資料無法訓練模型。
    • 在小資料集的情況下,将保留一部分用于測試模型,其中可能具有我們的模型可能會錯過的重要特征,因為它沒有對該資料進行訓練。

代碼片段

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 折交叉驗證

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

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

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

       

七種交叉驗證及其代碼
  1. 整個資料集既用作訓練集又用作驗證集:
  1. 不用于不平衡的資料集:正如在 HoldOut 交叉驗證的情況下所讨論的,在 K-Fold 驗證的情況下也可能發生訓練集的所有樣本都沒有樣本形式類“1”,并且隻有 類“0”。驗證集将有一個類“1”的樣本。
  2. 不适合時間序列資料:對于時間序列資料,樣本的順序很重要。但是在 K 折交叉驗證中,樣本是按随機順序選擇的。
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 折交叉驗證

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

  但是在這種技術中,每個折疊将具有與整個資料集中相同的目标變量執行個體比率。

七種交叉驗證及其代碼
  • 對于不平衡資料非常有效:分層交叉驗證中的每個折疊都會以與整個資料集中相同的比率表示所有類别的資料。
  • 不适合時間序列資料:對于時間序列資料,樣本的順序很重要。但在分層交叉驗證中,樣本是按随機順序選擇的。
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  交叉驗證

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

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

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

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

  1. 計算時間長:由于上述技術會不斷重複,直到所有樣本都用作驗證集,是以計算時間會更長。
  2. 不适合不平衡資料集:與 K 折交叉驗證相同,如果在訓練集中我們隻有 1 個類的樣本,那麼我們的模型将無法推廣到驗證集。
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、留一交叉驗證

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

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

  它與使用 p=1 的 LeavePOut 交叉驗證相同。

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、蒙特卡羅交叉驗證(Shuffle Split)

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

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

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

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

七種交叉驗證及其代碼

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

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

  1. 可能不會為訓練集或驗證集選擇很少的樣本。
  2. 不适合不平衡的資料集:在我們定義了訓練集和驗證集的大小後,所有的樣本都是随機選擇的,是以訓練集可能沒有測試中的資料類别 設定,并且該模型将無法概括為看不見的資料。
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、時間序列交叉驗證

  什麼是時間序列資料?

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

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

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

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

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

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

七種交叉驗證及其代碼

  最好的技術之一。

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

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]      
七種交叉驗證及其代碼

結論

  在本文中,我試圖概述各種交叉驗證技術的工作原理以及我們在實施這些技術時應牢記的事項,我真誠地希望在這個資料科學之旅中對你有所幫助。

『總結不易,加個關注呗!』 

七種交叉驗證及其代碼

因上求緣,果上努力~~~~ 作者:Learning^,轉載請注明原文連結:https://www.cnblogs.com/BlairGrowing/p/15668898.html

上一篇: BTree 索引
下一篇: sqlserver視圖