Книга «Предиктивное моделирование на практике»

в 13:11, , рубрики: data mining, R, Алгоритмы, Блог компании Издательский дом «Питер», книги, Профессиональная литература

imageПривет, Хаброжители! «Предиктивное моделирование на практике» охватывает все аспекты прогнозирования, начиная с ключевых этапов предварительной обработки данных, разбиения данных и основных принципов настройки модели. Все этапы моделирования рассматриваются на практических примерах из реальной жизни, в каждой главе дается подробный код на языке R.

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

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

Отрывок. 7.5. Вычисления

В этом разделе будут использоваться функции из пакетов R caret, earth, kernlab и nnet.

В R имеется немало пакетов и функций для создания нейросетей. К их числу относятся и пакеты nnet, neural и RSNNS. Основное внимание уделяется пакету nnet, поддерживающему базовые модели нейросетей с одним уровнем скрытых переменных, снижение весов, и характеризующемуся сравнительно простым синтаксисом. RSNNS поддерживает широкий спектр нейросетей. Отметим, что у Бергмейра и Бенитеса (Bergmeir and Benitez, 2012) есть краткое описание различных пакетов нейросетей в R. Там же приводится учебное руководство по RSNNS.

Нейросети

Для апрроксимации регрессионной модели функция nnet может получать как формулу модели, так и матричный интерфейс. Для регрессии линейная связь между скрытыми переменными и прогнозом используется с параметром linout = TRUE. Простейший вызов функции нейросети будет иметь вид:

> nnetFit <- nnet(predictors, outcome,
+                        size = 5,
+                        decay = 0.01,
+                        linout = TRUE,
+                        ## Сокращенный вывод
+                        trace = FALSE,
+                        ## Расширение количества итераций для нахождения
+                        ## оценок параметров..
+                        maxit = 500,
+                        ## и количества параметров, используемых моделью
+                        MaxNWts = 5 * (ncol(predictors) + 1) + 5 + 1)

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

Для усреднения моделей используется функция avNNet из пакета caret, имеющая тот же синтаксис:

> nnetAvg <- avNNet(predictors, outcome,
+                              size = 5,
+                              decay = 0.01,
+                              ## Количество усредняемых моделей
+                              repeats = 5,
+                              linout = TRUE,
+                              ## Сокращенный вывод
+                              trace = FALSE,
+                              ## Расширение количества итераций
+                              ## для нахождения оценок параметров..
+                              maxit = 500,
+                              ## и количества параметров, используемых моделью
+                              MaxNWts = 5 * (ncol(predictors) + 1) + 5 + 1)

Новые точки данных обрабатываются командой

> predict(nnetFit, newData)
> ## или
> predict(nnetAvg, newData)

Чтобы воспроизвести представленный ранее метод выбора количества скрытых переменных и величины снижения весов посредством повторной выборки, применим функцию train с параметром method = «nnet» или method = «avNNet», сначала удалив предикторы (с тем, чтобы максимальная абсолютная парная корреляция между предикторами не превышала 0,75):

> ## findCorrelation получает матрицу корреляции и определяет
> ## номера столбцов, которые должны быть удалены для поддержания
> ## всех парных корреляций ниже заданного порога
> tooHigh <- findCorrelation(cor(solTrainXtrans), cutoff = .75)
> trainXnnet <- solTrainXtrans[, -tooHigh]
> testXnnet <- solTestXtrans[, -tooHigh]
> ## Создание набора моделей-кандидатов для оценки:
> nnetGrid <- expand.grid(.decay = c(0, 0.01, .1),
+                                     .size = c(1:10),
+                                     ## Другой вариант — использование бэггинга
+                                     ## (см. следующую главу) вместо случайной
+                                     ## инициализации генератора.
+                                     .bag = FALSE)
> set.seed(100)
> nnetTune <- train(solTrainXtrans, solTrainY,
+                            method = "avNNet",
+                            tuneGrid = nnetGrid,
+                            trControl = ctrl,
+                            ## Автоматическая стандартизация данных
+                            ## перед моделированием и прогнозированием
+                            preProc = c("center", "scale"),
+                            linout = TRUE,
+                            trace = FALSE,
+                            MaxNWts = 10 * (ncol(trainXnnet) + 1) + 10 + 1,
+                            maxit = 500)

