Иногда, когда вы подбираете модели для проверки их точности прогнозирования, вы обнаруживаете, что имеете дело со слишком большим количеством предикторов (характеристических переменных). Вы можете опираться на свои знания в предметной области или знания доступного эксперта в предметной области, чтобы уменьшить количество предикторов до тех пор, пока у вас не останутся только те, которые обеспечат вашей модели превосходную точность. Но если вам не хватает знаний в предметной области, есть несколько автоматизированных методов, предназначенных для решения проблемы: прямое и обратное устранение.
Инженерия признаков — это часть процесса обработки данных, в которой вы пытаетесь определить подмножество доступных предикторов для использования в вашей модели. Используя свои знания о данных, вы можете выбирать и создавать предикторы, которые улучшают работу моделей и алгоритмов машинного обучения.
Разработка функций, пожалуй, самая недооцененная часть машинного обучения. Тот факт, что у вас много данных, не означает, что все они должны использоваться в модели. На самом деле, некоторые эксперты говорят, что лучшие, хорошо продуманные функции более ценны, чем алгоритмы, а в некоторых отчетах говорится, что творческая разработка функций побеждает в конкурсах Kaggle.
Процесс разработки признаков — это не только наука, но и искусство. Хорошо иметь эксперта в предметной области для этого процесса, но также полезно использовать свое воображение. Хотя разработка функций — это постоянная тема исследований, давайте рассмотрим два различных автоматизированных подхода, которые вы можете использовать.
Вперед устранение
Давайте начнем с регрессионной модели без функций, а затем постепенно будем добавлять по одной функции за раз, в зависимости от того, какая функция больше всего улучшает модель.
По сути, вы строите все возможные регрессионные модели с одним предиктором и выбираете лучшую. Затем попробуйте все возможные модели, включающие этот лучший предиктор плюс второй предиктор. Выберите лучшее из них. Вы продолжаете добавлять по одной функции за раз и останавливаетесь, когда ваша модель больше не улучшается или начинает ухудшаться.
В коде R ниже мы будем использовать набор данных nuclear
из пакета boot
. Этот набор данных содержит «данные о строительстве атомной электростанции» с 32 наблюдениями и 11 переменными. Чтобы выполнить метод проектирования признаков прямого исключения, мы будем итеративно использовать две функции R, add1
и update
, чтобы выполнить серию тестов и обновить подобранную модель регрессии. Цель состоит в том, чтобы выбрать лучшую модель для прогнозирования стоимости строительства.
> library(boot) > # Fit model for cost with intercept term only. > # This model is insufficient for predicting cost. > nuclear_lm0 <- lm(cost~1,data=nuclear) > summary(nuclear_lm0) > # Start forward elimination > # nuclear_lm0 is model we wish to update > # scope arg defines most complex mode to use for fitting, < # namely all predictors. > # text="F" for partial F-test to determine accuracy > add1(nuclear_lm0, scope=.~.+date+t1+t2+cap+pr+ne+ct+bw+cum.n+pt,test="F") Single term additions Model: Cost ~ 1 Df Sum of Sq RSS AIC F value Pr(>F) <none> 897172 329.72 date 1 334335 562837 316.80 17.8205 0.0002071 *** t1 1 186984 710189 324.24 7.8986 0.0086296 ** t2 1 27 897145 331.72 0.0009 0.9760597 cap 1 199673 697499 323.66 8.5881 0.0064137 ** pr 1 9037 888136 331.40 0.3052 0.5847053 ne 1 128641 768531 326.77 5.0216 0.0325885 * ct 1 43042 854130 330.15 1.5118 0.2284221 bw 1 16205 880967 331.14 0.5519 0.4633402 cum.n 1 67938 829234 329.20 2.4579 0.1274266 pt 1 305334 591839 318.41 15.4772 0.0004575 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 > # date predictor offers most improvement in modeling cost, > # so update model (could also choose pt) > nuclear_lm1 <- update(nucleasr_lm0,formula=.~.+date) > summary(nuclear_lm1) # Now model includes date > # Call add1 again, this time use nuclear_lm1 model > # this time cap is most significant > add1(nuclear_lm1, scope=.~.+date+t1+t2+cap+pr+ne+ct+bw+cum.n+pt,test="F") > # cap predictor needs to be added to model > nuclear_lm2 <- update(nuclear_lm1,formula=.~.+cap) > summary(nuclear_lm2) > # Call add1 again, this time use nuclear_lm2 model > add1(nuclear_lm2, scope=.~.+date+t1+t2+cap+pr+ne+ct+bw+cum.n+pt,test="F") > # pt predictor needs to be added to model > nuclear_lm3 <- update(nuclear_lm2,formula=.~.+pt) > summary(nuclear_lm3) > # Call add1 again, this time use nuclear_lm3 model > add1(nuclear_lm3, scope=.~.+date+t1+t2+cap+pr+ne+ct+bw+cum.n+pt,test="F") > # ne predictor needs to be added to model > nuclear_lm4 <- update(nuclear_lm3,formula=.~.+ne) > summary(nuclear_lm4) > # Call add1 again, this time use nuclear_lm4 model > # No more predictors would add significance in improvement > # of model. > add1(nuclear_lm4, scope=.~.+date+t1+t2+cap+pr+ne+ct+bw+cum.n+pt,test="F") > # Final model > summary(nuclear_lm4) Call: lm(formula = cost ~ date + t2 + cap + pr + ne + cum.n, data = nuclear) Residuals: Min 1Q Median 3Q Max -152.851 -53.929 -8.827 53.382 155.581 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -9.702e+03 1.294e+03 -7.495 7.55e-08 *** date 1.396e+02 1.843e+01 7.574 6.27e-08 *** t2 4.905e+00 1.827e+00 2.685 0.012685 * cap 4.137e-01 8.425e-02 4.911 4.70e-05 *** pr -8.851e+01 3.479e+01 -2.544 0.017499 * ne 1.502e+02 3.400e+01 4.419 0.000168 *** cum.n -7.919e+00 2.871e+00 -2.758 0.010703 * --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 80.8 on 25 degrees of freedom Multiple R-squared: 0.8181, Adjusted R-squared: 0.7744 F-statistic: 18.74 on 6 and 25 DF, p-value: 3.796e-08
Теперь сводка линейной модели для Nuclear_lm4 показывает, что каждая переменная важна для прогнозирования стоимости (согласно звездочкам в крайнем правом столбце). Эта модель должна хорошо работать при прогнозировании стоимости строительства.
Обратная ликвидация
Аналогичный подход включает обратное устранение признаков. Здесь вы начинаете с регрессионной модели, включающей полный набор предикторов, и постепенно удаляете по одному предиктору, удаление которого дает наибольшее улучшение. Вы прекращаете удалять предикторы, когда удаление ухудшает прогнозную модель.
Чтобы выполнить метод проектирования признаков с обратным исключением, вы можете итеративно использовать две функции R, drop1
и update
, чтобы выполнить серию тестов и обновить подобранную модель регрессии. Из выходных данных drop1
вы выбираете переменную для удаления из модели, которая имеет наименее значительный эффект снижения качества подгонки.
Вы можете обнаружить, что окончательная модель прямого исключения отличается от окончательной модели обратного исключения. Это связано с тем, что предикторы в модели влияют друг на друга: оценочные коэффициенты действующих предикторов изменяются по мере того, как вы контролируете различные переменные. Методы автоматизированного проектирования признаков капризны по своей природе, несмотря на методичность их применения.
Если вы хотите узнать больше о разработке функций, на конференции ODSC West в Сан-Франциско состоится семинар по машинному обучению и разработке функций и о том, как сосредоточиться их для прогнозирования поведения потребителей.
— — — — — — — — — — — — — — — — — —
Читайте другие статьи по науке о данных на OpenDataScience.com, включая учебные пособия и руководства от начального до продвинутого уровня! Подпишитесь на нашу еженедельную рассылку здесь и получайте последние новости каждый четверг.