Для подготовки данных в пакете caret существует функция preProcess.

library(caret)
methods(preProcess)
## [1]preProcess.default
args(preProcess.default)
## function (x, method = c("center", "scale"), thresh = 0.95, pcaComp = NULL, 
##     na.remove = TRUE, k = 5, knnSummary = mean, outcome = NULL, 
##     fudge = 0.2, numUnique = 3, verbose = FALSE, ...) 
## NULL

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

Основные виды преобразований:

  • method="BoxCox" – служит для приведения зависимости между зависимыми и независимыми
    переменными к линейному виду.
  • method=c("scale", "center") – как правило, служит в качестве промежуточной
    подготовки данных к последующим преобразованиям PCA / PLS / ICA
  • method="pca" – служит для устранения [мульти]коллинеарности и уменьшения
    размерности модели

Следует отметить, что все преобразования проводятся над всеми данными одновременно,
так что если сред данных есть текст, например факторы, некоторые преобразования
не могут быть проведены. Соответственно, предварительно необходимо преобразование
данных с помощью функции model.matrix (для линейной регрессии) или
dummyVars (для деревьев решений).

Пример

library(earth)
data(etitanic)
head(etitanic)
##   pclass survived    sex     age sibsp parch
## 1    1st        1 female 29.0000     0     0
## 2    1st        1   male  0.9167     1     2
## 3    1st        0 female  2.0000     1     2
## 4    1st        0   male 30.0000     1     2
## 5    1st        0 female 25.0000     1     2
## 6    1st        1   male 48.0000     0     0
x <- etitanic[,-2]# x, независимые переменные или "предсказатели" (predictors)
preProcess(x, method="pca")
## Error in preProcess.default(x, method = "pca"): all columns of x must be numeric

Для того чтобы преобразование pca “сработало”, воспользуемся сначала model.matrix()

x <- model.matrix(survived ~., data=etitanic)[,-1]# удаляем константу
preProcess(x, method="pca")
## 
## Call:
## preProcess.default(x = x, method = "pca")
## 
## Created from 1046 samples and 6 variables
## Pre-processing: principal component signal extraction, scaled, centered 
## 
## PCA needed 6 components to capture 95 percent of the variance

Разница между model.matrix и dummyVars :

head(model.matrix(survived ~ ., data = etitanic))
##   (Intercept) pclass2nd pclass3rd sexmale     age sibsp parch
## 1           1         0         0       0 29.0000     0     0
## 2           1         0         0       1  0.9167     1     2
## 3           1         0         0       0  2.0000     1     2
## 4           1         0         0       1 30.0000     1     2
## 5           1         0         0       0 25.0000     1     2
## 6           1         0         0       1 48.0000     0     0
dummies <- dummyVars(survived ~ ., data = etitanic)
head(predict(dummies, newdata = etitanic))
##   pclass.1st pclass.2nd pclass.3rd sex.female sex.male     age sibsp parch
## 1          1          0          0          1        0 29.0000     0     0
## 2          1          0          0          0        1  0.9167     1     2
## 3          1          0          0          1        0  2.0000     1     2
## 4          1          0          0          0        1 30.0000     1     2
## 5          1          0          0          1        0 25.0000     1     2
## 6          1          0          0          0        1 48.0000     0     0

Подготовку данных (препроцессинг) можно проводить как в самой функции train:

lmfit <- train(mpg ~.,
               data=mtcars,
               method="lm",
               preProcess=c("scale", "center"))

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

Результатом исполенения функции preProcess является лист с параметрами преобразования:

x <- model.matrix(survived ~., data=etitanic)[,-1]pcaPreProcess <- preProcess(x, method="pca")

Cами преобразованные данные можно увидеть такм образом:

ls(pcaPreProcess)
##  [1]"bagImp"     "bc"         "call"       "data"       "dim"       
##  [6]"et"         "ica"        "k"          "knnSummary" "mean"      
## [11]"median"     "method"     "numComp"    "pcaComp"    "ranges"    
## [16]"rotation"   "std"        "thresh"     "yj"
pcaPreProcess$rotation
##                   PC1        PC2         PC3        PC4         PC5
## pclass2nd  0.43862972 -0.4327433  0.51428366  0.1084585 -0.12923551
## pclass3rd -0.55807558  0.4302552  0.01615143  0.1319193 -0.12075692
## sexmale    0.07610766  0.4454006  0.55226555 -0.6514719 -0.21450513
## age        0.45122090  0.1265796 -0.61253934 -0.4874287  0.05624727
## sibsp     -0.40815168 -0.4095489  0.12503312 -0.4625801  0.64843447
## parch     -0.34666288 -0.4954587 -0.19853586 -0.3079794 -0.70645062
##                  PC6
## pclass2nd  0.5721752
## pclass3rd  0.6864301
## sexmale   -0.1428306
## age        0.4054902
## sibsp      0.1249039
## parch     -0.0317063

pcaPreProcess$rotation показывает матрицу коэффициентов преобразования от старой
системы координат к новой.

Для того, чтобы перевести новые данные newdata в новую систему координат PCA
воспользуемся функцией predict:

predict(pcaPreProcess, newdata)
© 2014 In R we trust.
Top
Follow us: