获取线性SVM回归线的方程

3

我正在努力寻找一种方法来获取线性SVM模型在回归情况下的方程,因为大多数问题都涉及分类...我已经使用caret包进行了拟合。

1- 单变量情况

set.seed(1)
fit=train(mpg~hp, data=mtcars, method="svmLinear")
plot(x=mtcars$hp, y=predict(fit, mtcars), pch=15)
points(x=mtcars$hp, y=mtcars$mpg, col="red")
abline(lm(mpg~hp, mtcars), col="blue")

这将给出红色=实际值,黑色=拟合值的情节,而蓝线是经典回归。在这种情况下,我知道我可以手动计算SVM预测线从2个点,但是否有一种方法直接从模型结构获取方程?实际上,我需要像这样的方程 y=a+bx(这里mpg=?+?*hp)以原始比例中的值。

enter image description here

2-多元

同样的问题,但有两个因变量(mpg~hp+wt) 谢谢,

1个回答

4

是的,我相信有。看一下this answer,它类似,但不使用caret库。如果您将svp = fit$finalModel添加到示例中,您应该几乎可以完全按照它来操作。我在下面的数据中应用了类似的技术。我对数据进行了缩放,以便在向量图上很好地适合,因为库在运行时缩放数据。

require(caret)

set.seed(1)
x = model.matrix(data=mtcars, mpg ~ scale(hp)) #set up data
y = mtcars$mpg

fit=train(x, y, method="svmLinear") #train

svp = fit$finalModel #extract s4 model object

plot(x, xlab="", ylab="")
w <- colSums(coef(svp)[[1]] * x[unlist(alphaindex(svp)),])
b <- b(svp)
abline(b/w[1],-w[2]/w[1], col='red')
abline((b+1)/w[1],-w[2]/w[1],lty=2, col='red')
abline((b-1)/w[1],-w[2]/w[1],lty=2, col='red')

enter image description here

而你的第二个问题:

x = model.matrix(data=mtcars, mpg ~ scale(hp) + scale(wt) - 1) #set up data
fit=train(x, y, method="svmLinear") #train

svp = fit$finalModel #extract s4 model object

plot(x, xlab="", ylab="")
w <- colSums(coef(svp)[[1]] * x[unlist(alphaindex(svp)),])
b <- b(svp)
abline(b/w[1],-w[2]/w[1], col='red')
abline((b+1)/w[1],-w[2]/w[1],lty=2, col='red')
abline((b-1)/w[1],-w[2]/w[1],lty=2, col='red')

enter image description here

编辑

上面的答案涉及绘制边界,而不是线性SVM回归线。要回答这个问题,一个简单的方法是提取预测值并绘制回归线。实际上,你只需要几个点就可以得到这条线,但为了简单起见,我使用了以下代码。

abline(lm(predict(fit, newdata=mtcars) ~ mtcars$hp), col='green')

或者

abline(lm(predict(fit) ~ mtcars$hp), col='green')

enter image description here


好的@danielson,感谢您的建议,但我还不满意,我真正想要的是svm回归线的y=a+b.x(或在第二种情况下是y=a+b.x1+c.x2)方程,以原始比例显示系数...这样我可以向客户展示...(在您的回答中,我不明白我的前两个二维图如何变成没有y轴的一维图..?) :-) - agenis
抱歉,我想我误解了问题,因为我正在绘制决策边界。模型系数未存储在对象中,因此最快/最简单/最清洁的方法是使用summary(lm(predict(fit) ~ mtcars$hp))获取它。您是否正在寻找一种直接从向量生成系数的方法? - danielson
好的,对预测向量上的“lm”操作是个不错的技巧。我之前没有想到过,谢谢你,这正是我需要的。如果你愿意,你可以将这个方法加入到你的答案中,我会接受它。 - agenis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接