Многомерные адаптивные регрессионные сплайны

Модели MARS содержатся в нескольких пакетах, но самая обширная реализация находится в пакете earth. Модель MARS, использующая номинальную фазу прямого прохода и усечения, может вызываться следующим образом:

> marsFit <- earth(solTrainXtrans, solTrainY)

> marsFit
   Selected 38 of 47 terms, and 30 of 228 predictors
   Importance: NumNonHAtoms, MolWeight, SurfaceArea2, SurfaceArea1, FP142, ...
   Number of terms at each degree of interaction: 1 37 (additive model)
   GCV 0.3877448 RSS 312.877 GRSq 0.907529 RSq 0.9213739

Поскольку эта модель во внутренней реализации использует метод GCV для выбора модели, ее устройство несколько отличается от модели, описанной ранее в этой главе. Метод summary генерирует более обширный вывод:

> summary(marsFit)
   Call: earth(x=solTrainXtrans, y=solTrainY)
                                                  coefficients
   (Intercept)                                    -3.223749
   FP002                                            0.517848
   FP003                                           -0.228759
   FP059                                           -0.582140
   FP065                                           -0.273844
   FP075                                            0.285520
   FP083                                          -0.629746
   FP085                                          -0.235622
   FP099                                            0.325018
   FP111                                          -0.403920
   FP135                                            0.394901
   FP142                                            0.407264
   FP154                                          -0.620757
   FP172                                          -0.514016
   FP176                                            0.308482
   FP188                                            0.425123
   FP202                                            0.302688
   FP204                                          -0.311739
   FP207                                            0.457080
   h(MolWeight-5.77508)                           -1.801853
   h(5.94516-MolWeight)                             0.813322
   h(NumNonHAtoms-2.99573)                        -3.247622
   h(2.99573-NumNonHAtoms)                          2.520305
   h(2.57858-NumNonHBonds)                        -0.564690
   h(NumMultBonds-1.85275)                        -0.370480
   h(NumRotBonds-2.19722)                         -2.753687
   h(2.19722-NumRotBonds)                          0.123978
   h(NumAromaticBonds-2.48491)                    -1.453716
   h(NumNitrogen-0.584815)                          8.239716
   h(0.584815-NumNitrogen)                        -1.542868
   h(NumOxygen-1.38629)                             3.304643
   h(1.38629-NumOxygen)                           -0.620413
   h(NumChlorine-0.46875)                         -50.431489
   h(HydrophilicFactor- -0.816625)                  0.237565
   h(-0.816625-HydrophilicFactor)                 -0.370998
   h(SurfaceArea1-1.9554)                           0.149166
   h(SurfaceArea2-4.66178)                        -0.169960
   h(4.66178-SurfaceArea2)                        -0.157970

   Selected 38 of 47 terms, and 30 of 228 predictors
   Importance: NumNonHAtoms, MolWeight, SurfaceArea2, SurfaceArea1, FP142, ...
   Number of terms at each degree of interaction: 1 37 (additive model)
   GCV 0.3877448 RSS 312.877 GRSq 0.907529 RSq 0.9213739

В этом выводе h(·) — шарнирная функция. В приведенных результатах составляющая h(MolWeight-5.77508) равна нулю при значении молекулярной массы меньше 5,77508 (как в верхней части рис. 7.3). Отраженная шарнирная функция имеет вид h(5.77508 — MolWeight).

Функция plotmo из пакета earth может использоваться для построения диаграмм, сходных с изображенными на рис. 7.5. Для настройки модели с использованием внешней повторной выборки можно воспользоваться train. В следующем коде воспроизведены результаты, отображенные на рис. 7.4:

