Утилита Feature-Engineering: зачем создавать новые функции на основе существующих функций?

30

Я часто вижу, как люди создают новые функции на основе существующих функций для проблемы машинного обучения. Например, здесь: https://triangleinequality.wordpress.com/2013/09/08/basic-feature-engineering-with-the-titanic-data/ люди считают размер семьи человека новой функцией, основанной на на количество братьев, сестер и родителей, которые были существующими функциями.

Но какой в ​​этом смысл? Я не понимаю, почему создание взаимосвязанных новых функций полезно. Разве работа алгоритма не заключается в том, чтобы делать это самостоятельно?

Матье Верон
источник
Связано: stats.stackexchange.com/questions/349155/…
Sycorax сообщает восстановить Monica

Ответы:

30

Самый простой пример, используемый для иллюстрации этого, - это проблема XOR (см. Изображение ниже). Представьте, что вам даны данные, содержащие координаты и и двоичный класс для прогнозирования. Вы можете ожидать, что ваш алгоритм машинного обучения сам определит правильную границу решения, но если вы сгенерировали дополнительную функцию , то проблема станет тривиальной, так как дает вам почти идеальный критерий решения для классификации, и вы использовали просто простую арифметику !xyz=xyz>0

XOR проблема

Таким образом, хотя во многих случаях вы можете ожидать от алгоритма поиска решения, в качестве альтернативы, путем разработки функций, вы можете упростить проблему. Простые проблемы легче и быстрее решать, и для них нужны менее сложные алгоритмы. Простые алгоритмы часто более надежны, результаты часто более интерпретируемы, они более масштабируемы (меньше вычислительных ресурсов, время на обучение и т. Д.) И переносимы. Вы можете найти больше примеров и объяснений в прекрасном выступлении Винсента Д. Вармердама, которое было дано на конференции PyData в Лондоне .

Более того, не верьте всему, что говорят вам маркетологи машинного обучения. В большинстве случаев алгоритмы не будут «учиться самостоятельно». У вас обычно есть ограниченное время, ресурсы, вычислительная мощность, а данные обычно имеют ограниченный размер и шумят, и это не помогает.

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

В примере данных Titanic ваш алгоритм должен был бы выяснить, что суммирование членов семьи имеет смысл, чтобы получить функцию «размера семьи» (да, я здесь ее персонализирую). Это очевидная особенность для человека, но она не очевидна, если вы рассматриваете данные только как некоторые столбцы чисел. Если вы не знаете, какие столбцы имеют смысл, если рассматривать их вместе с другими столбцами, алгоритм может выяснить это, попробовав каждую возможную комбинацию таких столбцов. Конечно, у нас есть умные способы сделать это, но все же, намного проще, если информация передается алгоритму сразу.

Тим
источник
Спасибо, это очень хорошо объяснено и очень интересно!
Матье Верон
Я нахожу ваш ответ очень хорошим, но я думаю, что лучше немного его квалифицировать. В частности, я думаю, что разработка функций с точки зрения терминов взаимодействия не сильно упрощает такие вещи, как алгоритмы, такие как RF (хотя это все еще может помочь), так как RF захватывают условия взаимодействия в определенной степени сами по себе. Дайте мне знать, если я что-то упустил. Но да, в целом разработка функций упрощает и помогает.
поэт Модит
@PoeteMaudit это правда, что дерево решений (и так RF) моделирует одно большое взаимодействие, но это определенный вид взаимодействий, а не каждое возможное взаимодействие. Кроме того, разработка функций - это не только взаимодействие.
Тим
Конечно, я согласен с вашими точками зрения. Во-первых, что RF моделируют определенный тип взаимодействий (вы имеете в виду, в основном, x * y?). Во-вторых, эта разработка функций, безусловно, касается не только взаимодействий.
поэт Модит
14

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

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

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

Даниэль Лопес
источник
Хорошо я понял ! Но как я могу узнать, являются ли мои функции, которые я создал, значимыми и информативными? Я имею в виду, проблемы могут иметь нелогичные объяснения. Из того, что я понимаю, создание функций - это способ направить алгоритм в одном направлении, чтобы сэкономить время на его предсказаниях. Таким образом, мы влияем на алгоритм несколькими способами. Как проверить, что мы правильно влияем?
Матье Верон
2
Хорошо, это то, где знание области приходит. Например, если вы разрабатываете систему медицинской диагностики, вы можете поговорить с врачами и спросить их, какую информацию они используют для диагностики пациента. Например, если один врач говорит: «Если у пациента и жар, и головная боль, то он может заболеть гриппом». Это предложение может указывать на то, что включение новой функции флага, которая указывает на наличие как лихорадки, так и головной боли, может быть хорошей идеей (особенно если вы используете линейный классификатор, который сам не может «видеть» функции полиномиального взаимодействия).
Даниэль Лопес
1
Тем не менее, это скорее искусство, чем наука. В конце вам нужно проверить эффективность ваших созданных вручную функций, протестировав ваши модели на тестовом наборе с непредвзятым экспериментальным протоколом ...
Даниэль Лопес
3

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

  1. Некоторые модели, такие как линейная регрессия, не обрабатывают нелинейность автоматически, в этом случае вам нужно создать дополнительные функции, чтобы помочь. Например, ниже: если у вас есть следующий набор данных, все целевой переменной сгруппированы в центре области, подобной окружности.Y=1

Круг Граница

Если вам даны только две функции, и . Простая линейная модель не найдет способа классификации целевой переменной. Таким образом, вместо этого вам нужны новые функции четверти, чтобы захватить нелинейность: .x1x2y=x0+c1x1+c2x2y=x0+c1x12+c2x22

  1. Если вы заранее знаете, что некоторые функции (из бизнес-знаний или опыта), это может помочь создать их, чтобы ускорить время выполнения модели и упростить ее для вашей модели. Например, в вашем примере данных Титаник и если вы используете модель классификации дерева решений. Если вы знаете, что пожилые женщины (возраст и пол) с большей вероятностью выживут, создав одну функцию, которая собирает информацию, ваше дерево может сделать одно разбиение по новой переменной вместо двух по двум переменным. Это может ускорить время вычислений, если вы заранее знаете, что эта функция важна.

  2. В реальном мире вы не получите ни одного набора данных, который предоставляет Kaggle. Вместо этого вы получаете информацию отовсюду. Например, если вы хотите предсказать истощение клиентов для такой розничной интернет-компании, как Amazon, у вас есть демографические данные клиентов, информация о транзакциях покупки. Вам необходимо генерировать множество функций из разных источников, в этом случае вы найдете множество полезных функций, которые можно получить / объединить на уровне транзакций. Как говорит Эндрю Нг: «Часто умение проектировать особенности определяет успех или провал проекта машинного обучения.

Энтони Лей
источник