Этот вопрос является продолжением той же темы здесь. Ниже приведен минимальный рабочий пример, взятый из этой книги:
Веренс Р. Хемометрика с многомерным анализом данных R в естественных науках и науках о жизни. 1-е издание. Гейдельберг; Нью-Йорк: Спрингер. 2011. (стр. 250).
Пример был взят из этой книги и ее пакета ChemometricsWithR
. Он выявил некоторые подводные камни при моделировании с использованием методов перекрестной проверки.
Цель:
методология с перекрестной проверкой, использующая тот же набор повторяющихся CV для реализации известной стратегии PLS
, за которой обычно следует LDA
или двоюродные братья, такие как логистическая регрессия, SVM, C5.0, CART, с духом пакета caret
. Таким образом, PLS потребуется каждый раз перед вызовом ожидающего классификатора, чтобы классифицировать пространство PLS score вместо самих наблюдений. Ближайший подход в пакете Caret — выполнение PCA
в качестве шага предварительной обработки перед моделированием с помощью любого классификатора. Ниже представлена процедура PLS-LDA только с одной перекрестной проверкой для проверки производительности классификатора, без 10-кратного CV или каких-либо повторений. Код ниже был взят из упомянутой книги, но с некоторыми исправлениями иначе выдает ошибку:
library(ChemometricsWithR)
data(prostate)
prostate.clmat <- classvec2classmat(prostate.type) # convert Y to a dummy var
odd <- seq(1, length(prostate.type), by = 2) # training
even <- seq(2, length(prostate.type), by = 2) # holdout test
prostate.pls <- plsr(prostate.clmat ~ prostate, ncomp = 16, validation = "CV", subset=odd)
Xtst <- scale(prostate[even,], center = colMeans(prostate[odd,]), scale = apply(prostate[odd,],2,sd))
tst.scores <- Xtst %*% prostate.pls$projection # scores for the waiting trained LDA to test
prostate.ldapls <- lda(scores(prostate.pls)[,1:16],prostate.type[odd]) # LDA for scores
table(predict(prostate.ldapls, new = tst.scores[,1:16])$class, prostate.type[even])
predictionTest <- predict(prostate.ldapls, new = tst.scores[,1:16])$class)
library(caret)
confusionMatrix(data = predictionTest, reference= prostate.type[even]) # from caret
Выход:
Confusion Matrix and Statistics
Reference
Prediction bph control pca
bph 4 1 9
control 1 35 7
pca 34 4 68
Overall Statistics
Accuracy : 0.6564
95% CI : (0.5781, 0.7289)
No Information Rate : 0.5153
P-Value [Acc > NIR] : 0.0001874
Kappa : 0.4072
Mcnemar's Test P-Value : 0.0015385
Statistics by Class:
Class: bph Class: control Class: pca
Sensitivity 0.10256 0.8750 0.8095
Specificity 0.91935 0.9350 0.5190
Pos Pred Value 0.28571 0.8140 0.6415
Neg Pred Value 0.76510 0.9583 0.7193
Prevalence 0.23926 0.2454 0.5153
Detection Rate 0.02454 0.2147 0.4172
Detection Prevalence 0.08589 0.2638 0.6503
Balanced Accuracy 0.51096 0.9050 0.6643
Однако матрица путаницы не совпадала с той, что была в книге, в любом случае код в книге сломался, но вот этот сработал со мной!
Примечания.
Хотя это был только один CV, но намерение состоит в том, чтобы сначала согласовать эту методологию, sd
и mean
набора поездов были применены к тестовому набору, ПЛЮС преобразован в баллы PLS на основе определенное количество ПК ncomp
. Я хочу, чтобы это происходило каждый раунд CV в каретке. Если методология в виде кода здесь верна, то она может послужить, может быть, хорошим стартом для примера минимальной работы при модификации кода пакета каретки.
Примечания.
С масштабированием и центрированием может быть очень запутанно. Я думаю, что некоторые функции PLS в R выполняют масштабирование внутренне, с центрированием или без него, я не уверен, поэтому создание пользовательского с моделью в карете следует обращаться с осторожностью, чтобы избежать как отсутствия, так и многократного масштабирования или центрирования (я настороже с этими вещами).
Опасности многократного центрирования/масштабирования
Приведенный ниже код просто показывает, как многократное центрирование/масштабирование может изменить данные. Здесь показано только центрирование, но та же проблема возникает и с масштабированием.
set.seed(1)
x <- rnorm(200, 2, 1)
xCentered1 <- scale(x, center=TRUE, scale=FALSE)
xCentered2 <- scale(xCentered1, center=TRUE, scale=FALSE)
xCentered3 <- scale(xCentered2, center=TRUE, scale=FALSE)
sapply (list(xNotCentered= x, xCentered1 = xCentered1, xCentered2 = xCentered2, xCentered3 = xCentered3), mean)
Выход:
xNotCentered xCentered1 xCentered2 xCentered3
2.035540e+00 1.897798e-16 -5.603699e-18 -5.332377e-18
Пожалуйста, оставьте комментарий, если я что-то упустил в этом курсе. Спасибо.
train
, что необходимо сложить баллы обучающего CV. Как правило, я бы сначала попробовал PLS-LDA, если он работает, то сделал бы то же самое для других классификаторов. Это как прототип модели. Итак, можете ли вы сначала предоставить код, как настроить PLS-LDA? - person doctorate   schedule 13.01.2014plslda
, так иpredict.plslda
(и еще несколько функций, таких какcoef
, и для некоторой постобработки). Однако пока нет поддержкиcaret
. - person cbeleites unhappy with SX   schedule 13.01.2014