> # Определение моделей-кандидатов для тестирования
> marsGrid <- expand.grid(.degree = 1:2, .nprune = 2:38)
> # Инициализация генератора для воспроизведения результатов
> set.seed(100)
> marsTuned <- train(solTrainXtrans, solTrainY,
+ method = "earth",
+ # Явное объявление моделей-кандидатов для тестирования
+ tuneGrid = marsGrid,
+ trControl = trainControl(method = "cv"))
> marsTuned
   951 samples
   228 predictors
No pre-processing
Resampling: Cross-Validation (10-fold)

Summary of sample sizes: 856, 857, 855, 856, 856, 855, ...

Resampling results across tuning parameters:

    degree nprune RMSE   Rsquared RMSE SD  Rsquared SD
    1      2      1.54   0.438    0.128    0.0802
    1      3      1.12   0.7      0.0968   0.0647
    1      4      1.06   0.73     0.0849   0.0594
    1      5      1.02   0.75     0.102    0.0551
    1      6      0.984  0.768    0.0733   0.042
    1      7      0.919  0.796    0.0657   0.0432
    1      8      0.862  0.821    0.0418   0.0237
    :      :      :      :        :        :
    2      33     0.701  0.883    0.068    0.0307
    2      34     0.702  0.883    0.0699   0.0307
    2      35     0.696  0.885    0.0746   0.0315
    2      36     0.687  0.887    0.0604   0.0281
    2      37     0.696  0.885    0.0689   0.0291
    2      38     0.686  0.887    0.0626   0.029

   RMSE was used to select the optimal model using the smallest value.
   The final values used for the model were degree = 1 and nprune = 38.

> head(predict(marsTuned, solTestXtrans))
   [1] 0.3677522 -0.1503220 -0.5051844 0.5398116 -0.4792718 0.7377222

Для оценки важности каждого предиктора в модели MARS используются две функции: evimp из пакета earth и varImp из пакета caret (при этом вторая вызывает первую):

> varImp(marsTuned)
   earth variable importance

      only 20 most important variables shown (out of 228)

                       Overall
   MolWeight            100.00
   NumNonHAtoms         89.96
   SurfaceArea2         89.51
   SurfaceArea1         57.34
   FP142                44.31
   FP002                39.23
   NumMultBond s        39.23
   FP204                37.10
   FP172                34.96
   NumOxygen            30.70
   NumNitrogen          29.12
   FP083                28.21
   NumNonHBonds         26.58
   FP059                24.76
   FP135                23.51
   FP154                21.20
   FP207                19.05
   FP202                17.92
   NumRotBonds          16.94
   FP085                16.02

Эти результаты масштабируются в интервале от 0 до 100, отличаясь от приведенных в табл. 7.1 (представленная в табл. 7.1 модель не прошла полный процесс роста и усечения). Отметим, что переменные, следующие за несколькими первыми из них, менее значимы для модели.

SVM, метод опорных векторов

Реализации моделей SVM содержатся в нескольких пакетах R. У Чанга и Лина (Chang and Lin, 2011) функция svm из пакета e1071 использует интерфейс к библиотеке LIBSVM для регрессии. Более полная реализация моделей SVM для регрессии по Карацоглу (Karatzoglou et al., 2004) содержится в пакете kernlab, включающем и функцию ksvm для регрессионных моделей и большого количества ядерных функций. По умолчанию используется радиальная базисная функция. Если значения стоимости и ядерных параметров известны, то аппроксимация модели может быть выполнена следующим образом:

> svmFit <- ksvm(x = solTrainXtrans, y = solTrainY,
+                         kernel ="rbfdot", kpar = "automatic",
+                         C = 1, epsilon = 0.1)

Для оценки σ применен автоматизированный анализ. Так как y является числовым вектором, функция заведомо аппроксимирует регрессионную модель (вместо классификационной модели). Можно использовать и другие ядерные функции, включая полиномиальные (kernel = «polydot») и линейные (kernel = «vanilladot»).

Если значения неизвестны, то их можно оценить посредством повторной выборки. В train значения «svmRadial», «svmLinear» или «svmPoly» параметра method выбирают разные ядерные функции:

