機器學習中的交叉驗證(cross-validation)

from:https://blog.csdn.net/lhx878619717/article/details/49079785

交叉驗證(Cross validation),交叉驗證用于防止模型過于復雜而引起的過擬合.

有時亦稱循環估計, 是一種統計學上將數據樣本切割成較小子集的實用方法。于是可以先在一個子集上做分析, 而其它子集則用來做后續對此分析的確認及驗證。 一開始的子集被稱為訓練集。而其它的子集則被稱為驗證集或測試集。

交叉驗證是一種評估統計分析、機器學習算法對獨立于訓練數據的數據集的泛化能力(generalize)。

?

交叉驗證一般要盡量滿足:

1)訓練集的比例要足夠多,一般大于一半
2)訓練集和測試集要均勻抽樣

交叉驗證主要分成以下幾類:
1)k-folder cross-validation:
k個子集,每個子集均做一次測試集,其余的作為訓練集。交叉驗證重復k次,每次選擇一個子集作為測試集,并將k次的平均交叉驗證識別正確率作為結果。
優點:所有的樣本都被作為了訓練集和測試集,每個樣本都被驗證一次。10-folder通常被使用。
2)K * 2 folder cross-validation
是k-folder cross-validation的一個變體,對每一個folder,都平均分成兩個集合s0,s1,我們先在集合s0訓練s1測試,然后用s1訓練s0測試。
優點是:測試和訓練集都足夠大,每一個個樣本都被作為訓練集和測試集。一般使用k=10
3)least-one-out cross-validation(loocv)
假設dataset中有n個樣本,那LOOCV也就是n-CV,意思是每個樣本單獨作為一次測試集,剩余n-1個樣本則做為訓練集。
優點:
1)每一回合中幾乎所有的樣本皆用于訓練model,因此最接近母體樣本的分布,估測所得的generalization error比較可靠。
2)實驗過程中沒有隨機因素會影響實驗數據,確保實驗過程是可以被復制的。
但LOOCV的缺點則是計算成本高,為需要建立的models數量與總樣本數量相同,當總樣本數量相當多時,LOOCV在實作上便有困難,除非每次訓練model的速度很快,或是可以用平行化計算減少計算所需的時間。

?

——-十折交叉驗證:10-fold cross validation——-

英文名叫做10-fold cross-validation,用來測試算法準確性。是常用的測試方法。將數據集分成十分,輪流將其中9份作為訓練數據,1份作為測試數據,進行試驗。每次試驗都會得出相應的正確率(或差錯率)。10次的結果的正確率(或差錯率)的平均值作為對算法精度的估計,一般還需要進行多次10折交叉驗證(例如10次10折交叉驗證),再求其均值,作為對算法準確性的估計。

之所以選擇將數據集分為10份,是因為通過利用大量數據集、使用不同學習技術進行的大量試驗,表明10折是獲得最好誤差估計的恰當選擇,而且也有一些理論根據可以證明這一點。但這并非最終診斷,爭議仍然存在。而且似乎5折或者20折與10折所得出的結果也相差無幾。

舉例如下:

?

?

問題描述:

如何在一些模型中選擇一個最好的模型;避免數據浪費;

舉例說明

1 多項式回歸模型中?y = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + \cdots + a_m x^m + \varepsilon. \,?我們知道模型越復雜即m越高,擬合效果越好。但是未必是一個好的分類模型,因為模型過擬合了。那么如何確定m的值呢。

2 locally weighted regression中,τ值得確定。

3 SVM中參數C的確定。

交叉驗證就是很好的用于這些問題,這些模型中參數尋優的問題。

?

?

如何交叉驗證:

我這里主要介紹K交叉驗證

1 將數據集分成K份(網上有說是將數據集分成測試訓練兩部分,然后將訓練部分再分K份,我覺得這樣仍然有大部分數據沒用于模型訓練造成數據浪費。)

