下面的代码参考http://blog.youkuaiyun.com/xxzhangx/article/details/54729055来获取解释:
library(mxnet)
data(BostonHousing, package="mlbench")
str(BostonHousing)dim(BostonHousing)
train.ind = seq(1, 506, 3)
train.x = data.matrix(BostonHousing[train.ind, -14])
train.y = BostonHousing[train.ind, 14]
test.x = data.matrix(BostonHousing[-train.ind, -14])
test.y = BostonHousing[-train.ind, 14]
# 定义输入数据
data <- mx.symbol.Variable("data")
# 完整连接的隐藏层
# data: 输入源
# num_hidden: 该层的节点数
fc1 <- mx.symbol.FullyConnected(data, num_hidden=1)
# 针对回归任务,定义损失函数
lro <- mx.symbol.LinearRegressionOutput(fc1)
mx.set.seed(7)
model <- mx.model.FeedForward.create(lro, X=train.x, y=train.y, ctx=mx.cpu(), num.round=50, array.batch.size=20,
learning.rate=2e-6, momentum=0.9, eval.metric=mx.metric.rmse)#用相对误差来做损失函数
#或者自定义损失函数为均方差
demo.metric.mae <- mx.metric.custom("mae", function(label, pred) {
res <- mean(abs(label-pred))
return(res)
})
mx.set.seed(7)
model <- mx.model.FeedForward.create(lro, X=train.x, y=train.y, ctx=mx.cpu(), num.round=50, array.batch.size=20,
learning.rate=2e-6, momentum=0.9, eval.metric=demo.metric.mae)#用均方差来做损失函数
————————————————————————————————
开头提到的链接到以上就没了下文,只训练了模型,却没有把模型用来预测,本文对预测结果做出补充:
preds = predict(model, test.x) #利用训练的模型预测测试集y
#接下来做出预测值与测试集实际值的图像
t<-as.data.frame(test.y)
for( i in 1:337)
{
t[i,2]<-preds[1,i]
}
t[,3]<-c(1:337)
library(ggplot2)
ggplot(t,aes(group=V3))+geom_line(data=t,aes(group=1,V3,test.y),colour="green")->q
q+geom_line(data=t,aes(group=1,V3,V2),colour="red")
表面看上去,预测的效果还是可以的,虽然数值在某些地方有很大差距,但走势看上去拟合的还不错,但究竟如何呢,我们用数据说话:
#计算趋势预测准确率
a<-c(-1:-336)
for(i in 1:336)
{
if((t[i+1,1]-t[i,1])*(t[i+1,2]-t[i,2])>0){a[i]<-1}
else a[i]<-0
}
length(which(a==1))
得到如下结果:
[1] 192
336个趋势只预测成功了192个,正确率只有0.5714286,可见效果并不理想,同前一篇文章一样,mxnet给出的官方案例可以说是让人很失望了,虽然如此,但也不得不说,案例中没有出现设置隐藏层层数的参数,不知道是不是这个原因导致模型没有调整好还是数据规模或者数据数量不行导致效果如此之差。
笔者小白一个,文中如有错误,欢迎大家在评论区指正