关于K-fold cross validation 下不同的K的选择的疑惑?

在K-fold cross validation 下 比较不同的K的选择对于参数选择(模型参数,CV意义下的估计的泛化误差)以及实际泛化误差的影响。更一般的问题,在实际模型选择问题中,选择几重交叉验证比较合适?

交叉验证的背景知识:

CV是用来验证模型假设(hypothesis)性能的一种统计分析方法,基本思想是在某种意义下将原始数据进行分组,一部分作为训练集,一部分作为验证集,使用训练集对每个hypothesis进行训练,再用验证集对每个hypothesis的性能进行评估,然后选取性能最好的hypothesis作为问题对应的模型。

常用CV 方法:

1. Hold-out method

最简单的验证方法,将训练数据随机分为两份(典型做法是七三分)。不是真正意义上的CV,没有交叉的思想,所以验证集上的测试精度与原始数据的分组有很大关系,具有随机性,不具有说服性。(是否可通过多次平均的方法来消除这种随机性?待验证)

2. K-fold CV

一般,k>=2。经验上,k取5即可(计算量与精度的权衡),k=5时的结果大致和10以上类似。

3. Leave-one-out CV(LOO-CV)

K-fold CV 的极端情况,将k设为样本数。

优点:(1)结果可靠。

(2)实验过程可被复制。

缺点:计算量过大。实际操作困难,除非并行化。

实验: 使用高斯核最小二乘做回归。

Code:

Contents

  • training
    set
  • test
    set
  • ================Cross
    Validation=======================
  • ================
    Normal Equations ================

training set

the number of the tarining samples

trainSize=1000;
% the dimension of the tarining samples
trainDim=1;

% the gaussian noise (u=0, sigma= 0.4472(variance equals to 0.2))
% epsilon=normrnd(0, 0.4472,trainSize,trainDim);

% the gaussian noise (u=0, sigma= 0.3162(variance equals to 0.1))
% epsilon=normrnd(0, 0.3162,trainSize,trainDim);

epsilon=normrnd(0, 0.1,trainSize,trainDim);
% the nosiy training samples
% the uniform distribution in [-a,a]
% R = a - 2*a*rand(m,n)
%  x_train=1-2.*rand(trainSize,trainDim); %[-1,1]
x_train=pi-(2*pi).*rand(trainSize,trainDim); %[-pi,pi]
% sinc target function
y_train=sinc(x_train)+epsilon;
%y_train=sinc(x_train);

test set

the number of the test samples

testSize=1000;
% the dimension of the tarining samples
testDim=1;

% the test samples
x_test=pi-2*pi.*rand(testSize,testDim);
y_test=sinc(x_test);

================Cross Validation=======================

[mse,bestk,bestg] = RLScgForRegress(x_train,y_train);
================ Normal Equations ================
fprintf(‘Solving with normal equations...\n‘);

D_train=generateDictonary(x_train,x_train,bestg);

D_test=generateDictonary(x_test,x_train,bestg);

% Map D_train onto Guassian high-dim Features and Normalize
[D_train, mu, sigma] = featureNormalize(D_train);

% Map D_test and normalize (using mu and sigma)
D_test = bsxfun(@minus, D_test, mu);
D_test = bsxfun(@rdivide, D_test, sigma);

% Calculate the parameters from the normal equation
ntheta = normalEqn(D_train,y_train,bestk);

%     % Display normal equation‘s result
%     fprintf(‘Theta computed from the normal equations: \n‘);
%     fprintf(‘ %f \n‘, ntheta);
%     fprintf(‘\n‘);

trainError=sqrt(sum((y_train-D_train*ntheta).^2)/size(y_train,1));
testError=sqrt(sum((y_test-D_test*ntheta).^2)/size(y_test,1));

%  Plot fit over the data
figure;
plot(x_test, y_test, ‘rx‘, ‘MarkerSize‘, 10, ‘LineWidth‘, 1.5);
xlabel(‘x test‘);
ylabel(‘y test‘);
hold on;
grid on;
plot(x_test,D_test*ntheta, ‘b.‘, ‘LineWidth‘, 2);
hold off;





对于这个问题,选择K为多少比较合适?

1、 首先确定待选模型参数的范围(即假设空间),确保所选范围能包含最优假设。K-fold CV 可以选出某种意义下的最优的参数,但通过实验观察,似乎的趋势是,不同的K对应的假设空间是不同的,K越大,需要增加参数的区间,以保证假设空间能包含住最优性能的假设。

 

Eg:lambda_vec = [0.001 0.003 0.01 0.03 0.1 0.3 1 1.3 1.6 1.9 2.3 3 6 10 20 40 70 100 150 200 250 300];

sigma_vec = [0.03 0.1 0.3 1 1.3 1.6];

