Как настроить модель в CARET для выполнения двухступенчатой модели классификации PLS- [Classifer]?

Этот вопрос является продолжением той же темыВот, Ниже приведен минимальный рабочий пример из этой книги:

Веренс Р. Хемометрика с многомерным анализом данных в естественных и естественных науках. 1-е издание. Heidelberg; Нью-Йорк: Спрингер. 2011 г. (стр. 250).

Пример был взят из этой книги и ее пакетаChemometricsWithR, Он выделил некоторые подводные камни при моделировании с использованием методов перекрестной проверки.

Прицел:
Перекрестная проверка методологии с использованием одного и того же набора повторных резюме для выполнения известной стратегииPLS сопровождаемый обычноLDA или двоюродные братья, такие как логистическая регрессия, SVM, C5.0, CART, с духомcaret пакет. Таким образом, PLS потребуется каждый раз перед вызовом классификатора ожидания, чтобы классифицировать PLS.Гол пространство вместо самих наблюдений. Ближайший подход в каретном пакете делает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

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

Примечания:
Хотя это было только одно резюме, но цель состоит в том, чтобы сначала согласовать эту методологию,sd а такжеmean из набора поездов были применены на тестовом наборе, ПЛЮС преобразован в баллы PLS на основе определенного количества ПКncomp, Я хочу, чтобы это происходило каждый раунд резюме в карете. Если методология как код здесь верна, то она может послужить хорошим началом для минимального рабочего примера при изменении кода пакета каретки.

Примечания стороны:
С масштабированием и центрированием может возникнуть много проблем, я думаю, что некоторые функции 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

Пожалуйста, оставьте комментарий, если я что-то упустил где-то в этом курсе. Благодарю.

Ответы на вопрос(4)

Ваш ответ на вопрос