2 對于每一個模型(拿多項式回歸舉例, m=2為一個模型,m=3為一個模型。。。我們主要就是尋找最好的m)

??for j=1,2,...,k

??????將除第j份的所有數據作為訓練集用于訓練,得到訓練參數。

??????將訓練參數在第j份數據上進行測試,得到測試錯誤E(j);

3 經過第二步就得到了K個模型,和K個測試錯誤,將這K個錯誤求平均,就是該模型的estimated generalization error。

4?estimated generalization error最小的模型即為我們最優的模型,(例如發現m=3時平均錯誤最小)我們取這個模型再對所有數據進行訓練,得到一個模型參數即為所求。

這樣就避免了數據浪費,所有數據都有用于過訓練。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458210.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458210.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458210.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux禁止ping

執行此命令 :echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 可以禁止ping一、如果沒有iptables禁止pingecho 1 > /proc/sys/net/ipv4/icmp_echo_igore_all #開啟echo 0 > /proc/sys/net/ipv4/icmp_echo_igore_all #關閉二、利用iptables規則禁pingi…

python3字符串屬性(二)

1、S.isdecimal() -> bool Return True if there are only decimal characters in S, False otherwise. 字符串如果是十進制,返回True。 2、S.isdigit() -> bool Return True if all characters in S are digits and there is at least one character …

使用libsvm中的svm_cross_validation函數進行交叉驗證

from:https://blog.csdn.net/tao1107291820/article/details/51581322 在libsvm的使用中,為了得到更好的c、gama參數,可以通過多次使用libsvm中的svm_cross_validation函數進行參數尋優,下面是svm_cross_validation的一種使用方法&#xff1…

JavaScript中eval()函數

eval調用時,實例為eval( "( javascript代碼 )" ), eval() 函數可將字符串轉換為代碼執行,并返回一個或多個值。轉載于:https://www.cnblogs.com/lxcmyf/p/5703640.html

輕松談話:談話的力量

如何與她人搭話?? 第一:給別人一個好印象 1、環境:通過共同環境來激發興趣,比如:在球場,你覺得誰會贏。 2、對方:多數人喜歡談論自己。 3、自己:主動表明意圖,要真誠。 第…

函數的二義性與函數對象的傳遞問題(通過實現vector的to_string示例)

許多時候&#xff0c;我們想要直接打印容器的內容&#xff0c;比如 std::vector<int> a { 1, 2, 3 }; 可以打印出[1, 2, 3]。 參考標準庫&#xff0c;可以寫出一個帶有迭代器的to_string函數&#xff1a; template <typename Iter, typename Func> std::string to…

libSVM介紹(二)

from&#xff1a;https://blog.csdn.net/carson2005/article/details/6539192 鑒于libSVM中的readme文件有點長&#xff0c;而且&#xff0c;都是采用英文書寫&#xff0c;這里&#xff0c;我把其中重要的內容提煉出來&#xff0c;并給出相應的例子來說明其用法&#xff0c;大家…

四則運算題2

本題新學知識點&#xff1a; itoa函數 char *itoa( int value, char *string,int radix);[1]原型說明&#xff1a;value&#xff1a;欲轉換的數據。string&#xff1a;目標字符串的地址。radix&#xff1a;轉換后的進制數&#xff0c;可以是10進制、16進制等。程序實例:#includ…

c++調用Libsvm

libSVM中的readme中文版&#xff1a;http://blog.csdn.net/carson2005/article/details/6539192 LibSVM的package中的Readme文件中介紹了怎樣具體的使用LibSvm&#xff0c;可以在Dos下以命令形式進行調用&#xff0c;也可以用程序包中提供的GUI程序Svm-toy進行圖形化的操作。sv…

STL -set

