03FZ横截面分类

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于column.3C.dat数据
library(MASS) w3=read.table("column.3C.dat") a=lda(V7~.,data=w3)#数据column.3C.dat b=predict(a,w3)$class#对训练集的预测(类) (zz=table(w3[,7],b));(sum(zz)-sum(diag(zz)))/sum(zz)#0.183871
分类结果
library(rpart) E0=rep(0,5);E1=E0 for(i in 1:5){m=mm[[i]] a=rpart(NSP~.,w[-m,]) z0=table(w[-m,23],predict(a,w[-m,],type="class")) z0=z0[order(as.numeric(dimnames(z0)[[1]])),
– 多项分布对数线性模型和多项logit模型. – 机器学习的方法也可以应用于频数问题.
回顾经典logistic回归, probit回归和仅 适用于数量自变量的判别分析
该数据有两个版本, 其区别仅仅在于一个版本的因变量有2 个水平, 另一个有3个水平. 而两个版本的自变量是相同的, 都是定量变量. 可以尝试用经典的logistic回归, probit回归 和判别分析来拟合这个数据. 当然, 经典的logistic回归及 probit回归并不要求自变量一定是数量变量, 完全可以包含 定性变量. 但经典判别分析只能用数量型自变量.
– 但是在多水平的因变量而且自变量也包含分类变量时,: 机器学 习或数据挖掘的各种方法, 比如决策树的分类树, 神经网络, boosting, bagging, 随机森林, 最近邻方法, 支持向量机等.
• 和频数有关的数据, 频数就成为”因变量”.
– 经典的方法是Poisson对数线性模型(很多弱点:衍生的方法). 此 外还有
广义线性模型
经典判别分析
• 脊柱数据处理数据column.2C.dat和column.3C.dat均 可以用判别分析的方法来处理.
• 经典判别分析的原理并不复杂, 简单地描述如下. 如 果作为因变量的分类变量有k个取值(或水平, 类), 而 自变量包含p个变量, 那么每一个观测值就是p维空 间的一个点. 整个训练集的各个点(假定有n个点)就 按照已知的类别在p维空间中形成共有n个点的k个 点群. 那么, 对于一个未知类别的点, 如果离哪一群 近, 就可以分到哪一群. 关键的细节问题是如何定义 ``远近''或距离. 还要确定一些准则和标准.
library(adabag) set.seed(4410) a=boosting(NSP~.,w) #或adaboost.M1(NSP~.,w) z0=table(w[,23],predict(a,w)$class) z0=z0[order(as.numeric(dimnames(z0)[[1]])),
z0=table(w[,23],predict(a,w,type="class")) z0=z0[order(as.numeric(dimnames(z0)[[1]])),
order(as.numeric(dimnames(z0)[[2]]))] z0;(E0=(sum(z0)-sum(diag(z0)))/sum(z0))
order(as.numeric(dimnames(z1)[[2]]))] E1[i]=(sum(z1)-sum(diag(z1)))/sum(z1)} mean(E0);mean(E1)
五折交叉验证
Adaboost分类
• 这里介绍的adaboost是boosting的一种, 为一种组合方法, 这里用分类树作为基本学习器. Adaboost (adaptive boosting 的简写)可以译为自适应助推法, Adaboost是一种迭代式的 组合算法. 目的是分类. 所用的基础分类器(这里用决策树) 一开始可能较弱(即出错率较高), 然后, 随着迭代, 不断地通 过自助法(bootstrap)加权再抽样根据产生新样本改进分类 器,
z=(predict(a,w2)>0.5) u=rep("NO",310);u[!z]="AB" #把预测结果转换成原先的值(AB或NO) zz=table(w2[,7],u) #2乘2矩阵,对角线外的数目为分错的数目 (sum(zz)-sum(diag(zz)))/sum(zz)#0.1387097 #计算错误率
order(as.numeric(dimnames(z0)[[2]]))] E0[i]=(sum(z0)-sum(diag(z0)))/sum(z0) z1=table(w[m,23],predict(a,w[m,],type="class")) z1=z1[order(as.numeric(dimnames(z1)[[1]])),
讨论
• 仅仅靠训练集本身的AIC或误判率不能判断哪个模型更好 些. 我做了一个5折交叉验证(在两类中都等量地随机分为5 份), 发现对训练集来说, logistic回归的平均误差为0.133871, 而probit回归的平均误差为0.1346774; 对测试集来说, logistic回归的平均误差为0.1516129, 而probit回归的平均误 差为0.1612903. 希望读者能够自己也做类似的交叉验证. 实际上, 这两种回归区别的确不大,
因变量为分类变量, 自变量含有分类 变量: 机器学习分类方法
• 在因变量为分类变量而自 变量含有分类变量的情况 下, 经典统计基本上无能 为力.
关于数据
• 我们将试图用前面的头22个变量作为自变量来预 测作为因变量的(最后一个变量)NSP的类别. 在查 看了数据之后, 我们删去了三个有缺失值的观测 值, 形成新的数据文件
#probit回归在glm中属于binomial族,连接函数(link)为probit函数: a=glm(V7~.,w2,family=binomial(link = "probit")) z=(predict(a,w2)>0.5) u=rep("NO",310);u[!z]="AB" zz=table(w2[,7],u) (sum(zz)-sum(diag(zz)))/sum(zz)#0.1290323
1) root 2126 471 1 (0.77846 0.13876 0.08278) 2) CLASS=1,2,3,4,6,7 1681 29 1 (0.98275 0.01725 0.0000) * 3) CLASS=5,8,9,10 445 179 2 (0.00674 0.59775 0.39551) 6) CLASS=5,10 269 4 2 (0.01115 0.98513 0.00372) * 7) CLASS=8,9 176 1 3 (0.00000 0.00568 0.99432) *
决策树分类(分类树)
library(rpart.plot) (a=rpart(NSP~.,w)) #用决策树拟合全部数据并打印输出 rpart.plot(a,type=2,extra=4) #画决策树
n= 2126
node), split, n, loss, yval, (yprob) * denotes terminal node
• CTG.NAOMIT.csv. 下面将要介绍几种分类方法, 包 括决策树(分类树), adaboosting, bagging, 随机森 林, SVM, 最近邻方法等. 其中有些已经在前面回 归时介绍过, 后面只需要介绍它们的分类功能.
5折交叉验证
• 为了把这些方法进行比较, 这里还将采取5 折交叉验证的方法. 由于因变量有三个类别 (1=正常, 2=疑似, 3=病态), 它们分别有1655, 295, 176个观测,
logistic回归和probit回归
logistic回归 probit回归
w2=read.table("column.2C.dat") #logistic回归在glm中属于binomial族,默认连接函数(link)为ligit函数:
a=glm(V7~.,w2,family="binomial") #由于拟合结果是给每个观测值一个概率值, 下面以0.5作为分类界限:
• 目的是使得每一点群内部的点尽量接近, 同时使各 群之间尽量分开. 不同的准则造就了不同的判别或 分类方法.
Βιβλιοθήκη Baidu
关于column.2C.dat数据
library(MASS) w2=read.table("column.2C.dat") a=lda(V7~.,data=w2)#数据column.2C.dat b=predict(a,w2)$class#对训练集的预测(类) (zz=table(w2[,7],b));(sum(zz)-sum(diag(zz)))/sum(zz)#0.1419355
横截面数据:因变量为分类变量 以及因变量为频数(计数)
分类
分类(classification)
• 分类(classification)就是经典统计中所说的判别 (discrimination).
– 当只有两个水平时, 可以采用logistic回归及probit回归
– 在自变量全部为数量变量时可以用经典多元分析中的判别分 析.
• 为了平衡, 把这三种类型的每一种都随机地 分为五份. 读入数据及平衡地把观测值随机 分为五份的具体代码如下(这个程序不难, 相 信读者很容易能够看懂.):
w=read.csv("CTG.NAOMIT.csv") #读入数据 #把用整数代表的分类变量水平标成factor类型: w$CLASS=factor(w$CLASS);w$NSP=factor(w$NSP); w$Tendency=factor(w$Tendency) ####下面构造五折下标集################################ d=1:2126;dd=list() #观测值数目2126 目标变量NSP有3类 for(i in 1:3)dd[[i]]=d[w$NSP==i] #每个dd[[i]]是i类下标集 #下面每个kk[i]是i类中每折的数目: kk=NULL;for(i in 1:3)kk=c(kk,round(length(dd[[i]])/5)) set.seed(111) yy=list(NULL,NULL,NULL) for (i in 1:3){ xx=list();uu=dd[[i]]; for (j in 1:4) {xx[[j]]=sample(uu,kk[i]) uu=setdiff(uu,xx[[j]])};xx[[5]]=uu for(k in 1:5)yy[[i]][[k]]=xx[[k]]} mm=list(NULL,NULL,NULL,NULL,NULL) for(i in 1:5)for(j in 1:3)mm[[i]]=c(mm[[i]],yy[[j]][[i]]) #mm[[i]]是第i折的测试集下标集合
• 使用哪一种似乎仅仅是习惯而已, 有些书只介绍其中一种. 此外, 这里没有刻意选择变量, 读者可以自己把程序稍微改 动一下来看结果是否不同.
• 还有一个需要注意的是, 由于拟合结果是给每个观测值一 个概率值作为拟合值, 我这里按照其大于或不大于0.5作为 分类的界限, 这种分法不一定科学, 因为把有病的说成没病 的损失要大于把一个没病的说成是有病的. 至于用什么阈 值作为分类界限, 必须有一个明确的损失标准. 在实际应用 中, 必须注意这一点.
• 每一次迭代时都针对前一个分类器对某些观测值的误分缺 陷加以修正, 通常是在(放回)抽取样本时对那些误分的观测 值增加权重(相当于对正确分类的减少权重), 这样在新的样 本中就可能有更多的前一次分错的观测值, 再形成一个新 的分类器进入下一轮迭代, 而且在每轮迭代时都对这一轮 产生的分类器给出错误率, 最终结果由各个阶段的分类器 的按照错误率加权(权重目的是惩罚错误率大的分类器)投 票产生. 这就是所谓的``自适应''.
相关文档
最新文档