Иногда, когда вы подбираете модели для проверки их точности прогнозирования, вы обнаруживаете, что имеете дело со слишком большим количеством предикторов (характеристических переменных). Вы можете опираться на свои знания в предметной области или знания доступного эксперта в предметной области, чтобы уменьшить количество предикторов до тех пор, пока у вас не останутся только те, которые обеспечат вашей модели превосходную точность. Но если вам не хватает знаний в предметной области, есть несколько автоматизированных методов, предназначенных для решения проблемы: прямое и обратное устранение.

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

Разработка функций, пожалуй, самая недооцененная часть машинного обучения. Тот факт, что у вас много данных, не означает, что все они должны использоваться в модели. На самом деле, некоторые эксперты говорят, что лучшие, хорошо продуманные функции более ценны, чем алгоритмы, а в некоторых отчетах говорится, что творческая разработка функций побеждает в конкурсах 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, включая учебные пособия и руководства от начального до продвинутого уровня! Подпишитесь на нашу еженедельную рассылку здесь и получайте последние новости каждый четверг.