k-fold交叉验证,神经网络,matlab

来源:互联网 发布:dope动作数据 编辑:程序博客网 时间:2024/04/25 06:48

很多机器学习算法为了避免过度拟合的问题,均使用了交叉验证的技术手段。

k-fold交叉验证的原理很简单,就是把训练数据随机分成k分,训练k次,每次选k-1分数据进行训练,剩余的一份最为验证,边训练,边验证,从而找出最优解

网上k-fold相关参考:http://blog.csdn.net/chenbang110/article/details/7604975 

                                     http://stackoverflow.com/questions/25889637/how-to-use-k-fold-cross-validation-in-a-neural-network

虽然有很多的人对k-fold的实现方法进行了讲解,但具体问题具体分析,还是不能满足我的要求。针对我自己的情况,给出在matlab中,使用神经网络,采用k-fold(k=10)的例子。希望能够帮助跟我有相似需求的研究人员。

以下是主要代码:

                    cvFold = crossvalind('Kfold',length(TH),setkfold);       %setkfold就是k,设置为10,TH为训练样本
                    H_net_tmp = newff(minmax(PH),lay_str,{'tansig','tansig','purelin'},'traingdx');%PH为输入数据矩阵(必须是标准化后的)
                    H_net_tmp.trainParam.lr = 0.03;
                    H_net_tmp.trainParam.mc = 0.9;
                    H_net_tmp.trainParam.epochs = setMaxepochs;%最大迭代次数,我设置的是50000
                    H_net_tmp.trainParam.goal = 1e-3;
                    H_net_tmp.divideFcn = 'divideind';
                    H_net_tmp.trainParam.showWindow = false;
                    epoch_N = [];%用于存储没戏最后的训练次数
                    for n = 1 : setkfold
                        testIdx = (cvFold == n);
                        trainIdx = ~testIdx;
                        trInd = find(trainIdx);
                        tstInd = find(testIdx);
                        
                        H_net_tmp.divideParam.trainInd = trInd;
                        H_net_tmp.divideParam.testInd = tstInd;
                        
                        %training Network
                        %reconfigured assignment of random initial weights
                        H_net_tmp = init(H_net_tmp);%每次都对权重进行初始化,很重要,网上的很多代码都没有说明这点
                        [H_net_tmp,tr] = train(H_net_tmp,PH,TH,'useParallel','yes','useGPU','yes');
                        [~,I] = min(tr.tperf);
                        I = I(end);
                        epoch_N(n) = I;%I就是滴k次训练最优的那个次数
                    end
                    epoch_final = ceil(mean(epoch_N));


注意,一般在验证数据集上误差的变化情况是先显著减小,在增大,然后在减小或波动的减小。为了达到在验证数据集上的全局最优,在进行神经网络训练的时候,最后是训练次数到设置的最大迭代次数,而不是达到目标误差或训练集上的小值而停止训练,这点很重要,很重要,很重要,否则就是局部的最小了。[~,I] = min(tr.tperf);这就是去了验证集上的最小值。



2 0