统计学习基础复习浓缩版

作者: apricoter | 来源:发表于2019-02-13 19:42 被阅读4次

    1.简单线性回归

    lm.fit=lm(medv~lstat)
    #简单的一元线性回归模型
    coef (lm.fit)‘
    #得到各个变量的系数
    confint(lm.fit)
    #97.5%的置信区间
    plot(lstat,medv)
    #函数 plot () 绘制散点图
    abline(lm.fit)
    #abline ()绘制最小二乘回归直线 
    

    2.多元线性回归

    lm.fit=lm(medv~lstat+age,data=Boston)
    1m.fit=lm(medv~.,data=Boston)
     #用所有的预测变量进行回归时
    1m.fit=lm(medv~ .-age , data=Boston)
     #想用除某一变量之外的所有其他变量进行回归
    

    3.多项式回归

    lm.fit2=lm(medv~lstat+I(lstat^2))
    

    4.广义线性回归(含逻辑斯谛回归)

    广义线性回归模型通过拟合响应变量的条件均值的一个函数(称为连接函数)(不是响应变量的条件均值),假设响应变量服从指数分布族中的某个分布(并不仅限于正态分布),极大地扩展了标准线性模型。模型参数估计的推导依据的是极大似然估计,而非最小二乘法。

    同OLS回归,广义线性的使用也是由一个函数统领,为glm()函数,它与OLS回归相似,但多了一些参数,最主要的是family参数,它指定了概率分布及相应默认的连接函数。

    glm.fit=glm(Direction~Lag1+Lag2+Lag3+Lag4+Lag5+Volume,family = binomial,data = Smarket)
    #当通过一系列连续型和/或类别型预测变量来预测二值型结果变量时,Logistic回归是一个非常有用的工具
    

    5.线性判别分析

    LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的。这点和PCA(主成分分析)不同。PCA是不考虑样本类别输出的无监督降维技术。LDA的思想可以用一句话概括,就是“投影后类内方差最小,类间方差最大”。即将数据在低维度上进行投影,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大。

    LDA用于降维,和PCA有很多相同,也有很多不同的地方,因此值得好好的比较一下两者的降维异同点。
    相同点:
    1)两者均可以对数据进行降维。
    2)两者在降维时均使用了矩阵特征分解的思想。
    3)两者都假设数据符合高斯分布。
    不同点:
    1)LDA是有监督的降维方法,而PCA是无监督的降维方法
    2)LDA降维最多降到类别数k-1的维数,而PCA没有这个限制。
    3)LDA除了可以用于降维,还可以用于分类。
    4)LDA是分类性能最好的投影方向,PCA是样本点投影有最大方差方向

    LDA算法既可以用来降维,又可以用来分类,但是目前来说,主要还是用于降维。在我们进行图像识别相关的数据分析时,LDA是一个有力的工具。

    lda.fit=lda(Direction~Lag1+Lag2,data=Smarket,subset = train)
    #拟合线性判别模型
    

    6.二次判别分析

    与LDA类似,QDA是另一种线性判别分析算法,二者拥有类似的算法特征,区别仅在于:当不同分类样本的协方差矩阵相同时,使用LDA;当不同分类样本的协方差矩阵不同时,则应该使用QDA。

    QDA 分类器也是假设每一类观测都服从一个高斯分布,把参数估计代入贝叶斯定理进行预测。然而,与 LDA 不同的是,QDA 假设每一类观测都有自己的协方差矩碎,一般而言,如果训练观测数据囊相对较少,LDA 是一个比QDA更好的决策,降低模型的方差很有必要。

    qda.fit=qda(Direction~Lag1+Lag2,data=Smarket,subset = train)
    #调用MASS库中的qda()函数来实现二次判别分析
    

    7.K最近邻法

    K最近邻(k-Nearest Neighbor,KNN)分类算法,该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

    knn.pred=knn(train.X,test.X,train.Direction,k=1)
    

    8.K折交叉验证

    交叉验证的主要思想是数据集中的每个样本都有被测试的机会。作为交叉验证的一种特殊情况,在k-fold每次迭代中,数据被分为k部分,其中第1部分用于验证集,剩下的k-1部分用于训练集,该流程总共迭代k次,这些模型在不同但部分重叠的训练集上进行拟合,在不重叠的验证集上进行评估。最终,交叉验证性能就是k次模型在验证集上性能估计的算术平均值。K=n时LOOCV方法是K折CV方法的一个特例。为了计算方便,一般令k=5或k=10.

    从减少偏差的角度考虑,LOOCV方法比k折CV方法更好。涉及到偏差-方差的权衡问题,使用k折交叉时一般令k=5或k=10,使得测试错误率的估计不会有过大偏差或者方差。

    set.seed(17)
    cv.error.10=rep(0,10)
      #创建cv.error这个向量,内含10个0
    library(boot)
      #使用glm()函数来做线性回归,因为可以和cv.glm()函数一起使用,使用cv.glm()函数需要安装boot程序包
      #如果使用glm()函数没有设定family参数,那么它就跟lm()函数一样执行的是线性回归
    for (i in 1:10){
    +   glm.fit=glm(mpg~poly(horsepower,i),data=Auto)
        #使用poly()函数可以估计n次多项式回归所产生的测试误差
    +   cv.error.10[i]=cv.glm(Auto,glm.fit,K=10)$delta[1]
    + }#delta向量为交叉验证的结果,此时利用循环将交叉验证储存在cv.error的第i个元素,K=10即实现10折交叉验证
    cv.error.10
    

    9.自助法

    自助法(Bootstrap Method,Bootstrapping或自助抽样法)是一种从给定训练集中有放回的均匀抽样,也就是说,每当选中一个样本,它等可能地被再次选中并被再次添加到训练集中。

    最常用的一种Bootstrap自助法,假设给定的数据集包含d个样本。该数据集有放回地抽样m次,产生m个样本的训练集。这样原数据样本中的某些样本很可能在该样本集中出现多次。没有进入该训练集的样本最终形成检验集(测试集)。 显然每个样本被选中的概率是1/m,因此未被选中的概率就是(1-1/m),这样一个样本在训练集中没出现的概率就是m次都未被选中的概率,即(1-1/m)m。当m趋于无穷大时,这一概率就将趋近于e-1=0.368,所以留在训练集中的样本大概就占原来数据集的63.2%。Bagging即基于自助法采样。

    10.岭回归

    岭回归本质上是针对线性回归问题引入了L2范数正则,通过缩减回归系数避免过拟合问题。是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的耐受性远远强于最小二乘法。

    虽然最小二乘估计量在所有线性无偏估计量中是方差最小的,但是这个方差却不一定小。而实际上可以找一个有偏估计量,这个估计量虽然有微小的偏差,但它的精度却能够大大高于无偏的估计量。岭回归分析就是依据这个原理,通过在正规方程中引入有偏常数而求得回归估计量的。

    library(glmnet)
    #glmnet广义线性模型函数需先输入一个X矩阵和y向量
    grid=10^seq(10,-2,length=100)
    ridge.mod=glmnet(x[train,],y[train],alpha = 0,lambda = grid,thresh = 1e-12)
    #基于训练集建立岭回归模型,1e-12表示10^-12
    ridge.pred=predict(ridge.mod,s=4,newx=x[test,])
    #将 type="coefficients" 替换为 newx 参数,可得测试袋上的预测值。
    

    在实际始建模过程中,使用交叉验证来选择调节参数 λ 比直接选择 λ=4 更好。在 R 中,内置交叉验证函数 cv. glmnet ()来选择调节参数 λ。在默认使用十折交叉验证选择参数,可以使用 folds 参放来设置交叉验证的折数。

    cv.out=cv.glmnet(x[train,],y[train],alpha=0)
    plot(cv.out)
    bestlam=cv.out$lambda.min
    #交叉验证误羡最小的λ为 212
    #控制复杂度调整程度的λ值与约束大小是呈反比的,即λ值越大对参数较多的线性模型的惩罚力度就越大,越容易得到一个简单的模型
    ridge.pred=predict(ridge.mod,s=bestlam,newx=x[test,])
    

    11.Lasso

    拉索回归(lasso回归)本质上是针对线性回归问题引入了L1范数正则,通过缩减回归系数避免过拟合问题,其不同于L2范数,其可以将某些系数缩减为0即所谓的具备稀疏性(稀疏性的好处是简化计算、容易理解模型、减少存储空间、不容易出现过拟合等等)。

    为解决过拟合问题,可在损失函数的后面加上一个约束条件从而限制模型的复杂度,这个约束条件即为正则化项。

    不引入正则项的OLS的解很可能会不稳定,具体来说,两次不同的采样所采集到的训练数据,用于训练同一个线性回归模型,训练数据的些微差异,最终学出的模型差异可能是巨大的。

    最小二乘学习法的学习目标变为使学习结果的平方误差与正则化项的和最小。虽然这种方法对于预防过拟合非常有效,但当学习模型中的参数特别多时,求解各参数需要花费大量的时间。因此,一种能够把大部分参数都设置为0的学习方法便被提出,就是稀疏学习,Lasso回归就是典型的稀疏学习。

    岭回归一个显著的劣势在于:最优子集选择、向前逐步回归和向后逐步回归通常会选择出变量的一个子集进行建模,而岭回归的最终模型包含全部的p 个变量。这种设定不影响预测精度,但是当变量个数p 非常大时,不便于模型解释。lasso 是一种近年来常用的用于克服岭回归上述缺点的方法。

    与岭回归相同,lasso也将系数估计值往 0 的方向进行缩减。然而,当调节参数λ足够大时,惩罚项具有将其中某些系数的估计值强制设定为 0 的作用。因此,与最优子集选择方法相似,lasso也完成了变量选择。故而 lasso建立的模型与岭回归建立的模型相比更易于解释。 所以说 lasso得到了稀疏模型——只包含所有变量的一个子集的模型。

    一般情况下,当一小部分预测变量是真实有效的而其他预测变量系数非常小或者等于零时, lasso 要更为出色,当响应变量是很多预测变量的函数并且这些变量系数大致相等时,岭回归较为出色。

    L1范数罚有一个问题:由于函数在0处不可导,故而直接使用最
    小二乘法、梯度下降法等方法均失效,但是由于其为第一类间断点中的可去间断点,可以通过补充该点的定义解决,通常,对于线性回归中的lasso回归可以采用近似的向前逐步回归替代。

    lasso.mod=glmnet(x[train,],y[train],alpha=1,lambda = grid)
    #为了拟含一个lasso模型,本实验将再一次使用 glmnet ()函数;alpha=0拟合岭回归,alpha=1拟合lasso
    

    12.弹性网

    ElasticNet 是一种使用L1和L2先验作为正则化矩阵的线性回归模型.这种组合用于只有很少的权重非零的稀疏模型,比如:class:Lasso, 但是又能保持:class:Ridge 的正则化属性.我们可以使用 l1_ratio 参数来调节L1和L2的凸组合(一类特殊的线性组合)。

    当多个特征和另一个特征相关的时候弹性网络非常有用。Lasso 倾向于随机选择其中一个,而弹性网络更倾向于选择两个。

    library(msgps)
    #弹性网所需要的安装包
    fit2 <- msgps(X,y,penalty="enet",alpha=0.5) 
    #如果这里alpha=0就是LASSO
    

    13.主成分分析法

    主成分分析(principal component analysis,PCA)是一种降维技术,把多个变量化为能够反映原始变量大部分信息的少数几个主成分。

    设X有p个变量,为n*p阶矩阵,即n个样本的p维向量。首先对X的p个变量寻找正规化线性组合,使它的方差达到最大,这个新的变量称为第一主成分,抽取第一主成分后,第二主成分的抽取方法与第一主成分一样,依次类推,直到各主成分累积方差达到总方差的一定比例。

    主要原理:多变量统计方法,通过析取主成分显出最大的个别差异,也用来削减回归分析和聚类分析中变量的数目,可以使用样本协方差矩阵或相关系数矩阵作为出发点进行分析。通过对原始变量进行线性组合,得到优化的指标:把原先多个指标的计算降维为少量几个经过优化指标的计算(占去绝大部分份额)

    基本思想:设法将原先众多具有一定相关性的指标,重新组合为一组新的互相独立的综合指标,并代替原先的指标。

    pr.out=prcomp(USArrests,scale=TRUE) 
    #用prcomp()函数进行主成分分析,scale=TRUE对变量进行标准化处理
    pr.out$rotation 
    #rotation矩阵提供了主成分载荷信息,pr.out$rotation的列包含对应的主成分载荷向量
    pr.out$sdev
    #得出标准差
    pr.var=pr.out$sdev^2
    pr.var
    pve=pr.var/sum(pr.var)
    #计算每个主成分的方差解释比例
    plot(cumsum(pve),xlab="Principal Component",ylab="Cumulative Proportion of Variance Explained",ylim=c(0,1),type='b')
    #绘制每个主成分的累积PVE图
    

    14.ID3

    决策树是以什么标准来选择特征的? 这就是我们要说的决策树的关键步骤是分裂属性。

    所谓分裂属性就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。

    那么“纯度”的度量方法不同,也就导致了学习算法的不同,引出了我们的ID3算法,C4.5算法以及CART算法。不同的决策树算法有着不同的特征选择方案。ID3用信息增益,C4.5用信息增益率,CART用gini系数。

    ID3算法是一种贪心算法,用来构造决策树。ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性的标准,即在每个节点选取还尚未被用来划分的具有最高信息增益的属性作为划分标准,然后继续这个过程,直到生成的决策树能完美分类训练样例。

    在ID3中如果选择一个特征后,信息增益最大(信息不确定性减少的程度最大),那么我们就选取这个特征,也就是“最大信息熵增益”原则。
    虽然ID3比较灵活方便,但是有以下几个缺点:
    (1)采用信息增益进行分裂,分裂的精确度可能没有采用信息增益率进行分裂高
    (2)不能处理连续型数据,只能通过离散化将连续性数据转为离散型数据
    (3)不能处理缺省值
    (4)没有对决策树进行剪枝处理,很可能会出现过拟合的问题

    tdata<-data[train,]
    vdata<-data[-train,]
    library(rpart)
    #加载rpart函数建立决策树
    dtree=rpart(class~.,data=tdata,method = "class",parms = list(split="information"))
    #split=information表示使用ID3算法,若split="gini",则为CART算法。
    printcp(dtree)
    dtree$cptable
    tree=prune(dtree,cp=0.0125)
    #使用prune()来剪枝,决策树剪枝的目的就是为了得到更小交叉误差(xerror)的树,xerror最小时cp=0.01000
    tree$cptable
    #剪枝后的复杂度及分枝数
    library(rpart.plot)
    #画出树图
    par(mfrow=c(1,2))
    rpart.plot(dtree,branch=1,type=2, fallen.leaves=T,cex=0.75, sub="剪枝前")
    rpart.plot(tree,branch=1, type=4,fallen.leaves=T,cex=0.75, sub="剪枝后")
    #这里显示需要剪枝
    predtree<-predict(tree,newdata=vdata,type="class")   
    #利用测试集进行预测
    table(vdata$class,predtree,dnn=c("真实值","预测值"))    
    #输出混淆矩阵
    

    15.C4.5

    C4.5是Ross Quinlan在1993年在ID3的基础上改进而提出的。ID3采用的信息增益度量存在一个缺点,它一般会优先选择有较多属性值的特征,因为属性值多的特征会有相对较大的信息增益(信息增益是特征选择的一个重要指标,它定义为一个特征能够为分类系统带来多少信息,带来的信息越多,说明该特征越重要,相应的信息增益也就越大。)避免这个不足C4.5中是用信息增益比率来作为选择分支的准则,选择具有最大增益率的属性作为分裂属性。信息增益比率通过引入一个被称作分裂信息的项来惩罚取值较多的特征。除此之外,C4.5还弥补了ID3中不能处理特征属性值连续的问题。

    但是C4.5算法不直接选择增益率最大的候选划分属性,候选划分属性中找出信息增益高于平均水平的属性(这样保证了大部分好的的特征),再从中选择增益率最高的(又保证了不会出现编号特征这种极端的情况)。

    C4.5算法继承ID3算法的优点,并在以下几方面对ID3算法进行改进:

    1. 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足;
    2. 在树构造过程中进行剪枝;
    3. 能够完成对连续属性的离散化处理;
    4. 能够对不完整数据进行处理。
    library(rJava)
    library(JGR)
    library(RWeka) 
    ctree<-J48(class~.,data=tdata,control=Weka_control(M=2))
    print(ctree)
    library(partykit)
    #能够读取rweka的模型进行绘图
    plot(ctree,type="simple")
    #画出树图
    

    16.CART

    CART算法是在给定输入随机变量X条件下输出随机变量Y的条件概率分布 的学习方法。CART算法假设决策树是二叉树 ,内部节点特征的取值为“是”和“否”。这样的决策树等价于递归地二分每个特征,将输入空间/特征空间划分为有限个单元,然后在这些单元上确定在输入给定的条件下输出的条件概率分布。CART决策树的生成就是递归地构建二叉决策树的过程。

    相比ID3和C4.5,CART应用要多一些,可以用于分类,也可以用于回归;对回归树CART算法用平方误差最小化准则来选择特征,对分类树用基尼指数最小化准则选择特征。

    CART分类时,使用基尼指数(Gini)来选择最好的数据分割的特征,gini描述的是纯度,与信息熵的含义相似。CART中每一次迭代都会降低GINI系数, 算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的Gini系数小于预定阈值(样本基本属于同一类),或者没有更多特征。

    CART算法由以下两步组成:
    (1)决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
    (2)决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时损失函数最小作为剪枝的标准。

    总结如下:
    (1)CART是一棵二叉树,每一次分裂会产生两个子节点,对于连续性的数据,直接采用与C4.5相似的处理方法,对于离散型数据,选择最优的两种离散值组合方法。
    (2)CART既能是分类数,又能是二叉树。如果是分类树,将选择能够最小化分裂后节点GINI值的分裂属性;如果是回归树,选择能够最小化两个节点样本方差的分裂属性。
    (3)CART跟C4.5一样,需要进行剪枝,采用CCP(代价复杂度的剪枝方法)。

    dtree<-rpart(类别~.,data=tdata,method="class", parms=list(split="gini"))
    printcp(dtree)
    #cp是参数复杂度(complexity parameter)作为控制树规模的惩罚因子,简而言之,就是cp越大,树分裂规模(nsplit)越小。
    

    17.C5.0

    C5.0是一种多叉树(即如果根节点或中间节点存在连续型的自变量,则该变量会一分为二的展开两个分支;如果根节点或中间节点存在离散的自变量,则该变量会根据离散变量的水平数分开多个分支),就会导致某个变量一旦被使用,后面的节点将不会再启用该变量。

    C5.0决策树的生长过程采用的是最大信息增益率原则进行节点选择和分裂点的选择,只能解决分类问题。

    C5.0算法则是C4.5算法的修订版,适用于处理大数据集,通过构造多个C4.5算法,是一种boosting算法。准确率更高,又称为BoostingTrees,在软件上计算速度比较快,占用的内存资源较少。优点:在面对数据遗漏和输入字段很多的问题时非常稳健;通常不需要很长的训练次数进行估计;比一些其他类型的模型易于理解,模型推出的规则有非常直观的解释;也提供强大的增强技术以提高分类的精度。但是C5.0有规定就是目标字段一定得是分类字段。

    class_model<-C5.0(tdata[,-10],tdata$class)
    #defaul为类变量
    class.pred=predict(class_model,vdata)
    #预测测试集的分类情况
    library(gmodels)
    #加载gomdels包中的crosstable来绘制二维列联表
    CrossTable(vdata$class, class.pred,prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,dnn = c('actual default', 'predicted default'))
    plot(class_model)
    #画出决策树
    

    18.支持向量机

    19.K means 算法

    20.密度聚类

    DBSCAN是一种著名的密度聚类算法,它基于一组“邻域”参数来刻画样本分布的紧密程度。DBSCAN算法先任选数据集中的一个核心对象为“种子”,在由此出发确定相应的聚类簇,算法描述如下图所示。在第17行中,算法先根据给定的邻域参数找出所有核心对象;然后在第1024行中,以任一核心对象为出发点,找出由其密度可达的样本生成聚类簇,直到所有核心对象均被访问过为止。

    install.packages("fpc")
    library(fpc)
    iris2 <- iris[-5] 
    #从数据样本中剔除species属性
    ds<- dbscan(iris2, eps=0.42, MinPts=5)
    #eps是距离的半径,Minpts是最少多少个点
    table(ds$cluster, iris$Species)
    setosa versicolor virginica
      0 2  10 17
      1 48 0  0
      2 0  37 0
      3 0  3  33
    #上面的数据表中1到3为识别出来的3个聚类簇,0表示噪声数据或利群点,即不属于任何簇的对象
    plot(ds, iris2)
    
    plot(ds, iris2[c(1,4)])
    

    fpc包还提供了另一个展示聚类分析的函数plotcluster(),值得一提的是,数据将被投影到不同的簇中

    plotcluster(iris2, ds$cluster)
    

    21.层次聚类

    22.随机森林

    集成学习的基本思想:由多个学习器组合成一个性能更好的学习器(结合几个模型降低泛化误差),集成学习为什么有效?不同的模型通常会在测试集上产生不同的误差。平均上,集成模型至少能与其一成员表现一致;并且如果成员的误差是独立的,集成模型将显著地比其成员表现更好。

    关于集成学习算法的分类,一般是基于个体学习器之间的依赖关系,若有着强依赖关系、必须串连生成的序列化方法,一般指boosting方法;而不存在强依赖关系,可以同时生成的并行化方法,有bagging和随机森林等;

    随机森林就是用随机的方式建立一个森林,森林里面有很多的决策树,并且每棵树之间是没有关联的。得到一个森林后,当有一个新的样本输入,森林中的每一棵决策树会分别进行一下判断,进行类别归类(针对分类算法),最后比较一下被判定哪一类最多,就预测该样本为哪一类。 随机森林算法有两个主要环节:决策树的生长和投票过程。

    随机森林实际上是一种特殊的bagging方法,它将决策树用作bagging中的模型。首先,用bootstrap方法生成m个训练集,然后,对于每个训练集,构造一颗决策树,在节点找特征进行分裂的时候,并不是对所有特征找到能使得指标(如信息增益)最大的,而是在特征中随机抽取一部分特征,在抽到的特征中间找到最优解,应用于节点,进行分裂。随机森林的方法由于有了bagging,也就是集成的思想在,实际上相当于对于样本和特征都进行了采样(如果把训练数据看成矩阵,就像实际中常见的那样,那么就是一个行和列都进行采样的过程),所以可以避免过拟合。

    23.Bagging

    Bagging用于估计整个统计模型,最常见的是决策树。获取训练数据的多个样本,然后为每个数据样本构建模型。当需要对新数据进行预测时,每个模型都会进行预测,并对预测进行平均以更好地估计真实输出值。

    Bagging是并行式集成学习方法最著名的代表,算法如下:
    循环K次,每次都从样本集D中有放回地抽取样本集Di,这样总共得到K个样本集,用这K个样本集进行决策树生成,获得K个决策树模型,再将要检测的数据用这K个决策树模型进行多数表决,获得票数多的结论。

    Bagging要求"不稳定"(不稳定是指数据集较小的变动使得分类结果显著的变动)的分类方法,主要关注降低方差,因此在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显。

    install.packages("ipred")
    #R语言中用于bagging算法实现的是ipred包
    library(ipred)
    attach(iris)
    model=bagging(Species~.,data=iris)
    #建立bagging分类模型
    pre.bagging = predict(model,iris)
    #查看模型的预测结果
    a=table(pre.bagging,iris$Species)
    #生成混淆矩阵 
    #最终输出的是表格形式的,纵向表示三种花种的真实属类,横向表示采用决策树之后的预测属类。可以看出,bagging分类将1个Versicolor误分为Virginica
    pre.bagging  setosa versicolor virginica
      setosa          50         0          0
      versicolor      0         49         0
      virginica       0          1         50
    e=(sum(a)-sum(diag(a)))/sum(a)
    #计算误差率
    

    24. AdaBoost

    Boosting 是一种集合技术,试图从许多弱分类器中创建一个强分类器。这是通过从训练数据构建模型,然后创建第二个模型来尝试从第一个模型中纠正错误来完成的。添加模型直到完美预测训练集或添加最大数量的模型。Boosting 基于 串行策略:基学习器之间存在依赖关系,新的学习器需要依据旧的学习器生成。

    AdaBoost 是第一个为二进制分类开发的真正成功的增强算法。这是理解助力的最佳起点。现代助推方法建立在 AdaBoost 上,最着名的是随机梯度增强机。

    AdaBoost 用于短决策树。在创建第一个树之后,每个训练实例上的树的性能用于加权创建的下一个树应该关注每个训练实例的注意力。难以预测的训练数据被赋予更多权重,而易于预测的实例被赋予更少的权重。模型是一个接一个地顺序创建的,每个模型更新训练实例上的权重,这些权重影响序列中下一个树所执行的学习。构建完所有树之后,将对新数据进行预测,并根据训练数据的准确性对每棵树的性能进行加权。 因为通过算法如此关注纠正错误,所以必须删除带有异常值的干净数据。

    AdaBoost是英文"Adaptive Boosting"(自适应增强)的缩写,它的自适应在于:前一个基本分类器被错误分类的样本的权值会增大,而正确分类的样本的权值会减小,并再次用来训练下一个基本分类器。同时,在每一轮迭代中,加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数才确定最终的强分类器。

    Adaboost算法可以简述为三个步骤:
    (1)首先,是初始化训练数据的权值分布D1。假设有N个训练样本数据,则每一个训练样本最开始时,都被赋予相同的权值:w1=1/N。
    (2)然后,训练弱分类器hi。具体训练过程中是:如果某个训练样本点,被弱分类器hi准确地分类,那么在构造下一个训练集中,它对应的权值要减小;相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
    (3)最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。

    install.packages('adabag') 
    library(adabag)
    a=boosting(Species~.,data=iris) 
    #建立adaboost模型
    z0=table(iris[,5],predict(a,iris)$class) 
    #查看模型的预测结果,模型的预测结果全部正确:
    z0
                 Setosa   versicolor   virginica
      setosa         50          0          0
      versicolor     0         50          0
      virginica      0          0          50
    E0=(sum(z0)-sum(diag(z0)))/sum(z0) 
    #计算误差率
    E0
    [1] 0
    barplot(a$importance) 
    #画出变量重要性图
    #上图可知各变量的重要性分别为:Petal.Length>Petal.Width>Sepal.Length>Sepal.Width
    b <- errorevol(a,iris) 
    #计算全体误差演变
    plot(b$error,type="l",main="AdaBoost error vs number of trees")
    

    25.XGBoost

    XGBoost(eXtreme Gradient Boosting)是"极端梯度上升"(Extreme Gradient Boosting)的简称, 它类似于梯度上升框架,但是更加高效,是工业界逐渐风靡的基于GradientBoosting算法的一个优化的版本,可以给预测模型带来能力的提升。

    它兼具线性模型求解器和树学习算法。因此,它快速的秘诀在于算法在单机上也可以并行计算的能力。这使得xgboost至少比现有的梯度上升实现有至少10倍的提升。它提供多种目标函数,包括回归,分类和排序。由于它在预测性能上的强大但是相对缓慢的实现,"xgboost" 成为很多比赛的理想选择。它还有做交叉验证和发现关键变量的额外功能。在优化模型时,这个算法还有非常多的参数需要调整。

    XGBoost仅适用于数值型向量,需要将所有其他形式的数据转换为数值型向量。

    相关文章

      网友评论

        本文标题:统计学习基础复习浓缩版

        本文链接:https://www.haomeiwen.com/subject/lnvdeqtx.html