当前位置:
文档之家› 横截面数据分类:机器学习方法
横截面数据分类:机器学习方法
▪ 优点:相比于前面的K-CV,LOO-CV有两个明显的优点:a.每一回合中 几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估 所得的结果比较可靠。 b. 实验过程中没有随机因素会影响实验数据, 确保实验过程是可以被复制的.
▪ 缺点:计算成本高,因为需要建立的模型数量与原始数据样本数量相同, 当原始数据样本数量相当多时,LOO-CV在实作上便有困难几乎就是不 显示,除非每次训练分类器得到模型的速度很快,或是可以用并行化计算 减少计算所需的时间.
5.8神经网络分类
▪ 对于拟合全部数据,代码如下: • library(nnet) • a=nnet(NSP~.,data=w,subset=1:n, • size=2,rang=0.01,decay=5e-4,maxit=200) • wp=predict(a,w[m,],type="class") • sum(w[m,D]!=wp)/length(m) 得到误判率为0.2180095.
▪ 下面用同样的参数做10折交叉验证:
▪ library(nnet)
▪ E=rep(0,Z)
▪ for(i in 1:Z){
▪ m=mm[[i]];mc=setdiff(1:n,m)
▪ a=nnet(NSP~.,data=w,subset=mc,size=2,
▪
rang=0.1,decay=0.01,maxit=200)
5.6支持向量机分类
5.6.1拟合全部数据
5.6.2交叉验证
5.7最近邻分类
▪ K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理 论上比较成熟的方法,也是最简单的机器学习算法之一。 该方法的思路是:如果一个样本在特征空间中的k个最相似 (即特征空间中最邻近)的样本中的大多数属于某一个类别 ,则该样本也属于这个类别。KNN算法中,所选择的邻居都 是已经正确分类的对象。该方法在定类决策上只依据最邻 近的一个或者几个样本的类别来决定待分样本所属的类别 。 KNN方法虽然从原理上也依赖于极限定理,但在类别决 策时,只与极少量的相邻样本有关。由于KNN方法主要靠周 围有限的邻近的样本,而不是靠判别类域的方法来确定所 属类别的,因此对于类域的交叉或重叠较多的待分样本集 来说,KNN方法较其他方法更为适合。
▪ 2).K-fold Cross Validation(记为K-CV)
▪ 方法:作为1)的演进,将原始数据分成K组(一般是均分),将每个子集数 据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个 模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下 分类器的性能指标.K一般大于等于2,实际操作时一般从3开始取,只有在 原始数据集合数据量小的时候才会尝试取2. 而K-CV 的实验共需要建立 k 个models,并计算 k 次 test sets 的平均辨识率。在实作上,k 要够 大才能使各回合中的 训练样本数够多,一般而言 k=10 (作为一个经验 参数)算是相当足够了。
▪ 优点:K-CV可以有效的避免过学习以及欠学习状态的发生,最后得到的 结果也比较具有说服性.
▪ 缺点:K值选取上
▪ 3).Leave-One-Out Cross Validation(记为LOO-CV)
▪ 方法:如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本 单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N 个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下 LOO-CV分类器的性能指标.
▪ 只有训练集才可以用在 模式的训练过程中,测试集 则必须 在模式完成之后才被用来评估 模式优劣的依据。
▪ 数据集分割原则
交叉验证在原始数据集分割为训练集与测试集,必须遵守两个要点:
▪ 训练集中样本数量必须够多,一般至少大于总样本数的 50%。
▪ 两组子集必须从完整集合中均匀取样。
其中第 2 点特别重要,均匀取样的目的是希望减少 训练集/测试集 与完整集合之间的偏差(bias),但却也不易做到。一般的作法是随机取样 ,当样本数量足够时,便可达到均匀取样的效果。然而随机也正是此作 法的盲点,也是经常是可以在数据上做手脚的地方。举例来说,当辨识 率不理想时,便重新取样一组训练集 与测试集,直到测试集的辨识率满 意为止,但严格来说便算是作弊。
5.5.2交叉验证
▪ 交叉验证(Cross-Validation): 有时亦称循环估计, 是一种统计学上将 数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分 析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集 被称为训练集。而其它的子集则被称为验证集或测试集。
▪ 交叉验证对于人工智能,机器学习,模式识别,分类器等研究都具有 很强的指导与验证意义。
▪ 基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为 训练集(train set),另一部分做为验证集(validation set or test set),首 先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型 (model),以此来做为评价分类器的性能指标.
三大CV的方法
▪ 2、计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距 离,才能求得它的K个最近邻点.对于大数据分类,即需要大量的训练样本,计 算复杂度高
▪ 3、可理解性差,无法给出像决策树那样的规则.
▪ 先用最近临方法对例5.1的全部数据进行拟合,代码如下: • library(kknn) • a=kknn(NSP~.,k=6,train=w,test=w) • (z=table(w[,D],a$fit)) • (E=(sum(z)-sum(diag(z)))/sum(z)) 得到了误判率为0.009407338,错分了20个观测值。
▪ 1).Hold-Out Method ▪ 方法:将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集
训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此HoldOutMethod下分类器的性能指标.。Hold-OutMethod相对于K-fold Cross Validation 又称Double cross-validation ,或相对K-CV称 2-fold crossvalidation(2-CV) ▪ 优点:好处的处理简单,只需随机把原始数据分为两组即可 ▪ 缺点:严格意义来说Hold-Out Method并不能算是CV,因为这种方法没有达到 交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低 与原始数据的分组有很大的关系,所以这种方法得到的结果其实并不具有说服性 .(主要原因是 训练集样本数太少,通常不足以代表母体样本的分布,导致 test 阶段辨识率容易出现明显落差。此外,2-CV 中一分为二的分子集方法的变异 度大,往往无法达到「实验过程必须可以被复制」的要求。)
▪ 在模式识别与机器学习的相关研究中,经常会将 数据集分 为 训练集与测试集 这两个子集,前者用以建立 模式,后 者则用来评估该 模式对未知样本进行预测时的精确度,正 规的说法是 generalization ability(泛化能力)
▪ 交叉验证核心原则
▪ Cross-validation 是为了有效的估测 generalization error 所设计的实验方法
Hale Waihona Puke ▪ ww=matrix(0,20,2);for(s in 1:20)
▪ {a=nnet(NSP~.,data=w,subset=d1,size=s,
▪
rang=0.1,decay=0.01,maxit=200)
▪ ww[s,1]=sum(w[d1,D]!=predict(a,w[d1,],type="class"))/length(d1)
▪ 下面再做最近邻方法的10折交叉验证,还是用k=6,这里仅 仅给出测试集的分类平均误判率,相关代码如下:
library(kknn) E=rep(0,Z) for(i in 1:Z){m=mm[[i]] n1=length(m) a=kknn(NSP~.,k=6,train=w[-m,],test=w[m,]) E[i]=sum(w[m,D]!=a$fit)/n1} Mean(E) 计算结果表明,10折交叉验证得到的用最近邻方法做分类的测试集的平均误判率 为0.02774942.
▪ 优点:
▪ 1、简单,易于理解,易于实现,无需估计参数,无需训练,选择合适的k,对 异常值不敏感;
▪ 2、适合于多分类问题(multi-modal,对象具有多个类别标签)
▪ 3、可拓展性强,添加新实例无需重新构造模型
▪ 缺点:
▪ 1、当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时, 有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数. 可以采用权值的方法(和该样本距离小的邻居权值大)来改进.
UE) • wp=predict(a,w) • (z=table(w[,D],wp)) • (E0=(sum(z)-sum(diag(z)))/sum(z))
表5.5称之为混淆矩阵,主对角线上的元素表示的是分类正 确的数目,主对角线外的元素是分类错误的数目。行是真实 类,列是预测类,误判率=1/(1655+1+294+176) =0.0004703669
绘制图5.4的代码如下:
• par(mfrow=c(3,1))
• matplot(importance(a)[,1:3],type="o",pch=1:3,lty=1:3,col=1,
•
xlab="Variable Number",ylab = "Importance")
• title("Variable Importance for Three Levels of Response")