Как выполнить k-кратное резюме в R? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть код 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 ядром, как я могу использовать SVR с этим ядром в R вместо 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)

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Проверьте createFolds в пакете caret для фиксированных сгибов.

Вот код, который вы можете изменить, чтобы соответствовать вашему конкретному случаю моделирования;В этом примере будет построена модель случайного леса, но вы можете переключить модель для SVM.Если вы следуете руководству по пакетам, есть ссылка (скопированная здесь для простоты: http://topepo.github.io/caret/train-models-by-tag.html#support-vector-machines) - в разделе 7.0.47 перечислены все доступные модели SVM и их параметры. Обратите внимание, что вам может потребоваться установить некоторые дополнительные пакеты, например 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,
)

По моему опыту, каретка довольно хороша для охвата практически всех баз. Если вы также хотите предварительно обработать свои данные (например, центр, масштаб) - тогда вы хотитефункция preProcess - опять же, детали в пакете каретки, если вы наберете? train - но, например, вам захочется

preProcess(yourData, method = c("center", "scale"))

Каретка умна в том смысле, что она понимает, что она приняла предварительно обработанный ввод, иприменяет такое же масштабирование к вашим наборам тестовых данных.

edit - дополнительные: проблема с неиспользованными параметрами Чтобы ответить на вашответьте на вопрос о неиспользуемых параметрах - возможно, вы используете mtry, который является случайным параметром леса.

Вот версия для простого SVM:

folds <- 3
set.seed(42)
cvIndex <- createFolds(dataset$Outcome, folds, returnTrain = T)

fit.control <- trainControl(method = "cv",
                            index = cvIndex,
                            number = folds,
                            classProbs = TRUE, 
                            summaryFunction = twoClassSummary,
                            allowParallel = FALSE)


SVMCaret <- train(Outcome ~ ., data = dataset, method = "svmLinear", 
                 metric = 'ROC', 
                 trControl = fit.control)

Вам не нужнотюнинг-сетка;Карета будет генерировать случайный.Конечно, если вы хотите проверить конкретные значения затрат, то создайте их самостоятельно так же, как я делал для параметра .mtry для randomForests.

0 голосов
/ 27 июня 2019

1) Функция caret::train имеет аргумент preProcess, который позволяет вам выбрать предварительную обработку.Подробнее см. ?caret::train.

2) Для caret доступно svmRadial.Вы можете посмотреть примеры и все доступные алгоритмы в caret / train-models-by-tag .

3) Исправьте случайное начальное число с помощью set.seed(123) для согласованности.Вы можете получить доступ к тренировочным фолдам в объекте поезда (results$trainingData здесь).

4) Не зацикливайтесь, получайте доступ к своим фолдам напрямую через ваш поездный объект и при необходимости вычисляйте свою статистику (см. results$resample)

5) mlr также имеет перекрестную проверку, это зависит от того, какой вкус вам нравится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...