Как выполнить произвольную проверку леса/креста в R

Я не могу найти способ выполнения перекрестной проверки на случайной модели регрессии, которую я пытаюсь создать.

Итак, у меня есть набор данных, содержащий 1664 объясняющих переменных (разные химические свойства) с одной переменной ответа (время удерживания). Я пытаюсь создать регрессирующую случайную модель леса, чтобы иметь возможность предсказать химические свойства чего-то, учитывая его время удерживания.

ID  RT (seconds)    1_MW    2_AMW   3_Sv    4_Se
4281    38  145.29  5.01    14.76   28.37
4952    40  132.19  6.29    11  21.28
4823    41  176.21  7.34    12.9    24.92
3840    41  174.24  6.7 13.99   26.48
3665    42  240.34  9.24    15.2    27.08
3591    42  161.23  6.2 13.71   26.27
3659    42  146.22  6.09    12.6    24.16

Это пример таблицы, которая у меня есть. Я хочу в основном построить RT против 1_MW и т.д. (До 1664 переменных), поэтому я могу найти, какая из этих переменных имеет значение, а какие нет.

Я: -

r = randomForest(RT..seconds.~., data = cadets, importance =TRUE, do.trace = 100)
varImpPlot(r)

который говорит мне, какие переменные важны, а что нет, что здорово. Тем не менее, я хочу, чтобы иметь возможность разбить мой набор данных, чтобы я мог выполнять перекрестные проверки на нем. Я нашел онлайн-учебник, в котором объяснялось, как это сделать, но для модели классификации, а не для регрессии.

Я понимаю, что вы: -

k = 10
n = floor(nrow(cadets)/k)
i = 1
s1 = ((i-1) * n+1)
s2 = (i * n)
subset = s1:s2

чтобы определить, сколько крестовых сгибов вы хотите сделать, и размер каждой складки, и установить начальное и конечное значение подмножества. Однако, я не знаю, что делать дальше. Мне сказали, что нужно пройти, но я честно понятия не имею, как это сделать. Я также не знаю, как затем построить набор проверки и набор тестов на один и тот же график, чтобы отобразить уровень точности/ошибки.

Если бы вы могли помочь мне с этим, я был бы так благодарен, спасибо!

Ответ 1

Это действительно быстрее, а также довольно легко сделать в Python, используя библиотеку scikit-learn (http://scikit-learn.org/stable/modules/cross_validation.html). Вы можете выполнить проверку K-fold, стратифицированную K-fold (которая обеспечивает равномерное распределение классов в каждой из складок), оставить один и другие.

Также очень легко генерировать кривую ROC, значения функций и другие оценочные показатели.

Вот пример:

y  = data[1:, 0].astype(np.float)
X  = data[1:, 1:].astype(np.float)
cv = StratifiedKFold(y, n_folds = 5)

precision   = []
accuracy    = []
sensitivity = []
matthews    = []
r2          = []
f1          = []
auroc       = []
cm          = [[0, 0], [0, 0]]

for i, (train, test) in enumerate(cv):
    probas_     = rf.fit(X[train], y[train]).predict_proba(X[test])
    classes     = rf.fit(X[train], y[train]).predict(X[test])
    r2          = np.append(r2, (r2_score(y[test], probas_[:, 1])))
    precision   = np.append(precision, (precision_score(y[test], classes)))
    auroc       = np.append(auroc, (roc_auc_score(y[test], classes)))
    accuracy    = np.append(accuracy, (accuracy_score(y[test], classes)))
    sensitivity = np.append(sensitivity, (recall_score(y[test], classes)))
    f1          = np.append(f1, (f1_score(y[test], classes)))
    matthews    = np.append(matthews, (matthews_corrcoef(y[test], classes)))
    cma         = np.add(cma, (confusion_matrix(y[test], classes)))

cma         = np.array(cma)
r2          = np.array(r2)
precision   = np.array(precision)
accuracy    = np.array(accuracy)
sensitivity = np.array(sensitivity)
f1          = np.array(f1)
auroc       = np.array(auroc)
matthews    = np.array(matthews)

print("KF Accuracy: %0.2f (+/- %0.2f)" % (accuracy.mean(), accuracy.std() * 2))
print("KF Precision: %0.2f (+/- %0.2f)" % (precision.mean(), precision.std() * 2))
print("KF Sensitivity: %0.2f (+/- %0.2f)" % (sensitivity.mean(), sensitivity.std() * 2))
print("KF R^2: %0.2f (+/- %0.2f)" % (r2.mean(), r2.std() * 2))
print("KF F1: %0.2f (+/- %0.2f)" % (f1.mean(), f1.std() * 2))
print("KF AUROC: %0.2f (+/- %0.2f)" % (auroc.mean(), auroc.std() * 2))
print("KF Matthews: %0.2f (+/- %0.2f)" % (matthews.mean(), matthews.std() * 2))
print("Confusion Matrix", cma)

Ответ 2

Из источника :

Оценка погрешности вне сумки (oob)

В случайных лесах нет необходимости в перекрестной проверке или отдельной набор тестов, чтобы получить несмещенную оценку ошибки тестового набора. это оценивается внутри, во время пробега...

В частности, predict.randomForest возвращает предсказание вне пакета, если newdata не задано.

Ответ 3

В качестве указателя верхнего уровня перекрестная проверка не нужна в качестве защиты от чрезмерной установки. Это хорошая особенность алгоритма случайного леса.

Похоже, ваша цель - выбор функции, кросс-валидация по-прежнему полезна для этой цели. Взгляните на функцию rfcv() в пакете randomForest. Документация указывает ввод кадра данных и вектора, поэтому я начну с создания данных с вашими данными.

set.seed(42)
x <- cadets
x$RT..seconds. <- NULL
y <- cadets$RT..seconds.

rf.cv <- rfcv(x, y, cv.fold=10)

with(rf.cv, plot(n.var, error.cv))