我有一个Python代码,可以很好地在数据集上执行k-fold CV。我的Python代码如下所示:
import pandas
import numpy as np
from sklearn.model_selection import KFold
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import SVR
from sklearn.utils import shuffle
# Load the dataset.
dataset = pandas.read_csv('values.csv')
# Preprocessing the dataset.
X = dataset.iloc[:, 0:8]
Y = dataset.iloc[:, 8] # The class value is the last column and is called Outcome.
# Scale all values to 0,1.
scaler = MinMaxScaler(feature_range=(0, 1))
X = scaler.fit_transform(X)
# 3-fold CV computation.
scores = []
svr_rbf = SVR(kernel='rbf', gamma='auto')
cv = KFold(n_splits=3, random_state=42, shuffle=False)
for train_index, test_index in cv.split(X):
X_train, X_test = X[train_index], X[test_index]
Y_train, Y_test = Y[train_index], Y[test_index]
svr_rbf.fit(X_train, Y_train)
scores.append(svr_rbf.score(X_test, Y_test))
现在,我想在R中重写同样的东西,我试着这样做:
library(base)
library(caret)
library(tidyverse)
dataset <- read_csv("values.csv", col_names=TRUE)
results <- train(Outcome~.,
data=dataset,
method="smvLinear",
trControl=trainControl(
method="cv",
number=3,
savePredictions=TRUE,
verboseIter=TRUE
))
print(results)
print(results$pred)
我的数据与此类似:https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data 除了这个有12个属性,第13列是类,在我的例子中有8个属性,第9列是类。但是,就价值而言,情况是相似的。你知道吗
现在,我可以看到打印的结果,但是有一些事情我不清楚。你知道吗
1)在我的Python代码中,我对值进行了缩放,在R中如何做到这一点?你知道吗
2)我已经将SVR与rbf
内核一起使用,如何在R中使用SVR与该内核而不是SMV一起使用?你知道吗
3)同样,在Python版本中,我使用random_state=42
(只是一个随机数)来生成折叠的拆分,因此它使用不同的折叠。但在不同的处决过程中是一致的。这在R怎么办?你知道吗
4)最后,在Python中,我在for循环中对每个fold进行训练。我也需要像这样的东西,因为每次折叠之后,我都想进行一些其他的统计和计算。你在R怎么做?你知道吗
5)我应该坚持caret
还是使用mlr
包?mlr
也做k倍变异吗?如果是,怎么做?你知道吗
编辑:
library(base)
library(caret)
library(tidyverse)
dataset <- read_csv("https://gist.githubusercontent.com/dmpe/bfe07a29c7fc1e3a70d0522956d8e4a9/raw/7ea71f7432302bb78e58348fede926142ade6992/pima-indians-diabetes.csv", col_names=FALSE)
print(dataset)
X = dataset[, 1:8]
print(X)
Y = dataset$X9
set.seed(88)
nfolds <- 3
cvIndex <- createFolds(Y, nfolds, returnTrain = T)
fit.control <- trainControl(method="cv",
index=cvIndex,
number=nfolds,
classProbs=TRUE,
savePredictions=TRUE,
verboseIter=TRUE,
summaryFunction=twoClassSummary,
allowParallel=FALSE)
rfCaret <- caret::train(X, Y, method = "svmLinear", trControl = fit.control)
print(rfCaret)
查看
createFolds
包中的caret
查看固定折叠。你知道吗下面是一些代码,您可以修改以适合您的特定建模情况;这个示例将构建一个randomforest模型,但是您可以为SVM切换模型。如果您遵循软件包指南,有一个链接(为了方便起见复制到这里:http://topepo.github.io/caret/train-models-by-tag.html#support-vector-machines)-第7.0.47节列出了所有可用的支持向量机模型及其应用参数。注释您可能需要安装一些附加软件包,如
kernlab
,以使用特定的模型。你知道吗有一个名为
rngtools
的包,它应该允许您跨多个核(并行处理)创建可复制的模型,但是如果您想确定,那么单核可能是我经验中最好的方法。你知道吗以我的经验,插入符号是相当不错的涵盖几乎所有基地。如果您还想预处理您的数据(例如,centre,scale)-那么您需要函数
preProcess
-如果您键入,请再次在插入符号包中输入详细信息?训练-但例如你想插入符号的聪明之处在于它能够理解是否接受了预处理的输入,并对测试数据集应用相同的缩放。你知道吗
编辑-附加:未使用的参数问题 回答关于未使用参数的后续问题-可能是因为您使用了mtry,这是一个随机林参数。你知道吗
下面是一个简单的SVM版本:
您不需要调整网格;插入符号将生成一个随机网格。当然,如果您想测试特定的成本值,那么您可以自己创建一个,方法与我对randomForests的.mtry参数所做的基本相同。你知道吗
1)
caret::train
函数有一个preProcess参数,允许您选择预处理。详见?caret::train
。你知道吗2)有
svmRadial
可用于caret
。您可以在caret/train-models-by-tag查看示例和所有可用的算法。你知道吗3)用
set.seed(123)
固定随机种子以保持一致性。您可以访问train对象中的training fold(results$trainingData
这里)。你知道吗4)不要循环,直接通过你的train对象访问你的折叠,如果需要,计算你的统计数据(参见
results$resample
)5)
mlr
也有交叉验证,这取决于你喜欢哪种口味。你知道吗相关问题 更多 >
编程相关推荐