这两组参数区间下,对应的假设的性能:

 

 

2、 对于不同的K对应的CV的评价指标:

(1)CV意义下的估计泛化误差(使用RMSE)

(2)实际泛化误差

 

K=2时




最优估计泛化误差         0.1832                实际泛化误差 0.1769




K=5时




最优估计泛化误差         0.2011                实际泛化误差 0.2571

 

K=10时

 

最优估计泛化误差         0.2020                实际泛化误差 0.2740

 

 

这种随着K增加,泛化误差增加的趋势和理论上不符?

理论上,随着K越大,可供训练的样本更多,这样评估的结果更可靠。即是这两种泛化误差都应是下降趋势。
时间: 2024-08-29 23:31:01

关于K-fold cross validation 下不同的K的选择的疑惑?的相关文章

R: Kriging interpolation and cross validation 克里金插值及交叉验证浅析

克里金插值的基本介绍可以参考ARCGIS的帮助文档[1]. 其本质就是根据已知点的数值,确定其周围点(预测点)的数值.最直观的方法就是找到已知点和预测点数值之间的关系,从而预测出预测点的数值.比如IDW插值方法,就是假设已知点和预测点的值跟它们相对距离成反比.克里金插值的精妙之处在于它不仅考虑了已知点和预测点的距离关系,还考虑了这些已知点之间的自相关关系. 如何衡量已知点之间的自相关关系呢?通常使用的就是半变异函数,其公式如下[1]: Semivariogram(distance h) = 0.

交叉验证的缺陷及改进(Cross Validation done wrong)

本文主要是对我们使用交叉验证可能出现的一个问题进行讨论,并提出修正方案. 本文地址:http://blog.csdn.net/shanglianlm/article/details/47207173 交叉验证(Cross validation)在统计学习中是用来估计你设计的算法精确度的一个极其重要的工具.本文主要展示我们在使用交叉验证时可能出现的一个问题,并提出修正的方法. 下面主要使用 Python scikit-learn 框架做演示. 先验理论(Theory first) 交叉验证将数据集

Cross Validation done wrong

Cross Validation done wrong Cross validation is an essential tool in statistical learning 1 to estimate the accuracy of your algorithm. Despite its great power it also exposes some fundamental risk when done wrong which may terribly bias your accurac

cross validation交叉验证

交叉验证是一种检测model是否overfit的方法.最常用的cross validation是k-fold cross validation. 具体的方法是: 1.将数据平均分成k份,0,1,2,,,k-1 2.使用1~k-1份数据训练模型,然后使用第0份数据进行验证. 3.然后将第1份数据作为验证数据.进行k个循环.就完成了k-fold cross validation 这个交叉验证的方法的特点是:所有的数据都参与了验证,也都参与了训练,没有浪费数据.

3.1.7. Cross validation of time series data

3.1.7. Cross validation of time series data Time series data is characterised by the correlation between observations that are near in time (autocorrelation). However, classical cross-validation techniques such as KFold and ShuffleSplit assume the sa

交叉验证(Cross Validation)

假设我们需要从某些候选模型中选择最适合某个学习问题的模型,我们该如何选择?以多元回归模型为例:,应该如何确定k的大小,使得该模型对解决相应的分类问题最为有效?如何在偏倚(bias)和方差(variance)之间寻求最佳的平衡点?更进一步,我们同样需要知道如何在加权回归模型中选择适当的波长参数,或者在基于范式的SVM模型中选择适当的参数C? 我们假设模型集合为有限集,我们的目的就是从这d个模型中,选择最有效的模型. 假设样本集为S,根据经验风险最小化原则(ERM),可能会使用这样的算法: 1.在S

交叉验证(Cross Validation)原理小结

交叉验证是在机器学习建立模型和验证模型参数时常用的办法.交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏.在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓"交叉". 那么什么时候才需要交叉验证呢?交叉验证用在数据不是很充足的时候.比如在我日常项目里面,对于普通适中问题,如果数据样本量小于一万条,我们就会采用交叉验证来训练优化选择模型.如果样本

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格, 但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37), 因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

package edu.bjtu.day8_27; import java.util.Scanner; /** * @author Allen * @version 创建时间:2017年8月27日 下午7:55:46 * 类说明:链接:https://www.nowcoder.com/questionTerminal/6e5207314b5241fb83f2329e89fdecc8 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格, 但

剑指Offer(Java版)第十二题:地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动, 它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。 如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18。但它不能进入方格(35, 38), 因为3+5+3+8=19。请问该机器人能够到达多少个格子?

/*地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动, 它每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子. 如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18.但它不能进入方格(35, 38), 因为3+5+3+8=19.请问该机器人能够到达多少个格子?*/public class Class12 { public int moveCount(int rows, int cols, int threshold){