Хабрахабр

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

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

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

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

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

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

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

Нейросети

Для апрроксимации регрессионной модели функция 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).

7. Функция plotmo из пакета earth может использоваться для построения диаграмм, сходных с изображенными на рис. Для настройки модели с использованием внешней повторной выборки можно воспользоваться train. 5. 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 % тренировочного набора).

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

Метод 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 высылается электронная книга.

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»