轉載自&#xff1a;http://blog.csdn.net/LYHVOYAGE/article/details/22989659 set集合容器實現了紅黑樹&#xff08;Red-Black Tree&#xff09;的平衡二叉檢索樹的的數據結構&#xff0c; 在插入元素時&#xff0c;它會自動調整二叉樹的排列&#xff0c;把該元素放到適當的位…

【機器學習實戰之一】:C++實現K-近鄰算法KNN

本文不對KNN算法做過多的理論上的解釋&#xff0c;主要是針對問題&#xff0c;進行算法的設計和代碼的注解。 KNN算法&#xff1a; 優點&#xff1a;精度高、對異常值不敏感、無數據輸入假定。 缺點&#xff1a;計算復雜度高、空間復雜度高。 適用數據范圍&#xff1a;數值…

libsvm C++ 代碼參數說明匯總

幾個重要的數據結構 2.1 struct svm_problem {int l; // 記錄樣本的總數double *y; // 樣本所屬的標簽(1, -1)struct svm_node **x; // 指向樣本數據的二維數組(即一個矩陣&#xff0c;行數是樣本數&#xff0c;列數是特征向量維度) }; 2.2 struct svm_node {int …

javascript設計模式-繼承

javascript繼承分為兩種&#xff1a;類式繼承&#xff08;原型鏈、extend函數&#xff09;、原型式繼承&#xff08;對繼承而來的成員的讀和寫的不對等性、clone函數&#xff09;。 類式繼承-->prototype繼承&#xff1a; 1 function Person(name){2 this.name …

GIS基礎軟件及操作(二)

原文 GIS基礎軟件及操作(二) 練習二、管理地理空間數據庫 1.利用ArcCatalog 管理地理空間數據庫 2.在ArcMap中編輯屬性數據 第1步 啟動 ArcCatalog 打開一個地理數據庫 當 ArcCatalog打開后&#xff0c;點擊, 按鈕&#xff08;連接到文件夾&#xff09;. 建立到包含練習數據的…

libSVM分類小例C++

from&#xff1a;http://www.doczj.com/list_31/ 使用libSVM求解分類問題的C小例 1.libSVM簡介 訓練模型的結構體 struct svm_problem//儲存參加計算的所有樣本 { int l; //記錄樣本總數 double *y; //指向樣本類別的組數 //prob.y new double[prob.l]; struct svm_node …

qunit 前端腳本測試用例

首先引用qunit 測試框架文件 <link rel"stylesheet" href"qunit-1.22.0.css"> <script src"qunit-1.22.0.js"></script> <div id"qunit"></div> <div id"qunit-fixture"></div>…

非常規文件名刪除

生活中我們偶爾會遇到這樣一件事&#xff1a;走在路上&#xff0c;突然感覺鞋底有東西&#xff0c;抬腳一看&#xff0c;是個泡泡糖。拿不掉&#xff0c;走路還一粘一粘的。要多難受有多難受&#xff01;同樣在linux中也有這么一種文件名。看著不舒服&#xff0c;卻刪不掉。今天…

Machine Learning(Stanford)| 斯坦福大學機(吳恩達)器學習筆記【匯總】

from&#xff1a;https://blog.csdn.net/m399498400/article/details/52556168 定義本課程常用符號 訓練數據&#xff1a;機器用來學習的數據 測試數據&#xff1a;用來考察機器學習效果的數據&#xff0c;相當于考試。 m 訓練樣本的數量&#xff08;訓練集的個數) x 輸入的…

PHP OOP

類跟對象的關系類是對象的抽象(對象的描述(屬性)&#xff0c;對象的行為(方法))對象是類的實體面相對象的三大特征&#xff1a;封裝、集成、多態自定義類Class Person{}屬性定義屬性是類里面的成員&#xff0c;所以要定義屬性的前提條件是需要聲明一個類Class Person{public $n…

kv存儲對抗關系型數據庫

http://www.searchdatabase.com.cn/showcontent_52657.htm轉載于:https://www.cnblogs.com/hexie/p/5276034.html