Как настроить модель в 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
Пожалуйста, оставьте комментарий, если я что-то упустил где-то в этом курсе. Благодарю.