我有一个Python代码,非常适合在数据集上执行k倍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
内核一起使用,如何在S中将SVR与该内核一起使用而不是SMV?
3)另外,在Python版本中,我使用random_state=42
(只是一个随机数)来生成折痕的分割,因此它使用了不同的折痕。但这在不同的执行过程中是一致的。如何在R中执行此操作?
4)最后,在Python中,我会在每次折叠的for循环内进行训练。我在R中也需要类似的东西,因为每次折叠后,我都想执行其他一些统计和计算。在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)
答案 0 :(得分:0)
1)caret::train
函数具有preProcess参数,该参数允许您选择预处理。有关更多详细信息,请参见?caret::train
。
2)svmRadial
有caret
可用。您可以在caret/train-models-by-tag上查看示例和所有可用的算法。
3)使用set.seed(123)
固定随机种子以保持一致性。您可以在训练对象(此处为results$trainingData
中访问训练折叠。
4)不要循环播放,直接通过火车对象访问您的弃牌并根据需要计算统计信息(请参见results$resample
)
5)mlr
也具有交叉验证,这取决于您喜欢哪种口味。
答案 1 :(得分:0)
在createFolds
包中检出caret
进行固定折叠。
有些代码可以修改,以适合您的特定建模案例;本示例将构建一个randomforest模型,但是您可以为SVM切换模型。如果您遵循软件包指南,则有一个链接(为方便起见,在此处复制:http://topepo.github.io/caret/train-models-by-tag.html#support-vector-machines)-7.0.47节列出了所有可用的SVM模型及其参数。请注意,您可能需要安装一些其他软件包,例如{{ 1}},以使用特定的模型。
有一个名为kernlab
的程序包,该程序包应允许您跨多个核(并行处理)创建可重现的模型,但是如果您要确保单核可能是我的经验中最好的方法。
rngtools
根据我的经验,插入符号可以很好地覆盖几乎所有基地。如果您还想预处理数据(例如居中,缩放),则再次需要函数folds <- 3
set.seed(42)
cvIndex <- createFolds(your_data, folds, returnTrain = T)
fit.control <- trainControl(method = "cv",
index = cvIndex,
number = folds,
classProbs = TRUE,
summaryFunction = twoClassSummary,
allowParallel = FALSE)
search.grid <- expand.grid(.mtry = c(seq.int(1:sqrt(length(your_data)))+1))
rfCaret <- train(your_data_x, your_data_y, method = "rf",
metric = 'ROC', ntree = 500,
trControl = fit.control, tuneGrid = search.grid,
)
-如果键入?train,则插入符号包中的详细信息-但例如,您会希望
preProcess
Caret的聪明之处在于,它可以了解是否已接受了预处理的输入,并将相同的缩放比例应用于您的测试数据集。
编辑-其他:未使用的参数问题 要回答有关未使用参数的后续问题-可能是因为您使用的是mtry这是一个随机森林参数。
这是一个简单的SVM版本:
preProcess(yourData, method = c("center", "scale"))
您不需要调整网格;插入符号将生成随机的一个。当然,如果您要测试特定的成本值,请按照与我对randomForests的.mtry参数相同的方式来创建自己。