求助:请教大神微商软件使用风险,如何使用R语言实现SVM的多分类?

苹果/安卓/wp
苹果/安卓/wp
积分 1947, 距离下一级还需 278 积分
权限: 自定义头衔, 签名中使用图片, 设置帖子权限, 隐身
道具: 彩虹炫, 雷达卡, 热点灯, 雷鸣之声, 涂鸦板, 金钱卡, 显身卡, 匿名卡, 抢沙发, 提升卡下一级可获得
权限: 设置回复可见道具: 沉默卡
购买后可立即获得
权限: 隐身
道具: 金钱卡, 雷鸣之声, 彩虹炫, 雷达卡, 涂鸦板, 热点灯
哼哼签到天数: 111 天连续签到: 2 天[LV.6]常住居民II
本帖最后由 hubifeng? 于
16:17 编辑
& & 本文分为三个部分:第一部分为原理及概念说明;第二部分为方法评价及应用;第三部分为R实现及参数说明。
一、原理及概念说明& & 支持向量机(SVM)是一种线性和非线性数据的分类方法,它使用非线性映射将原始数据映射到高维空间,在该空间内搜索最佳分离超平面。在线性可分的情况下,存在这样的超平面把空间中的类分开,并且该超平面与类的距离最大即最大边缘超平面,它等价于求解约束的凸二次最优化问题(在此不详述,请参考Reference),此时是在原输入空间(n维)内寻找最大边缘超平面;在线性不可分的情况下,可以允许个别样本分类错误,但需要借助非线性映射把原输入数据变换到高维空间,在该空间搜索最大边缘超平面(此时是线性的,可用二次最优化求解),将该超平面对应到原输入空间的非线性超平面。然而这个过程中的点积计算量极大,幸而二次最优化求解中含有训练元组的点积等价于核函数应用于原输入数据,这些核函数在原输入空间上产生非线性分类器,利用核函数不仅可以省略变换后数据元组上的点积计算,也避免了这种映射,此时仍在原输入空间计算,因此与非线性映射后的维度相比降低了不少。& & 软边缘(Soft Margin):即线性不可分情况下,允许个别样本跑到其它类别之中。但要使用参数来权衡两端,一个是要保持最大边缘的分离,另一个要使这种破例不能太离谱。这种参数就是对错误分类的惩罚程度C。& & 分离超平面(separating hyperplane):即将类进行分离的超平面,这样的超平面很多,而从超平面到其边缘的两侧距离最短且相等的超平面即为最大边缘超平面(Maximal Margin Hyperplane,MMH),它具有更高的泛化准确率,此时MMH到类的最近的训练元组即为支持向量(support vector)。& & 支持向量是最难分类(临界)的训练元组,给出了最多的分类信息,它定义了边缘及最大边缘超平面。因此,学习后的分类器的复杂度由支持向量数而不是数据维度刻画,SVM也不太容易过分拟合。过拟合的原因与不稳定性密切相关,改动一个或两个训练元组会引起大范围的决策边界的变化,但决策最大边缘超平面则相对比较稳定,只有当被增加或去除的训练元组是支持向量时,边缘才会变动。过度拟合的起因是边缘过分拟合。而支持向量通常只是训练元组中的极小部分,几乎不会发生过分拟合。& & 即使数据维度很高,具有少量支持向量的SVM可以具有很好的泛化性能。利用支持向量数可计算SVM分类器的期望误差率的上界,同样独立于数据维度。& & 支持向量机回归(SVR):是由SVM发展出来的回归方法,同样也有线性可分与不可分情况。与SVM的区别在于,目标是使预测误差最小化同时函数平面度最大化。这种权衡是通过设置参数C来控制。参数ε是在回归函数周围定义的一个管道,管道内的误差将被忽略。如果所有的训练元组都在宽度为2ε的管道内,算法输出一个位于最平的管道中央的函数,这个管道包含所有训练元组,这种情况下总误差为0。因此,ε控制了函数与训练元组的拟合程度。支持向量即在管道外或管道边缘的训练元组。
二、方法评价及应用& & SVM训练速度较慢;SVM能够对复杂的非线性边界建模,不容易过分拟合;SVM总能发现全局最优解。& & 在实践中,不可能事先判定一个数据集是否线性可分,因此可以先假设数据可分并验证,如果不成立再假设数据不可分。& & 如前所述,支持向量机可用于回归、分类和异常检验,前者即为支持向量机回归,后者为支持向量机分类。支持向量机应用在许多领域,包括手写数字识别、对象识别、演说人识别,以及基准时间序列预测检验。& & SVM的研究目标主要是提高训练和检验速度,使得SVM可以成为超大型数据集更可行的选择。其他问题包括,为给定的数据集确定最佳核函数,为多类问题找出更有效的方法。本帖隐藏的内容三、R实现及参数说明
kernlab包:
& & 函数ksvm()通过。Call接口,使用bsvm和libsvm库中的优化方法。对于分类,有C-SVM分类算法和v-SVM分类算法,同时还包括C分类器的有界约束的版本;对于回归,提供了ε-SVM回归算法和v-SVM回归算法;对于多类分类,有一对一(one-against-one)方法和原生多类分类方法。
& & 使用libsvm库中的优化方法。多分类通过一对一的投票机制(one-against-one voting scheme)实现。e1071包的tune()函数在指定的范围内选取合适的参数。
& & klaR对库SVMlight进行了简单的包装,提供了函数svmlight()以分类,可视化。Svmlight()支持C-SVM进行分类,ε-SVM进行回归;以一对所有(one-against-all)进行多类分类。SVMlight支持高斯核,多项式,线性和sigmoid核。Svmlight()的参数形式为字符串形式。
svmpath包:
& & svmpath包里的函数可用来选取支持向量机的cost参数C
& & 核函数:
Linear:使用它的话就成为线性向量机,效果基本等价于Logistic回归。但它可以处理变量极多的情况,例如文本挖掘。
Polynomial:n次多项式核函数,适用于图像处理问题。选择n的好方法是从1(一个线性模型)开始,然后递增至估计误差不再改进为止。通常,相当小的数目就足够了。
Radial basis,高斯核函数,最流行易用的选择。参数包括了sigma,其值若设置过小,会有过度拟合出现。
Sigmoid:反曲核函数,多用于神经网络的激活函数。
实践中,核函数的选择一般并不导致结果准确率的很大差别(也有特例!)。
& & 软边缘参数C:
#(1)支持向量机(SVM):
library(kernlab)
irismodel &- ksvm(Species ~ ., data = iris,& && && && &&&
& && && && && && && &type = &C-bsvc&, kernel = &rbfdot&,& && && && && && &&&
& && && && && && && &kpar = list(sigma = 0.1), C = 10,& && && && && && &&&
& && && && && && && &prob.model = TRUE)
irismodel
predict(irismodel, iris[c(3, 10, 56, 68, 107, 120), -5], type = &probabilities&)
#Ksvm支持自定义核函数。如
k &- function(x, y) { (sum(x * y) + 1) * exp(0.001 * sum((x - y)^2)) }
class(k) &- &kernel&
data(&promotergene&)
gene &- ksvm(Class ~ ., data = promotergene, kernel = k, C = 10, cross = 5)#训练
gene
#对于二分类问题,可以对结果用plot()进行可视化。例子如下
x &- rbind(matrix(rnorm(120), , 2), matrix(rnorm(120, mean = 3), , 2))
y &- matrix(c(rep(1, 60), rep(-1, 60)))
svp &- ksvm(x, y, type = &C-svc&, kernel = &rbfdot&, kpar = list(sigma = 2))
plot(svp)
library(e1071)
set.seed(1234)
ind&-sample(2,nrow(iris),replace=TRUE,prob=c(0.7,0.3)) #70%为训练集 30%为测试集
train&-iris[ind==1,]
test&-iris[ind==2,]
svm&-svm(train[,1:4],train[,5],type=&C-classification&,
& && && &cost=10,kernel=&radial&,probability=TRUE,scale=FALSE)
pred&-predict(svm,test[,1:4],decision.values=TRUE)
table(pred,test[,5])
library(e1071)
model &- svm(Species ~ ., data = iris,& && && && &
& && && && && &method = &C-classification&, kernel = &radial&,& && && && &&&
& && && && && &cost = 10, gamma = 0.1)
summary(model)
plot(model, iris, Petal.Width ~
& && & Petal.Length, slice = list(Sepal.Width = 3,& && && && && && && && && && &
& && && && && && && && && && && & Sepal.Length = 4))
pre=predict(model, iris,type='class')
table(pre,iris$Species)
library(&klaR&)
data(&B3&)
Bmod &- svmlight(PHASEN ~ ., data = B3,& && && && && && &
& && && && && && & svm.options = &-c 10 -t 2 -g 0.1 -v 0&)
predict(Bmod, B3[c(4, 9, 30, 60, 80, 120),& && && && &&&
& && && && && && & -1])
#(2)支持向量回归(SVR):
library(DMwR)
library(nnet)
data(algae)
algae &- algae[-manyNAs(algae), ]
clean.algae &- knnImputation(algae[,1:12],k=10)
norm.data &- scale(clean.algae[,4:12]) #数据标准化
library(e1071)
model.svm &- svm(a1~., norm.data)
preds &- predict(model.svm, norm.data)
plot(preds~ scale(clean.algae$a1))
library(rminer)
set.seed(1234)
svr&-fit(a1~., norm.data, model=&svm&)
#利用模型进行预测
norm.preds &- predict(svr, norm.data)
#绘制预测值与真实值之间的散点图
plot(norm.preds~ scale(clean.algae$a1))
#计算相对误差
(nmse2 &- mean((norm.preds-scale(clean.algae$a1))^2)/
& &mean((mean(scale(clean.algae$a1))- scale(clean.algae$a1))^2)) 复制代码Reference:
复杂数据统计方法——基于R的应用
数据挖掘:概念与技术
数据挖掘:实用机器学习技术
还需要加深理解的地方:1,凸二次最优化问题2,惩罚函数3,支持向量回归
支持楼主:、
购买后,论坛将把您花费的资金全部奖励给楼主,以表示您对TA发好贴的支持
载入中......
奖励积极上传好的资料
总评分:&经验 + 140&
学术水平 + 10&
热心指数 + 6&
本帖被以下文库推荐
& |主题: 264, 订阅: 12
& |主题: 19, 订阅: 15
很强大,学习了!
总评分:&经验 + 20&
写得不错& && && && && && && && && && && && && && &&&& && && && && && && && & & &
& && && && && && && && && && && && && &
& && && && && && && && && &&&& && && && && && && && &
& && && && && && && && && && && && && && && && && &&&
& && && &&&& && && && && &&&& && &&&& && && &
& && && && && && && & & && && && && && && && && && & & && && && &
& && && && && && && && && && && && && && && && && && && && && && && && && && && &
总评分:&经验 + 20&
我的处女贴
Have alook
支持向量机及其R实现
谢谢lz分享,大家一起学习进步,赞!
ddddddddddddddddddddd
看看,SVM很强大!
论坛好贴推荐
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
为做大做强论坛,本站接受风险投资商咨询,请联系(010-)
邮箱:service@pinggu.org
合作咨询电话:(010)
广告合作电话:(刘老师)
投诉电话:(010)
不良信息处理电话:(010)
京ICP证090565号
京公网安备号
论坛法律顾问:王进律师苹果/安卓/wp
苹果/安卓/wp
积分 105, 距离下一级还需 40 积分
权限: 自定义头衔
道具: 彩虹炫, 雷达卡, 热点灯, 雷鸣之声, 涂鸦板, 金钱卡, 显身卡下一级可获得
道具: 匿名卡
购买后可立即获得
权限: 隐身
道具: 金钱卡, 雷鸣之声, 彩虹炫, 雷达卡, 涂鸦板, 热点灯
无聊签到天数: 9 天连续签到: 1 天[LV.3]偶尔看看II
在用ksvm()函数对数据进行三分类,通过选择不同核函数、调整参数Cost和cross值后,训练误差和交叉检验误差发生变化。
在选择核函数与调整参数后,模型的训练结果达到什么样时可以接受呢?
在进行预测时,得到测试集的分类结果后,怎么求预测结果的F值?
并且预测结果可以可视化吗?plot只能对二分类的情况画图,那么在多分类的情况下有可视化功能吗?
初学SVM想试试看,关于多分类图形可视化问题,其他的SVM包可以实现吗?
感谢帮助!!
支持楼主:、
购买后,论坛将把您花费的资金全部奖励给楼主,以表示您对TA发好贴的支持
载入中......
论坛好贴推荐
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
为做大做强论坛,本站接受风险投资商咨询,请联系(010-)
邮箱:service@pinggu.org
合作咨询电话:(010)
广告合作电话:(刘老师)
投诉电话:(010)
不良信息处理电话:(010)
京ICP证090565号
京公网安备号
论坛法律顾问:王进律师苹果/安卓/wp
苹果/安卓/wp
积分 115, 距离下一级还需 30 积分
权限: 自定义头衔
道具: 彩虹炫, 雷达卡, 热点灯, 雷鸣之声, 涂鸦板, 金钱卡, 显身卡下一级可获得
道具: 匿名卡
购买后可立即获得
权限: 隐身
道具: 金钱卡, 雷鸣之声, 彩虹炫, 雷达卡, 涂鸦板, 热点灯
看师兄论文里面做的svm回归之前,先用tune.svm函数做了一个计算参数gamma和cost的最优值,请问这个是怎么设置的呢?原程序如下:
HOD_tunesvm &- tune.svm(HOD_Calibration[,1:5],HOD_Calibration[,6],gamma = 2^(-1:1), cost = 2^(2:4))#计算参数gamma和cost的最优值
HOD_svm &- svm(HOD_Calibration[,1:5],HOD_Calibration[,6],gamma = 0.5, cost = 4)#将上面计算的最优值代入svm模型
我试了试,如果不用这两个参数,直接最简单的svm(x,y),这样的话,误差比较大,而输入了最优参数滞后,相对误差明显降低了
支持楼主:、
购买后,论坛将把您花费的资金全部奖励给楼主,以表示您对TA发好贴的支持
载入中......
/questions//tuning-svm-parameters-in-r-linear-svm-kernel#_=_
热心帮助其他会员
总评分:&论坛币 + 20&
/questions//tuning-svm-parameters-in-r-linear-svm-kernel#_=_
本帖最后由 美楠 于
09:55 编辑
为什么设置tune.svm设置不同的参数,它每次计算的最优值都不一样呢,而且最优值下面有一个best performance,是根据这个值选那两个参数吗?下面是我运行的,红色的是不同的部分。
& cqsl_tunesvm &- tune.svm(cqsl.scale,cqsl[,21],gamma = 2^(-1:1), cost = 2^(2:4))
& cqsl_tunesvm
Parameter tuning of ‘svm’:
- sampling method: 10-fold cross validation
- best parameters:
gamma cost
& &0.5& & 8
- best performance: 0.
& cqsl_tunesvm &- tune.svm(cqsl.scale,cqsl[,21],gamma = 2^(-2:2), cost = 2^(2:8))
& cqsl_tunesvm
Parameter tuning of ‘svm’:
- sampling method: 10-fold cross validation
- best parameters:
gamma cost
&&0.25& & 4
- best performance: 0.
& cqsl_tunesvm &- tune.svm(cqsl.scale,cqsl[,21],gamma = 2^(-5:2), cost = 2^(2:8))
& cqsl_tunesvm
Parameter tuning of ‘svm’:
- sampling method: 10-fold cross validation
- best parameters:
& &gamma cost
0.03125& &16
- best performance: 0.
& cqsl_tunesvm &- tune.svm(cqsl.scale,cqsl[,21],gamma = 2^(-6:6), cost = 2^(2:8))
& cqsl_tunesvm
Parameter tuning of ‘svm’:
- sampling method: 10-fold cross validation
- best parameters:
& & gamma cost
0.015625& &32
- best performance: 0.
每次使用交叉验证时,划分的数据集是不一样的,因而训练出来的模型也是不一样的,如果要让每次都是同一个结果,需要在交叉验证前设置set.seed(),这样每次运行都能是同一个结果。
论坛好贴推荐
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
为做大做强论坛,本站接受风险投资商咨询,请联系(010-)
邮箱:service@pinggu.org
合作咨询电话:(010)
广告合作电话:(刘老师)
投诉电话:(010)
不良信息处理电话:(010)
京ICP证090565号
京公网安备号
论坛法律顾问:王进律师3574人阅读
机器学习中的一些方法如决策树,随机森林,SVM,神经网络由于对数据没有分布的假定等普通线性回归模型的一些约束,预测效果也比较不错,交叉验证结果也能被接受。下面以R中lars包包含数据集diabetes为例说明机器学习中的回归方法。
一、数据集及交叉验证办法描述
&&&&&&&&&&Diabetes数据集包含在R的lars包中,数据分为x,y,x2三个部分,因变量为y,数据是关于糖尿病的血液化验等指标。这个数据集最早被用在偏最小二乘回归的文章里。
&&&&&&&&&交叉验证采用指标NMSE来评价模型好坏。这一统计量是计算模型预测性能和基准模型的预测性能之间的比率。通常采用目标变量的平均值来作为基准模型。其取值范围通常为0~1。如果模型表现优于这个非常简单的基准模型预测,那么NMSE应明显小于1。NMSE的值越小,模型的性能就越好。NMSE的值大于1,意味着模型预测还不如简单地把所有个案的平均值作为预测值!
&&&&&&&交叉验证办法为将数据集分为5份,取4份作为训练集,1份作为测试集,共作5次,把误差平均起来作为衡量标准。选取代码如下:
二、回归树
&&&&&&&&决策树是通过一系列规则对数据进行分类的过程。它提供一种在什么条件下会得到什么值的类似规则的方法。决策树分为分类树和回归树两种,分类树对离散变量做决策树,回归树对连续变量做决策树。
&&&&&&基本算法:
1.选择一个属性放置在根节点,为每个可能的属性值产生一个分支
2.将样本划分成多个子集,一个子集对应于一个分支
3.在每个分支上递归地重复这个过程,仅使用真正到达这个分支的样本
4.如果在一个节点上的所有样本拥有相同的类别,即停止该部分树的扩展
&&&&&&构造决策树(集合划分)时选择属性:
1.ID3:Information Gain
2.C4.5:Gain Ratio
3.CART:Gini Index
&&&&&&&&&在R中我们使用rpart包中的rpart()函数实现树回归。我们先把rpart包中的两个十分重要的函数介绍如下:
&&&&&&&&构建回归树的函数:rpart()用法如下:
rpart(formula, data, weights, subset,na.action = na.rpart, method,
&&&&&model = FALSE, x = FALSE, y = TRUE, parms, control, cost, ...)
主要参数说明:
fomula回归方程形式:例如&y~x1+x2+x3。
data数据:包含前面方程中变量的数据框(dataframe)。
na.action缺失数据的处理办法:默认办法是删除因变量缺失的观测而保留自变量缺失的观测。
method根据树末端的数据类型选择相应变量分割方法,本参数有四种取值:连续型“anova”;离散型“class”;计数型(泊松过程)“poisson”;生存分析型“exp”。程序会根据因变量的类型自动选择方法,但一般情况下最好还是指明本参数,以便让程序清楚做哪一种树模型。
parms用来设置三个参数:先验概率、损失矩阵、分类纯度的度量方法。
control控制每个节点上的最小样本量、交叉验证的次数、复杂性参量:即cp:complexitypamemeter,这个参数意味着对每一步拆分,模型的拟合优度必须提高的程度,等等。
&&&&&&&&&&进行剪枝的函数:prune()用法如下:
prune(tree, cp, ...)
主要参数说明:
tree一个回归树对象,常是rpart()的结果对象。
cp复杂性参量,指定剪枝采用的阈值。cp全称为complexity parameter,指某个点的复杂度,对每一步拆分,模型的拟合优度必须提高的程度,用来节省剪枝浪费的不必要的时间,R内部是怎么计算的我不知道,希望读者能够补充。
运行代码:
&&&&&&&&得到回归树:
&&&&&&&&&&我们可以通过print(reg)来看到树的各个节点的细节。
&&&&&&&&&&我们来进行交叉验证,运行代码如下:
&&&&&&&&&R中输出结果:
[1] 0.....7238316
[1] 0.....3467186
&&&&&&&&&明显出现了过拟合现象,应该使用剪枝函数,对模型进行修正。
& reg$cptable
&&&&&&&&&&&CP &&&&&&&&&&&&&n &&&&&&split relerror&&&&xerror&&&&&&&xstd
1&&0.&&&&&&0 1...
2&&0.&&&&&&1 0...
3&&0.&&&&&&2 0...
4&&0.&&&&&&3 0...
5&&0.&&&&&&4 0...
6&&0.&&&&&&50...
7&&0.&&&&&&6 0...
8&&0.&&&&&&8 0...
9&&0.&&&&&&9 0...
10 0.&&&&&11 0.41336
11 0.&&&&&12 0.54043
12 0.&&&&&14 0.88835
13 0.&&&&&15 0.43535
14 0.&&&&&17 0.10011
&&&&&&&&参照上述结果,选择合适的cp值。故修正为:
&&&&&&&&结果为:
&&&&&&&&&&再次进行交叉验证(代码略)可以看到:
[1] 0.....6407927
[1] 0.....5233709
&&&&&&&&&&过拟合现象基本消除。
三、boosting回归
&&&&&&&&&&Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数。他是一种框架算法,主要是通过对样本集的操作获得样本子集,然后用弱分类算法在样本子集上训练生成一系列的基分类器。他可以用来提高其他弱分类算法的识别率,也就是将其他的弱分类算法作为基分类算法放于Boosting
框架中,通过Boosting框架对训练样本集的操作,得到不同的训练样本子集,用该样本子集去训练生成基分类器;每得到一个样本集就用该基分类算法在该样本集上产生一个基分类器,这样在给定训练轮数 n 后,就可产生 n 个基分类器,然后Boosting框架算法将这 n个基分类器进行加权融合,产生一个最后的结果分类器,在这 n个基分类器中,每个单个的分类器的识别率不一定很高,但他们联合后的结果有很高的识别率,这样便提高了该弱分类算法的识别率。
&&&&&&&&&Boosting方法简而言之就是采取少数服从多数的原理,他的合理性在于如果每个回归树的出错率为40%,那么1000棵决策树犯错误的概率就降到了4.40753e-11,这就比较小了。
&&&&&&&&对diabetes数据做boosting回归,使用到的函数包为mboost,使用函数为mboost.用法如下:
mboost(formula, data = list(),
&&&&&& baselearner = c(&bbs&, &bols&, &btree&, &bss&, &bns&), ...)
其中formular需要使用到函数btree():
btree(..., tree_controls = ctree_control(stump = TRUE,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& mincriterion = 0,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&savesplitstats = FALSE))
&&&&&& 试运行下列代码:
&&&&&&& 我们可以得到boosting回归的信息,通过plot函数还有可视化结果。
这里值得一提的是我在做boosting回归时为了减少工作量直接做了变量选择(这个选择与回归树的最终选择是一致的,所以也有一定的道理)。最后交叉验证的结果为:测试集NMSE为0.5513152,训练集NMSE为0.4656569。比起上次计算的回归树模型测试集NMSE为0.7036484,训练集NMSE为0.518876好了不少。
四、bagging回归
与boosting回归想法类似,bagging回归的做法就是不断放回地对训练样本进行再抽样,对每个自助样本都建立一棵回归树,对于每一个观测,每棵树给一个预测,最后将其平均。
对diabetes数据做bagging回归,使用到的函数包为ipred,使用函数为bagging(),用法如下:
bagging(formula, data, subset, na.action=na.rpart, ...)
主要参数介绍:
Formula:回归方程形式
Data:数据集
Control:对树枝的控制,使用函数rpart.control(),可以控制诸如cp值,xval等参量。
输入代码:
Baggingregression trees with 25 bootstrap replications&
Call:bagging.data.frame(formula = y ~ ., data = w, coob = TRUE, control =rpart.control(cp = 0.025))
Out-of-bagestimate of root mean squared error:&58.3648&
使用交叉验证(代码略),得到结果:测试集NMSE为0.5705753,训练集NMSE为0.3906232。比起上次计算的回归树模型测试集NMSE为0.7036484,训练集NMSE为0.518876好了不少。
五、随机森林回归
与bagging回归相比,随机森林则更进一步,不仅对样本进行抽样,还对变量进行抽样。
对diabetes数据做随机森林回归,使用到的函数包为randomForest,使用函数为randomForest(),用法如下:
randomForest(formula, data=NULL, ..., subset, na.action=na.fail)
这里值得一提的是,随机森林有个十分牛逼的性质,不会出现过拟合现象,这也省去了我们确定树的分类程度等一系列麻烦的事情。得到结果:测试集NMSE为0.,训练集NMSE为0.,效果显著提升。随机森林还可以输出自变量重要性度量,试运行代码:
得到结果:
&&&&&&&&&&&&&&&&%IncMSE IncNodePurity
x.glu&&&&&&&&68.8034199&&&&&
x2.age&&&&&&&22.6784331&&&&&
x2.sex&&&&&&&&6.2735713&&&&&&
x2.bmi&&&&&&&&&
x2.map&&&&&&331.3925059&&&&
x2.tc&&&&&&&&18.6080948&&&&&
x2.ldl&&&&&&&24.3690847&&&&&
x2.hdl&&&&&&216.2741620&&&&&
x2.tch&&&&&&419.0451857&&&&&
x2.ltg&&&&&&&&&
x2.glu&&&&&&&81.7568020&&&&&
x2.age.2&&&&&&1.5242836&&&&&
x2.bmi.2&&&&&75.6345112&&&&&
x2.map.2&&&&&&5.9156799&&&&&
x2.tc.2&&&&&&&1.6792683&&&&&
(省略部分输出)
其中第二列为均方误差递减意义下的重要性,第三列为精确度递减意义下的重要性。
六、其他的回归方法
除去我们所说的以上4种方法外,还有人工神经网络回归,SVM回归,他们可以通过nnet,rminer包中有关函数实现,这里我们从略。
在结束本文之前,我想我们可以做一件更有意义的事。在介绍diabetes数据集时,我们提到了这个数据最早是一个关于偏最小二乘的例子。那么想必他与这个模型的契合度还是不错的,我们可以尝试去算算利用偏最小二乘得到的训练集与测试集的NMSE。
代码如下:
运行结果:测试集NMSE为0.6094071,训练集NMSE为0.4031211。这里也仅仅是得到了一个优于回归树,与bagging回归相当,不如随机森林的一个结果。也说明了机器学习方法在实际问题中还是有一定优势的。但这绝不意味着这样的回归可以代替OLS,毕竟这些数据挖掘的方法在表达式的简洁程度,计算量等诸多方面还是存在着或多或少的不足。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:66424次
排名:千里之外
原创:25篇
转载:24篇
(3)(1)(1)(1)(2)(3)(1)(3)(1)(1)(1)(2)(12)(9)(2)(1)(1)(1)(3)

我要回帖

更多关于 大神微商软件使用风险 的文章

 

随机推荐