机器学习样本处理算法(二)详细特点描述

转载自 https://www.jianshu.com/p/054654aeae4f

交叉验证、留一交叉验证、自助法

机器学习包括许多算法:线性回归、逻辑回归、决策树、SVM、随机森林、GBDT等等。那么该如何评价某个算法在数据集上的表现呢?这里阐述3个评估方法:交叉验证、留一交叉验证、自助法。

当数据集数量有限时,我们需要将一定数量的数据用于训练,剩下的数据用于测试,也就是旁置法。当然,也许不巧:用于训练(或测试)的数据不具代表性,那么需要将数据按照某种比例进行划分,也就是分层。

一个减少由于旁置法取样而引起的任何偏差的更为通用的方法是,重复整个过程,用不同的随机样本重复进行多次训练和测试,将每次不同迭代过程中所得的误差率进行平均得到一个综合误差率,这就是重复旁置法的误差率估计。

在重复旁置法中,可能在整个过程中,有些数据一直作为测试数据或者训练数据,这样不可避免的由于训练集和测试集数据代表性不一致产生了影响。因此,进行了一个简单的变体方法,引出了交叉验证。

交叉验证


在交叉验证中,需要先固定一个折数,也就是划分。假设折数为3,代表将数据集大致划分为了3等分,然后2/3数据用于训练,1/3数据用于测试,这样此过程循环3次,从而使得每一个实例都可以用来训练和测试。如果同时采用了分层技术,这就是分层3折交叉验证。

设折数为n,那么会重复n次过程,也会产生n个测试结果。将n个测试结果作平均产生的结果就是该算法在数据集上的综合误差估计。

那么n值如何确定呢?书上说:经过大量的实验表明10折正是获得最好的错误估计的恰当选择,而且也有一些理论根据可以支持这一点。当然,为了得到可靠的误差估计,单次的10折交叉验证可能不够,有一个标准的程序是重复10次交叉验证——即10次10折交叉验证,然后取平均值。(_偶的天,变成计算密集型的任务了,对于加快计算,可以采用并发、GPU等方式进行。)

留一交叉验证


留一交叉验证,名字和交叉验证类似,事实也是这样。留一交叉验证,其折数就是样本的个数,设样本个数为m,需要重复m次,最后取平均值。这样的验证方法与上面的交叉验证方法比有优点也有缺点。

优点:
  1. 每次使用尽可能多的数据进行训练(只有一个1实例用于测试),从而能够得到更准确的分类器。
  2. 这个方法具有确定性,因为采样是确定的,因而最后的误差估计也是确定的。所以没有必要重复留一交叉验证。
缺点:
  1. 计算成本较高。需要m次训练和预测,对于大数据集来说,通常不可行(速度太慢了),反而可以在小数据集上得到尽可能正确的估计。
  2. 因为确定了采样方式(每次除去1个),因此不能进行分层(让数据呈现一定的比例),所以对数据集的某算法误差估计可能存在问题。这里举个例子:想象一个完全随机的数据集,含有数量相等的两个类,面对一个随机数据,所能给出的最好的预测方式是预测它属于多数类,其真实误差率为50%。但在留一法中,与测试数据相反的类才是多数类,因此每次预测都是错的,也就是误差率高达100%。

自助法


上面方法在采样时都是一旦从数据集中被取出放入训练集或测试集中,那么它就不能被放回。也就是说,一个实例只能被选择一次。而自助法不同,它是有放回的抽样,那么训练集中数据存在重复。

我们来阐述一个特例:0.632自助法。假设数据集中n个数据,那么每一个数据被取到的概率是1/n,抽样n次,某个实例不被取到的概率是(1-1/n)^n≈0.368.也就是说训练集中只有63.2%的数据。因此其训练数据比10折交叉验证(90%的数据)小,为了补偿这点,将测试集误差和用训练集数据计算的再带入误差率组合得到误差估计值。

这方法也存在误差,同样考虑一个完全随机的数据集,含有数量相等的两个类,面对一个随机数据,所能给出的最好的预测方式是预测它属于多数类,其真实误差率为50%。但是对于自助法而言,可能存在一个完美的算法,能够完全预测正确,导致组合后的误差估计会过于乐观。

引用:

威腾, Witten L H, Frank E. 数据挖掘: 实用机器学习技术及 Java 实现: 英文版[M]. 机械工业出版社, 2003.

eg:

[M,N]=size(data);//数据集为一个M*N的矩阵,其中每一行代表一个样本
    indices=crossvalind('Kfold',data(1:M,N),10);//进行随机分包
    for k=1:10//交叉验证k=10,10个包轮流作为测试集
        test = (indices == k); //获得test集元素在数据集中对应的单元编号
        train = ~test;//train集元素的编号为非test元素的编号
        train_data=data(train,:);//从数据集中划分出train样本的数据
 train_target=target(:,train);//获得样本集的测试目标,在本例中是实际分类情况
        test_data=data(test,:);//test样本集
 test_target=target(:,test);
 [HammingLoss(1,k),RankingLoss(1,k),OneError(1,k),Coverage(1,k),Average_Precision(1,k),Outputs,Pre_Labels.MLKNN]=MLKNN_algorithm(train_data,train_target,test_data,test_target);//要验证的算法
 end
//上述结果为输出算法MLKNN的几个验证指标及最后一轮验证的输出和结果矩阵,每个指标都是一个k元素的行向量


作者:浩水一方
链接:https://www.jianshu.com/p/054654aeae4f
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自blog.csdn.net/weixin_42296976/article/details/80934353
今日推荐