【问题标题】:Performing SVM regression with Test and training sets in R在 R 中使用测试集和训练集执行 SVM 回归
【发布时间】:2018-12-29 12:53:24
【问题描述】:

我有一个包含 100 个观察值的响应变量,我希望通过使用超级向量回归使用 8 个自变量来估计它们。

为了在 R 中使用训练和测试集实现我的 SVR,我进行了很多搜索以找到一个模板,但我找不到我想要的方式。

我已经使用以下代码来拟合模型并计算 RMSE,但我想检查我的模型是否有未见过的数据,我不知道如何在 R 中执行此操作。

我的代码如下:

data<-read.csv("Enzyme.csv",header = T)
Testset <- data[c(11:30),]
Trainset <- data[-c(11:30), ]
#attached dependent variable
Y<-Trainset$Urease
Trainset<-Trainset[,-c(1)]
SVMUr <- svm (Urease~., data=Trainset, kernel="radial",gamma= 
1,epsilon=seq(0,1,0.1), cost=10)
summary(SVMUr)

################### RMSE SVMUr ##########################
RMSE <- function(observed, predicted){
  sqrt(mean((predicted - observed)^2, na.rm=TRUE))
}
RMSE(observed =Y,predicted = predSVMUr)

######## Check the model for unseen data via using testset ###### 
predicted_test <- predict(SVMUr, Testset[,-1])
RMSE(Testset$Urease, predicted_test) 

【问题讨论】:

    标签: r regression svm


    【解决方案1】:

    您想要测试模型的方式是:

    1. 首先使用predict(SVMUr, Testset[,-1]) 将您的模型应用于看不见的数据,假设第一个变量是您的目标响应Y。例如,如果是第 15 个变量,请将 -1 替换为 -15。
    2. 现在使用 RMSE() 函数获取测试数据集上模型的 RMSE

    其他建议: 我不会按照您的方式拆分数据,因为正如您所指出的,与测试数据相关的训练数据太少。如果你想把它分成80%-20%,你可以从我下面的代码中调整:

    data<-read.csv("Enzyme.csv",header = T)
    
    split_data <- sample(nrow(data), nrow(data)*0.8)
    Trainset <- data[split_data, ]
    Testset <- data[-split_data, ]
    

    这会将 80% 的数据放入训练集中,将 20% 放入测试集中。


    其余代码:

    SVMUr <- svm (Urease~., data=Trainset, kernel="radial",gamma= 
    1,epsilon=seq(0,1,0.1), cost=10)
    summary(SVMUr)
    
    ################### RMSE SVMUr ##########################
    RMSE <- function(observed, predicted){
      sqrt(mean((predicted - observed)^2, na.rm=TRUE))
    }
    RMSE(observed =Trainset$Urease, predicted = predSVMUr)
    
    ######## Check the model for unseen data via using testset ###### 
    predicted_test <- predict(SVMUr, Testset[,-1])
    RMSE(Testset$Urease, predicted_test) 
    

    【讨论】:

    • 亲爱的,我已经按照你说的编辑了代码并重写了整个代码,想问你这段代码是否一切正常?我认为这可能是正确的,但我认为我写得非常糟糕。如果测试集的结果不如我们作为训练集,那么还有一个问题,是否有可能改善结果?例如,使用不同的测试不只是选择一个??
    • 您不应编辑您的问题以包含答案,因为这可能会混淆其他 StackOverflow 用户登陆此线程。 :) 你可能想参考我上面的代码——因为你在做svm (Urease~., data=Trainset),所以不需要像你刚刚对Trainset&lt;-Trainset[,-c(1)]所做的那样删除第一个变量。
    • 哦,对不起,我不知道 :(。另一个问题是我应用了这个,但测试集的 RMSE 比训练集大得多,在这种情况下是不可接受的。我想知道是否有是一种改进测试集中结果的方法,例如,使用另一行观察而不是选择的那一行 Testset
    • 不用担心@morteza;很高兴能帮助你。额外的问题应该作为单独的 StackOverflow 问题发布,但为了简洁地回答,一般规则是使用 80% 的数据作为训练,20% 作为测试;这只是一般的经验法则,但更多的训练数据 = 更好的模型,所以我建议这样做。
    • 没问题 - 我编辑了答案以帮助您使用 80%-20% 拆分来划分训练集和测试集。但是,如果您愿意,可以将其更改为 75-25,例如将 0.8 替换为 0.75。如果可以解决您的问题,请随时接受答案。
    猜你喜欢
    • 2015-04-10
    • 2014-05-20
    • 2015-01-21
    • 2016-03-22
    • 2019-03-02
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    相关资源
    最近更新 更多