> svmRTuned <- train(solTrainXtrans, solTrainY,
+                               method = "svmRadial",
+                               preProc = c("center", "scale"),
+                               tuneLength = 14,
+                               trControl = trainControl(method = "cv"))

Аргумент tuneLength использует по умолчанию 14 значений стоимости image
image Оценка σ по умолчанию выполняется посредством автоматического анализа.

> svmRTuned
   951 samples
   228 predictors

   Pre-processing: centered, scaled
   Resampling: Cross-Validation (10-fold)

   Summary of sample sizes: 855, 858, 856, 855, 855, 856, ...

   Resampling results across tuning parameters:

       C       RMSE    Rsquared   RMSE SD   Rsquared SD
       0.25    0.793   0.87       0.105     0.0396
       0.5     0.708   0.889      0.0936    0.0345
       1       0.664   0.898      0.0834    0.0306
       2       0.642   0.903      0.0725    0.0277
       4       0.629   0.906      0.067     0.0253
       8       0.621   0.908      0.0634    0.0238
       16      0.617   0.909      0.0602    0.0232
       32      0.613   0.91       0.06      0.0234
       64      0.611   0.911      0.0586    0.0231
       128     0.609   0.911      0.0561    0.0223
       256     0.609   0.911      0.056     0.0224
       512     0.61    0.911      0.0563    0.0226
       1020    0.613   0.91       0.0563    0.023
       2050    0.618   0.909      0.0541    0.023

   Tuning parameter 'sigma' was held constant at a value of 0.00387
   RMSE was used to select the optimal model using the smallest value.
   The final values used for the model were C = 256 and sigma = 0.00387.

Подобъект finalModel содержит модель, созданную функцией ksvm:

> svmRTuned$finalModel
   Support Vector Machine object of class "ksvm"

   SV type: eps-svr (regression)
       parameter : epsilon = 0.1 cost C = 256

   Gaussian Radial Basis kernel function.
     Hyperparameter : sigma = 0.00387037424967707

   Number of Support Vectors : 625

   Objective Function Value : -1020.558
   Training error : 0.009163

В качестве опорных векторов модель использует 625 точек данных тренировочного набора (то есть 66 % тренировочного набора).

Пакет kernlab содержит реализацию модели RVM для регрессии в функции rvm. Ее синтаксис очень похож на представленный в примере для ksvm.

Метод KNN

Функция knnreg из пакета caret аппроксимирует регрессионную модель KNN; функция train настраивает модель по K:

> # Сначала удаляются разреженные и несбалансированные предикторы.
> knnDescr <- solTrainXtrans[, -nearZeroVar(solTrainXtrans)]
> set.seed(100)
> knnTune <- train(knnDescr,
+                           solTrainY,
+                           method = "knn",
+                           # Центрирование и масштабирование будет выполняться
+                           # для новых прогнозов
+                           preProc = c("center", "scale"),
+                           tuneGrid = data.frame(.k = 1:20),
+                           trControl = trainControl(method = "cv"))

Об авторах:

Макс Кун — руководитель отдела статистических неклинических исследований и разработки Pfizer Global. Он работает с предиктивными моделями более 15 лет и является автором нескольких специализированных пакетов для языка R. Предиктивное моделирование на практике охватывает все аспекты прогнозирования, начиная с ключевых этапов предварительной обработки данных, разбиения данных и основных принципов
настройки модели. Все этапы моделирования рассматриваются на практических примерах
из реальной жизни, в каждой главе дается подробный код на языке R.

Кьелл Джонсон — более десяти лет работает в области статистики и предиктивного моделирования для фармацевтических исследований. Является соучредителем Arbor Analytics – компании, специализирующейся на предиктивном моделировании; ранее возглавлял отдел статистических исследований и разработки в Pfizer Global. Его научная работа посвящена применению и разработке статистической методологии и алгоритмов обучения.

» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок

Для Хаброжителей скидка 25% по купону — Applied Predictive Modeling
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.

Автор: ph_piter

Источник


* - обязательные к заполнению поля