學習**函式的引數,並在相同資料集上進行測試是一種錯誤的做法: 乙個僅給出測試用例標籤的模型將會獲得極高的分數,但對於尚未出現過的資料它則無法**出任何有用的資訊。 這種情況稱為overfitting(過擬合). 為了避免這種情況,在進行(監督)機器學習實驗時,通常取出部分可利用資料作為test set(測試資料集)我們不能使用測試集(x_test)來進行引數和模型調優。容易「過擬合」。總之,「測試集」(x_test)只能在最後一次模型評價中使用!那麼,就有了下面的「交叉驗證」!x_test, y_test
。利用 scikit-learn 包中的
train_test_split
輔助函式可以很快地將實驗資料集劃分為任何訓練集(training sets)和測試集(test sets)。當評價估計器的不同設定(」hyperparameters(超引數)」)時,例如手動為 svm 設定的
c
引數, 由於在訓練集上,通過調整引數設定使估計器的效能達到了最佳狀態;但 在測試集上 可能會出現過擬合的情況。
一般,如果給定的樣本資料充足,我們會隨機的從「訓練集」(x_train)中提取一部分資料來調優,這個資料集叫做「驗證集」(x_validation)。
但是,如果資料不充足,我們往往採用「交叉驗證」的方法——把給定的資料進行切分(例如分成5段),將切分的資料集分為「訓練集」和「驗證集」(假設其中4份為train,1份為validation),在此基礎上迴圈選取(4份為train,1份為validation),進行訓練和驗證。從而選擇其中最好的模型。
交叉驗證:重複的使用資料,把得到的樣本資料進行切分,組合為不同的訓練集和測試集,用訓練集來訓練模型,用測試集來評估模型**的好壞。交叉驗證用在資料不是很充足的時候。
交叉驗證的作用
交叉驗證常見形式
ps:實際運用中,因為交叉驗證會耗費較多的計算資源(畢竟一直迴圈選取,然後訓練,驗證)。所以一般資料充足,直接隨機選取一小部分作為「驗證集」就行了。(tips:一定要隨機,因為如果原來的資料集排列有一定的規律,例如前100全是a類,後100全是b類,那麼你只是簡單的用語句x_val = x[150:],得到的就只有b類了。當然,如果樣本本來就是隨機分布的,那就沒關係。)
k折交叉驗證中,不重複地隨機將訓練資料集劃分為k個,其中k-1個用於模型的訓練,剩餘的1個用於測試。重複此過程k次,就得到了k個模型及對模型效能的評價。該種方法對資料劃分的敏感性較低。
下圖展示了k折交叉驗證,k=10,訓練資料集被劃分為10塊,在10次迭代中,每次迭代中都將9塊用於訓練,剩餘的1塊用於模型的評估。10塊資料集作用於某一分類器,分類器得到的效能評價指標為ei,i=1,2,⋯,10ei,i=1,2,⋯,10,可用來計算模型的估計平均效能110∑10i=1ei110∑i=110ei
k折交叉驗證中k的標準值為10,對大多數應用來說都時合理的。如果訓練集相對較小,可以增大k值,這樣將會有更多的資料用於進行訓練,這樣效能的評估結果也會得到較小的偏差。但是k值得增加會導致交叉驗證演算法的時間延長,並使得訓練塊高度相似,無法發揮交叉驗證的效果。如果資料集較大,可以選擇較小的k值,降低在不同資料塊的重複計算成本,同時訓練快比例小但是依然有大量的訓練資料。
注:這次只是初步了解。
scikit learning 交叉驗證
import numpy as np from sklearn import datasets from sklearn.cross validation import train test split from sklearn.neighbors import kneighborsclassifi...
交叉驗證(cross validation)
交叉驗證是資料分析時模型選擇的方法之一,將資料集分為三份,分別為訓練集 training set 驗證集 valication set 和測試集 test set 分別功能為訓練模型,選擇模型和對學習方法的評估。其演算法的思想為重複的使用資料,使得模型的精度越來越高。交叉驗證的方法有以下三種 1.簡...
交叉驗證(Cross validation
交叉驗證 cross validation 交叉驗證用於防止模型過於複雜而引起的過擬合 作用 如何交叉驗證 我這裡主要介紹k交叉驗證 1 將資料集分成k份 2 對於每乙個模型 拿多項式回歸舉例,m 2為乙個模型,m 3為乙個模型。我們主要就是尋找最好的m for j 1,2,k 將除第j份的所有資料...