R语言进行机器学习方法及实例(一).docx
R语言进行机器学习方法及实例(一)11月30日,2021亚马逊云科技re:Invent全球大会,即将浩大开启!2021re:Invent十周年度十分活动,内容的饕餮盛宴,涵盖产品、行业、社区等专题!立即预约版权声明本文为博主原创文章转载请注明出处机器学习的研究领域是创造计算机算法把数据转变为智能行为。机器学习以及数据挖掘的区别可能是机器学习侧重于执行一个已知的任务而数据开掘是在大数据中寻找有价值的东西。机器学习一般步骤采集数据将数据转化为合适分析的电子数据探究以及准备数据机器学习中许多时间花费在数据探究中它要学习更多的数据信息识别它们的微小差异基于数据训练模型根据你要学习什么的设想选择你要使用的一种或者多种算法评价模型的性能需要根据一定的检验标准改良模型的性能有时候需要利用更高级的方法有时候需要更换模型机器学习算法有监视学习算法用于分类k近邻朴素贝叶斯决策树规那么学习神经网络支持向量机用于数值预测线性回归回归树模型树神经网络支持向量机无监视学习算法用于形式识别数据之间联络的严密性关联规那么用于聚类k均值聚类R语言机器学习算法实现kNN(k-NearestNeighbors,k近邻)原理计算间隔找到测试数据的k个近邻根据k个近邻的分类预测测试数据的分类应用k近邻需要将各个特征转换为一个标准的范围归一化处理可以应用min-max标准化所有值落在01范围新数据原数据-最小值/最大值-最小值可以以应用z-score标准化新数据原数据-均值/标准差。对于名义变量表示类别可以进展哑变量编码其中1表示一个类别0表示其它类别对于n个类别的名义变量可以用n-1个特征进展哑变量编码比方高中低可以用高、中两类的哑变量表示这三类高1是0其它中1是0其它优点简单且有效对数据分布没有要求训练阶段很快缺点不产生模型在发现特征之间的关系上的才能有限分类阶段很慢需要大量的内存名义变量以及缺失数据需要额外处理R代码使用class包的knn函数对于测试数据中的每一个实例该函数使用欧氏间隔标识k个近邻然后选出k个近邻中大多数所属的那个类假如票数相等测试实例会被随机分配。dt_pred-knn(traindt_train,testdt_test,classdt_train_labels,k3)#train一个包含数值型训练数据的数据库test:一个包含数值型测试数据的数据框class训练数据每一行分类的一个因子变量k:标识最近邻数据的一个整数通常取实例数的平方根)该函数返回一个向量该向量含有测试数据框中每一行的预测分类尽管kNN是并没有进展任何学习的简单算法但是却能处理及其复杂的任务比方识别肿瘤细胞的肿块。对R自带iris数据用kNN进展训练、预测并与实际结果比照llibrary(class)library(gmodels)#preparedataset.seed(12345)#setrandomseedinordertorepeattheresultiris_rand-irisorder(runif(150),iris_z-as.data.frame(scale(iris_rand,-5)#zscorenormalizetrain-iris_z1:105,test-iris_z106:150,train.label-iris_rand1:105,5test.label-iris_rand106:150,5#kNNpred-knn(train,test,train.label,k10)#comfusionmatrixCrossTable(pred,test.label,prop.rF,prop.tF,prop.chisqF)这个结果显示kNN对测试数据全部预测正确朴素贝叶斯分类原理基于朴素贝叶斯定理根据先验概率计算预测实例的属于不同类别的总似然再将某类别的似然除以不同类别似然的以及得到预测实例在某类别的概率应用朴素贝叶斯算法每个特征必须是分类变量对于数值型变量可以将数值型特征离散化分段可以根据直方图查看数据明显的分隔点假如没有明显的分隔点可以使用三分位数四分位数五分位数分段太少会把重要信息丧失拉普拉斯估计对于某些从来没有出现的概率为0的会影响概率的估计拉普拉斯估计本质上是在概率表的每个计数加上一个较小的数这样保证每一类中每个特征发生的概率是非零的。优点简单、快速、有效能处理噪声数据以及缺失数据需要用来训练的例子相对较少但同样能处理好大量的例子很容易获得一个预测的估计概率值缺点依赖于一个常用的错误假设即一样的重要性以及独立特征应用在大量数值特征的数据集时并不理想概率的估计值相对于预测的类而言更加不可靠。R代码使用维也纳理工大学统计系开发的e1071添加包中的naiveBayesm-naiveBayes(train,class,laplace0)#train数据框或包含训练数据的矩阵class包含训练数据每一行的分类的一个因子向量laplace控制拉普拉斯估计的一个数值可以进展调节看是否会进步模型性能该函数返回一个朴素贝叶斯模型对象该对象可以用于预测p-predict(m,test,typeclass)#m:由函数naiveBays()训练的一个模型test数据框或包含测试数据的矩阵包含与用来建立分类器的训练数据的一样特征type:值为class或raw标识预测向量最可能的类别值或原始预测的概率值library(e1071)library(gmodels)set.seed(12345)#setrandomseedinordertorepeattheresultiris_rand-irisorder(runif(150),train-iris_rand1:105,-5test-iris_rand106:150,-5train.label-iris_rand1:105,5test.label-iris_rand106:150,5#tranformnumericalvariabletoclassifiedvariableconver_counts-function(x)q-quantile(x)sect1-which(q1xxq2)sect2-which(q2xxq3)sect3-which(q3xxq4)sect4-which(q4xxq5)xsect1-1xsect2-2xsect3-3xsect4-4return(x)train-apply(train,2,conver_counts)#naiveBayesm-naiveBayes(train,train.label,laplace1)pred-predict(m,test,typeclass)#comfusionmatrixCrossTable(pred,test.label,prop.rF,prop.tF,prop.chisqF)可见对第一类setosa分类上预测错误率很高这可能反映了朴素贝叶斯算法的缺点对于处理大量数值特征数据集时并不理想决策树原理以树形构造建立模型。使用一种称为递归划分的探究法。这种方法通常称为分而治之因为它利用特征的值将数据分解为具有相似类的较小的子集。从代表整个数据集的数据结点开场该算法选择最能预测目的类的特征然后这些案例将被划分到这一特征的不同值的组中这一决定形成了第一组树枝。该算法继续分而治之其他结点每次选择最正确的候选特征直到到达停顿的标准。假如一个节点停顿它可能具有以下情况节点上所有几乎所有的案例都属于同一类没有剩余的特征来分辩案例之间的区别决策树已经到达了预先定义的大小限制。C5.0算法时最知名的决策树算法之一单线程版本的源代码是公开的R中有编写好的该程序。C5.0算法已经成为生成决策树的行业标准因为它适用于大多数类型的问题并且可以直接使用。与其它先进的机器学习模型神经网络以及支持向量机相比一般表现的几乎一样并且更容易理解以及部署选择最正确的分割需要确立分割的标准有信息增益基尼系数卡方统计量以及增益比C5.0算法使用信息增益修剪决策树假如决策树增长过大将会使决策过于详细模型将会过度拟合训练数据解决这个问题的一种方法是一旦到达一定数量的决策或决策节点仅含有少量的案例我们就停顿树的增长这叫做提早停顿法或预剪枝决策树法。分为预剪枝提早规定树的大小以及后剪枝一旦树生长的过大就根据节点处的错误率使用修剪准那么将决策树减少到更适宜的大小通常比预剪枝更有效。自适应增强算法进展许屡次尝试在决策树中是建立许多决策树然后这些决策树通过投票表决的方法为每个案例选择最正确的分类。优点一个适用于大多数问题的通用分类器高度自动化的学习经过可以处理数值型数据、名义特征和缺失数据只使用最重要的特征可以用于只有相对较少训练案例的数据或有相当多训练案例的数据没有数学背景可以解释一个模型的结果对于比拟小的树比其他复杂的模型更有效缺点决策树模型在根据具有大量程度的特征进展划分时往往是有偏的很容易过度拟合或不能充分拟合模型因为依赖于轴平行分割所以在对一些关系建立模型时会有困难训练数据中的小变化可能导致决策逻辑的较大的变化大的决策树可能难以理解给出的决策可能看起来违背直觉。R代码使用R包C50的函数C5.0m-C5.0(train,class,trials1,costsNULL)#train:一个包含训练数据的数据框class包含训练数据每一行的分类的一个因子trials为一个可选数值用于控制自适应增强循环的次数默认值为1一般用10因为研究标明这能降低关于测试数据大约25%的概率costs为一个可选矩阵用于给出与各种类型错误相对应的本钱以及混淆矩阵略微不同行用来表示预测值列用来表示实际值函数返回一个C5.0模型对象该对象可以用于预测p-predict(m,test,typeclass)#m有函数C5.0()训练的一个模型test一个包含训练数据的数据框该数据框以及用来创立分类其的数据框有同样的特征type取值为class或prob,表识预测是最可能的类别值或是原始的预测概率该函数返回一个向量根据参数type的取值该向量含有预测的类别值或原始预测的概率值library(C50)library(gmodels)set.seed(12345)#setrandomseedinordertorepeattheresultiris_rand-irisorder(runif(150),train-iris_rand1:105,-5test-iris_rand106:150,-5train.label-iris_rand1:105,5test.label-iris_rand106:150,5#C50m-C5.0(train,train.label,trials10)pred-predict(m,test,typeclass)#comfusionmatrixCrossTable(pred,test.label,prop.rF,prop.tF,prop.chisqF)规那么学习分类原理规那么学习算法使用了一种称为独立而治之的探究法。这个经过包括确定训练数据中覆盖一个案例子集的规那么然后再从剩余的数据中别离出该分区。随着规那么的增加更多的数据子集会被别离直到整个数据集都被覆盖不再有案例残留独立而治之以及决策树的分而治之区别很小决策树的每个决策节点会受到过去决策历史的影响而规那么学习不存在这样的沿袭。随着规那么的增加更多的数据子集会被别离知道整个数据集都被覆盖不再有案例被保存单规那么1R算法ZeroR一个规那么学习算法从字面上看没有规那么学习对于一个未标记的案例不用考虑它的特征值就会把它预测为最常见的类单规那么算法1R或者OneR在ZeroR的根底上添加一个规那么。像K近邻一样固然简单但是往往表现的比你预期的要好。优点可以生成一个单一的、易于理解的、人类可读的经历法那么大拇指法那么表现往往出奇的好可以作为更复杂算法的一个基准缺点只使用了一个单一的特征可能会过于简单R代码使用R包RWeka中OneR()函数来实现1R算法m-OneR(classpredictors,datamydata)#class是mydata数据框中需要预测的那一列predictors为一个公式用来指定mydata数据框中用来进展预测的特征data为包含一个class以及predictors所要求的数据的数据框该函数返回一个1R模型对象该对象可以用于预测p-predict(m,test)#m:由函数OneR()训练的一个模型test一个包含测试数据的数据框该数据框以及用来创立分类器的训练数据有着一样的特征该函数返回一个含有预测的类别的向量library(RWeka)library(gmodels)set.seed(12345)#setrandomseedinordertorepeattheresultiris_rand-irisorder(runif(150),train-iris_rand1:105,test-iris_rand106:150,-5test.label-iris_rand106:150,5m-OneR(Species.,datatrain)pred-predict(m,test)CrossTable(pred,test.label,prop.rF,prop.tF,prop.chisqF)查看生成的规那么按照Petal的宽度分成三类正确分类了105个里面的101个对于测试数据的混合矩阵如下可见只使用了一个规那么也能也做到了不错的效果RIPPER算法对于复杂的任务只考虑单个规那么可能过于简单考虑多个因素的更复杂的规那么学习算法可能会有用但可以能因此会变得更加难以理解。早期的规那么学习算法速度慢并且对于噪声数据往往不准确后来出现增量减少误差修剪算法IREP使用了生成复杂规那么的预剪枝以及后剪枝方法的组合并在案例从全部数据集别离之前进展修剪。固然这进步了性能但是还是决策树表现的更好。直到1995年度出现了重复增量修剪算法RIPPER它对IREP算法进展改良后再生成规那么它的性能与决策树相当甚至超过决策树。原理可以笼统的理解为一个三步经过生长修剪优化。生长经过利用独立而治之技术对规那么贪心地添加条件直到该规那么能完全划分出一个数据子集或没有属性用于分割。与决策树类似信息增益准那么可用于确定下一个分割的属性当增加一个特指的规那么而熵值不再减少时该规那么需要立即修剪。重复第一步以及第二步直到到达一个停顿准那么然后使用各种探究法对整套的规那么进展优化。优点生成易于理解的、人类可读的规那么对大数据集以及噪声数据有效通常比决策树产生的模型更简单缺点可能会导致违背常理或者这专家知识的规那么处理数值型数据可能不太理想性能有可能不如复杂的模型R代码使用R包RWeka中JRip()函数是基于Java实现的RIPPER规那么学习算法mJRip(classpredictors,datamydata)#class是mydata数据框中需要预测的那一列predictors为一个R公式用来指定mydata数据框中用来进展预测的特征data为包含class以及predictors所要求的数据的数据框该函数返回一个RIPPER模型对象该对象可以用于预测。p-predict(m,test)#m由函数JRip()训练的一个模型test一个包含测试数据的数据框该数据框以及用来创立分类器的训练数据有同样的特征该函数返回一个含有预测的类别值的向量。library(RWeka)library(gmodels)set.seed(12345)#setrandomseedinordertorepeattheresultiris_rand-irisorder(runif(150),train-iris_rand1:105,test-iris_rand106:150,-5test.label-iris_rand106:150,5m-JRip(Species.,datatrain)pred-predict(m,test)CrossTable(pred,test.label,prop.rF,prop.tF,prop.chisqF)这次使用了三个规那么(Petal.Width1.8为virginicaPetal.Length3为versicolor其它为setosa可见固然增加了规那么但是并没有进步模型的性能预测数值型数据线性回归回归主要关注一个唯一的因变量需要预测的值以及一个或者多个数值型自变量之间的关系。假如只有一个自变量称为一元线性回归或简单线性回归否那么称为多元回归。原理对线性参数的估计使用最小二乘估计广义线性回归它们对线性模型进展了两方面的推广通过设定一个连接函数将响应变量的期望与线性变量相联络和对误差的分布给出一个误差函数。这些推广允许许多线性的方法可以被用于一般的问题。比方逻辑回归可以用来对二元分类的结果建模而泊松回归可以对整型的计数数据进展建模。优点迄今为止它是数值型数据建模最常用的方法可适用于几乎所有的数据提供了特征变量之间关系的强度以及大小的估计缺点对数据作出了很强的假设该模型的形式必须由使用者事先指定不能很好地处理缺失数据只能处理数值特征所以分类数据需要额外的处理需要一些统计学知识来理解模型。LASSO回归算法LASSO回归的特点是在拟合广义线性模型的同时进展变量挑选只选择对因变量有显著影响的自变量以及复杂度调整通过参数控制模型复杂度防止过度拟合。它通过惩罚最大似然来拟合广义线性模型正那么化途径是通过正那么化参数lambda的值的网格上计算lasso或弹性网络惩戒lambda越大对变量较多的线性模型的惩罚力度就越大进而最终获得一个变量较少的模型。R代码使用R包glmnet中glmnet()函数拟合LASSO回归模型glmnet(x,y,familyc(gaussian,binomial,poisson,multinomial,cox,mgaussian),weights,offsetNULL,alpha1,nlambda100,lambda.min.ratioifelse(nobsnvars,0.01,0.0001),lambdaNULL,standardizeTRUE,interceptTRUE,thresh1e-07,dfmaxnvars1,pmaxmin(dfmax*220,nvars),exclude,penalty.factorrep(1,nvars),lower.limits-Inf,upper.limitsInf,maxit100000,type.gaussianifelse(nvars500,covariance,naive),type.logisticc(Newton,modified.Newton),standardize.responseFALSE,type.multinomialc(ungrouped,grouped)x:输入矩阵每列表示变量特征每行表示一个观察向量也支持输入稀疏矩阵Matrix中的稀疏矩阵类y:反响变量对于gaussian或poisson分布族是相应的量对于binomial分布族要求是两程度的因子或两列的矩阵第一列是计数或是比例第二列是靶向分类对于因子来讲最后的程度是按照字母表排序的分类对于multinomial分布族能有超过两程度的因子。无论binomial或是multinomial假如y是向量的话会强迫转化为因子。对于cox分布族y要求是两列分别是time以及status后者是二进制变两1表示死亡0表示截尾survival包带的Surv()函数可以产生这样的矩阵。对于mgaussian分布族y是量化的反响变量的矩阵family:反响类型参数family规定了回归模型的类型:familygaussian适用于一维连续因变量(univariate)familymgaussian适用于多维连续因变量(multivariate)familypoisson适用于非负次数因变量(count),familybinomial适用于二元离散因变量(binary)familymultinomial适用于多元离散因变量(category)weights:权重观察的权重。假如反响变量是比例矩阵的话权重是总计数默认每个观察权重都是1offset:包含在线性预测中的以及观察向量同样长度的向量在poisson分布族中使用(比方log后的暴露时间)或是对于已经拟合的模型的重新定义(将旧模型的因变量作为向量放入offset中)。默认是NULL假如提供了值该值也必须提供应predict函数alpha:弹性网络混合参数0a1惩罚定义为(1-)/2|_22|_1.其中alpha等于1是lasso惩罚alpha等于0是ridge岭回归的惩罚nlambda:lambda值个数拟合出n个系数不同的模型lambda.min.ratiolambda的最小值lambda.max的比例形式比方全部系数都是0的时候的最小值。默认值依赖于观察的个数以及特征的个数假如观察个数大于特征个数默认值是0.0001接近0假如观察个数小于特征个数默认值是0.01。在观察值个数小于特征个数的情况下非常小的lambda.min.ratio会导致过拟合在binominal以及multinomial分布族性这个值未定义假如解释变异百分比总是1的话程序会自动退出lambda用户提供的lambda序列。一个典型的用法基于nlambada以及lambda.min.ratio来计算自身lambda序列。假如提供lambda序列提供的lambda序列会覆盖这个。需慎重使用不要提供单个值给lambda对于CV步骤后的预测应使用predict()函数替代。glmnet依赖于缓慢开场并且它用于拟合全途径比计算单个拟合更快standardize对于x变量是否标准化的逻辑标志倾向于拟合模型序列。系数总是在原有规模返回默认standardizeTRUE。假如变量已经是同一单位你可能并不能得到想要的标准化结果。intercept是否拟合截距默认TRUE或设置为0FALSEthresh坐标下降的收敛域值每个内部坐标下降一直进展循环直到系数更新后的最大改变值比thresh值乘以默认变异要小默认thresh为1E-7dfmax在模型中的最大变量数对于大量的变量数的模型但我们只需要局部变量时可以起到作用pmax限制非零变量的最大数目exclude要从模型中排除的变量的索引等同于一个无限的惩罚因子penalty.factor惩罚因子分开的惩罚因子可以应用到每一个系数。这是一个数字乘以lambda来允许不同的收缩。对于一些变量来讲可以是0意味着无收缩默认对全部变量是1对于列在exlude里面的变量是无限大。注意惩罚因子是内部对nvarsn个变量的以及进展重新调整并且lambda序列将会影响这个改变lower.limits对于每个系数的更低限制的向量默认是无穷小。向量的每个值须非正值。可以以以单个值呈现将会重复,或是nvars长度upper.limit对于每个系数的更高限制的向量默认是无穷大maxit所有lambda值的数据最大传递数type.gaussian支持高斯分布族的两种算法类型默认nvar500使用covariance“并且保存所有内部计算的结果。这种方式比naive快naive通过对nobsn个观察进展循环每次内部计算一个结果对于nvarnobs或nvar500的情况下后者往往更高效type.logistic假如是Newton“会使用准确的hessian矩阵默认当用的是modified.Newton“时只使用hession矩阵的上界会更快standardize.response这个参数时对于mgaussian“分布族来讲的允许用户标准化应答变量type.multinomial假如是grouped在多项式系数的变量使用分布lasso惩罚这样能确保它们完全在一起默认是ungrouped。glmnet返回S3类glmnet,*可以是elnetlognetmultnetfishnet(poisson)merlnetcall产生这个对象的调用;a0:截距beta:对于elnet,lognet,fishnet以及coxnet模型返回稀疏矩阵格式的系数矩阵(CsparseMatrix)对于multnet以及mgaussian模型返回列表包括每一类的矩阵lambda:使用的lambda值的实际序列当alpha0时最大的lambda值并不单单等于0系数原那么上labda等于无穷大相反使用alpha0.01的lambda由此导出lambda值dev.ratio表示由模型解释的变异的百分比对于elnet使用R-sqare。假如存在权重变异计算会参加权重变异定义为2x(loglike_sat-loglike)loglike_sat是饱以及模型每个观察值具有自由参数的模型的log似然。因此dev.ratio1-dev/nulldev越接近1讲明模型的表现越好nulldevNULL变异每个观察值这个定义为2*loglike_sat-loglike(Null)NULL模型是指截距模型除了Cox0模型df对于每个lambda的非零系数的数量。对于multnet这是对于一些类的变量数目dfmat仅适用于multnet以及mrelnet。一个包括每一类的非零向量数目的矩阵dim系数矩阵的维度nobs观察的数量npasses全部lambda值加以及的数据的总的通量offset逻辑变量显示模型中是否包含偏移jerr错误标记用来警告以及报错很大局部用于内部调试验而直接显示的结果有三列分别是df%Dev(就是dev.ratio)lambda是每个模型对应的值predict(object,newx,sNULL,typec(link,reponse,coefficients,nonzero,class),exactFALSE,offset,.)coef(object,sNULL,exactFALSE)objectglmnet返回的对象newx用来预测的矩阵可以以是系数矩阵这个参数不能用于typec(coefficents,nonzero)s惩罚参数lambda的值默认是用来创立模型的全部lambda值type预测值的类型link类型给binomial“multinomial,poisson或cov模型线性预测的值对于gaussian模型给拟合值。response类型对于binominal“以及multinomial给拟合的概率对于poisson“给拟合的均值对于cox给拟合的相对未及对于gaussion,response等同于link“类型。coefficients类型对于需求的s值计算系数。注意对于binomial模型来讲结果仅仅对因子应答的第二个程度的类返回。“class类型仅仅应用于binomial以及multinomial“模型返回最大可能性的分类标签。nonzero类型对每个s中的值返回一个列表其中包含非0参数的索引exact这个参数仅仅对于用于预测的slambda值不同于原始模型的拟合的值时这个参数起到作用。假如exactFALSE(默认)预测函数使用线性解释来对给的slambda值进展预测。这时一个非常接近的结果只是略微有点粗糙。假如exactTRUE,这些不同的s值以及拟合对象的lambda值进展sorted以及merged在作出预测之前进展模型的重新拟合。在这种情况下强烈建议提供原始的数据x以及y作为额外的命名参数给perdict()或coef()predict.glmnet()需要晋级模型并且期望用于创立接近它的数据。尽管不提供这些额外的参数它也会运行的很好在调用函数中使用嵌套序列很可能会中断。offset假如使用offset参数来拟合必须提供一个offset参数来作预测。除了类型coefficients或nonzero“.可以提供参数其它参数的机制比方xwhenexactTRUE,seeexact参数。library(glmnet)library(psych)#dummyvariableencodingiris$issetosa-ifelse(iris$Speciessetosa,1,0)iris$isversicolor-ifelse(iris$Speciesversicolor,1,0)iris_dt-iris,-5pairs.panels(iris_dt)#scatterplotmatrixpairs.panel画出散点图矩阵对角线上方显示的是变量之间的相关系数每个散点图中呈椭圆形的对象称为相关椭圆它提供一种变量之间是怎样亲密相关的可视化信息。位于椭圆中间的的点表示x轴变量以及y轴变量的均值所确定的点。两个变量之间的相关性由椭圆的形状表示椭圆越被拉伸其相关性就越强。散点图中绘制的曲线称为部分回归平滑它表示x轴以及y轴变量之间的一般关系。iris数据画出的散点图矩阵中的相关系数以及散点图曲线都可见Petal.Length以及Petal.Width有着强的相关性而从散点图曲线可以看出似乎Sepal.Length超出一定阈值后Sepal.Length增加Petal.Length也增加并且也以及品种是setosa或versicolor也有关系。以Petal.Width作为因变量作线性回归。library(glmnet)#dummyvariableencodingiris$issetosa-ifelse(iris$Speciessetosa,1,0)iris$isversicolor-ifelse(iris$Speciesversicolor,1,0)#dividedintotrainingsetsandtestsetsset.seed(12345)#setrandomseedinordertorepeattheresultiris_rand-irisorder(runif(150),train-iris_rand1:105,-c(4,5)test-iris_rand106:150,-c(4,5)train_value-iris_rand1:105,4test_value-iris_rand106:150,4#lassom_lasso-glmnet(as.matrix(train),train_value,familygaussian)plot(data.frame(dfm_lasso$df,dev.ratiom_lasso$dev.ratio),typeb,cex0.6)coef(m_lasso,s0.0497000)#mindf查看变量个数与模型解释变异百分比的点图发如今df1时已经开场平缓已经可以解释93%的变异。因此取df1的可以解释最大变异的lambda0.0452800查看系数发现使用了两个特征其中一个系数非常低并不是我们需要的因此lambda改为第二个解释最大变异的lambda0.0497000.用coef取出参数如下lambda0.0452800lambda0.0497000用选出的lambda值进展预测pred-predict(m_lasso,newxas.matrix(test),s0.0497000)summary(pred)summary(test_value)cor(test_value,pred)MAE-mean(abs(pred-test_value)mean(abs(mean(train_value)-test_value)发现预测值以及真实值范围非常接近相关系数高MAE(平均绝对误差反映预测值以及真实值的差距)仅为0.1981803假如只是拿训练集的均值预测的话MAE高达0.6551746综合以上的度量标准讲明我们的模型预测的不错。回归树以及模型树决策树用于数值预测分为两类第一类称为回归树第二类称为模型树。回归树作为分类回归树的一局部引入回归树并没有使用线性回归的方法而是基于到达节点的案例的平均值进展预测。模型树比回归树晚几年度引入但是或者许功能更加强大。模型树以及回归树以大致一样的方式生长但是在每个叶节点根据到达该节点的案例建立多元线性回归模型。根据叶节点的数目一棵模型树可能会建立几十个甚至几百个这样的模型这可能会使模型树更加难以理解但好处是它们也许能建立一个更加准确的模型。优点将决策树的优点与数值型数据建立模型的才能相结合能自动选择特征允许该方法以及大量特征一起使用不需要使用者事先指定模型拟合某些类型的数据可能会比线性回归好得多不要求用统计的知识来解释模型。缺点不像线性回归那样常用需要大量的训练数据难以确定单个特征对于结果的总体净影响可能比回归模型更难解释。原理用于数值预测的决策树的建立方式与用于分类的决策树的建立方式大致一样。从根节点开场按照特征使用分而治之的策略对数据进展划分在进展一次分割后将会导致数据最大化的均匀增长。而在分类决策树中一致性均匀性是由熵值来度量的而对于数值型的数据是未定义的对于数值型决策树一致性可以通过统计量比方方差、标准差或平均绝对偏向来度量。不同的决策树生长算法一致性度量可能会有所不同但原理是根本一样的。一种常见的分割标准是标准偏向减少就是原始值的标准差减去分割后不同类的数据加权后的标准差这里的加权就是该类的数目比上总的数目。决策树停顿生长后假设一个案例使用特征B进展分割落入某一组B1中那么该案例的预测值将取B1组的平均值。模型树要多走一步使用落入B1组的训练案例以及落入B2组的训练案例建立一个相对于其它特征特征A的线性回归模型。R代码在R包rpart递归划分中提供了像CART分类回归树团队中所描绘的最可靠的回归树的实现m.rpart-rpart(dviv,datamydata)#dv是mydata数据框中需要建模的因变量iv为一个R公式用来指定mydata数据框中的自变量data为包含变量dv以及变量iv的数据框p-predict(m,test,typec(vector,prob,class,matrix)#m是有函数rpart训练的一个模型test一个包含测试数据的数据框该数据框以及用来建立模型的数据具有一样的特征type给定返回的预测值的类型prob返回预测的概率。matrix返回矩阵的形式包括各类的概率。class返回树的分类。否那么返回一个向量的结果。可以使用R包rpart.plot中rpart.plot函数对回归树结果可视化。目前模型树中最先进的算法是M5算法可以通过R包Rweka中M5P函数实现m-M5P(dviv,datamydata)#dv是mydata数据框中需要建模的因变量iv为一个R公式用来指定mydata数据框中的自变量data为包含变量dv以及变量iv的数据框p-predict(m,test)#m是有函数rpart训练的一个模型test一个包含测试数据的数据框该数据框以及用来建立模型的数据具有一样的特征library(rpart)library(RWeka)library(rpart.plot)#dummyvariableencodingiris$issetosa-ifelse(iris$Speciessetosa,1,0)iris$isversicolor-ifelse(iris$Speciesversicolor,1,0)#dividedintotrainingsetsandtestsetsset.seed(12345)#setrandomseedinordertorepeatthe