Ваши особенности важны? Это не значит, что они хорошие - KDnuggets

Ваши особенности важны? Это не значит, что они хорошие – KDnuggets

Исходный узел: 2893531

Ваши особенности важны? Это не значит, что они хорошие
[Изображение автора]

 

Понятие «важности признака» широко используется в машинном обучении как самый простой тип объяснимости модели. Например, он используется в рекурсивном исключении функций (RFE) для итеративного удаления наименее важной функции модели.

Однако на этот счет существует ошибочное мнение.

Тот факт, что функция важна, не означает, что она полезна для модели!

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

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

Чтобы прояснить ситуацию, нам нужно будет провести различие между двумя понятиями:

  • Вклад в прогнозирование: какая часть прогнозов связана с функцией; это эквивалентно важности функции.
  • Вклад ошибки: какая часть ошибок прогнозирования связана с наличием признака в модели.

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

Примечание. Эта статья посвящена случаю регрессии. Если вас больше интересует случай классификации, вы можете прочитать «Какие функции вредны для вашей модели классификации?»

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

Таким образом, у нас есть основная истина, предсказание модели и результирующая ошибка:

 

Ваши особенности важны? Это не значит, что они хорошие
Основная истина, прогноз модели и абсолютная ошибка (в тысячах долларов). [Изображение автора]

 

Когда у нас есть прогнозирующая модель, мы всегда можем разложить предсказания модели на вклады, вносимые отдельными функциями. Это можно сделать через значения SHAP (если вы не знаете, как работают значения SHAP, вы можете прочитать мою статью: Ценности SHAP объяснены именно так, как вы хотели, чтобы вам объяснили).

Итак, допустим, это значения SHAP относительно нашей модели для трех человек.

 

Ваши особенности важны? Это не значит, что они хорошие
Значения SHAP для прогнозов нашей модели (в тысячах долларов). [Изображение автора]

 

Основным свойством значений SHAP является то, что они аддитивны. Это означает, что, взяв сумму каждой строки, мы получим прогноз нашей модели для этого человека. Например, если мы возьмем вторую строку: 72k$ +3k$ -22k$ = 53k$, что в точности соответствует прогнозу модели для второго человека.

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

Следовательно, Вклад в прогнозирование объекта равен среднему значению абсолютных значений SHAP этого объекта.. Если у вас есть значения SHAP, хранящиеся в кадре данных Pandas, это так же просто, как:

prediction_contribution = shap_values.abs().mean()

В нашем примере это результат:

 

Ваши особенности важны? Это не значит, что они хорошие
Вклад в прогнозирование. [Изображение автора]

 

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

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

Допустим, мы хотим ответить на следующий вопрос: «Какие прогнозы сделала бы модель, если бы у нее не было признака работа?» Ценности SHAP позволяют нам ответить на этот вопрос. Фактически, поскольку они аддитивны, достаточно вычесть значения SHAP относительно объекта. работа на основе прогнозов, сделанных моделью.

Конечно, мы можем повторить эту процедуру для каждого объекта. В Пандах:

y_pred_wo_feature = shap_values.apply(lambda feature: y_pred - feature)

Вот результат:

 

Ваши особенности важны? Это не значит, что они хорошие
Прогнозы, которые мы получим, если удалим соответствующую функцию. [Изображение автора]

 

Это означает, что если бы у нас не было функции работа, то модель предскажет 20 тысяч долларов для первого человека, -19 тысяч долларов для второго и -8 тысяч долларов для третьего. Вместо этого, если бы у нас не было функции возраст, модель предскажет 73 тыс. долларов для первого человека, 50 тыс. долларов для второго и так далее.

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

abs_error_wo_feature = y_pred_wo_feature.apply(lambda feature: (y_true - feature).abs())

Результат следующий:

 

Ваши особенности важны? Это не значит, что они хорошие
Абсолютные ошибки, которые мы получили бы, если бы удалили соответствующую функцию. [Изображение автора]

 

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

Но мы можем сделать больше. Действительно, мы можем вычислить разницу между ошибками полной модели и ошибками, которые мы получили бы без этой функции:

error_diff = abs_error_wo_feature.apply(lambda feature: abs_error - feature)

Что:

 

Ваши особенности важны? Это не значит, что они хорошие
Разница между ошибками модели и ошибками, которые мы имели бы без этой функции. [Изображение автора]

 

Если это число:

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

Мы можем вычислить «Вклад ошибок» как среднее значение этих значений для каждого признака.. В Пандах:

error_contribution = error_diff.mean()

Вот результат:

 

Ваши особенности важны? Это не значит, что они хорошие
Вклад ошибок. [Изображение автора]

 

Если это значение положительное, то это означает, что в среднем наличие признака в модели приводит к более высокой ошибке. Таким образом, без этой функции прогноз в целом был бы лучше. Другими словами, эта функция приносит больше вреда, чем пользы!

Напротив, чем отрицательнее это значение, тем полезнее функция для прогнозов, поскольку ее наличие приводит к меньшим ошибкам.

Давайте попробуем использовать эти концепции на реальном наборе данных.

В дальнейшем я буду использовать набор данных, взятый из Пикаре (библиотека Python под MIT лицензии). Набор данных называется «Золото» и содержит временные ряды финансовых данных.

 

Ваши особенности важны? Это не значит, что они хорошие
Образец набора данных. Все характеристики выражены в процентах, поэтому -4.07 означает доходность -4.07%. [Изображение автора]

 

Особенности заключаются в возврате финансовых активов соответственно за 22, 14, 7 и 1 день до момента наблюдения («Т-22», «Т-14», «Т-7», «Т-1»). Вот исчерпывающий список всех финансовых активов, используемых в качестве прогнозных функций:

 

Ваши особенности важны? Это не значит, что они хорошие
Список доступных активов. Каждый актив наблюдается в момент времени -22, -14, -7 и -1. [Изображение автора]

 

Всего у нас 120 функций.

Цель состоит в том, чтобы спрогнозировать цену золота (доходность) на 22 дня вперед («Gold_T+22»). Давайте посмотрим на целевую переменную.

 

Ваши особенности важны? Это не значит, что они хорошие
Гистограмма переменной. [Изображение автора]

 

После загрузки набора данных я выполнил следующие шаги:

  1. Разделите весь набор данных случайным образом: 33% строк в наборе обучающих данных, еще 33% в наборе проверочных данных и оставшиеся 33% в тестовом наборе данных.
  2. Обучите регрессор LightGBM на наборе обучающих данных.
  3. Делайте прогнозы по наборам данных обучения, проверки и тестирования, используя модель, обученную на предыдущем шаге.
  4. Вычислите значения SHAP для обучающих, проверочных и тестовых наборов данных, используя библиотеку Python «shap».
  5. Рассчитайте вклад прогнозирования и вклад ошибок каждого объекта в каждом наборе данных (обучение, проверка и тестирование), используя код, который мы видели в предыдущем абзаце.

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

 

Ваши особенности важны? Это не значит, что они хорошие
Вклад прогнозирования и вклад ошибок (в наборе обучающих данных). [Изображение автора]

 

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

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

Но это мало что добавляет к нашим знаниям, не так ли?

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

 

Ваши особенности важны? Это не значит, что они хорошие
Вклад прогнозов и вклад ошибок (в наборе данных проверки). [Изображение автора]

 

Из этого сюжета мы можем извлечь гораздо более интересную информацию.

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

Также обратите внимание, что «Gold_T-22» (возврат золота за 22 дня до периода наблюдения) работает очень хорошо по сравнению с той важностью, которую ему приписывает модель. Это значит, что эта функция, возможно, не подходит. И эта информация особенно интересна, поскольку золото — это актив, который мы пытаемся предсказать («Gold_T+22»).

С другой стороны, функции, у которых вклад ошибок выше 0, ухудшают наши прогнозы. Например, «US Bond ETF_T-1» в среднем изменяет прогноз модели на 0.092% (вклад прогнозирования), но приводит к тому, что модель делает прогноз в среднем на 0.013% (вклад ошибок) хуже, чем было бы без этой функции. .

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

Давайте посмотрим, какие функции имеют наибольший вклад ошибок.

 

Ваши особенности важны? Это не значит, что они хорошие
Функции отсортированы по уменьшению количества ошибок. [Изображение автора]

 

А теперь функции с наименьшим количеством ошибок:

 

Ваши особенности важны? Это не значит, что они хорошие
Функции отсортированы по увеличению количества ошибок. [Изображение автора]

 

Интересно, что мы можем наблюдать, что все объекты с более высоким вкладом ошибок относятся к T-1 (за 1 день до момента наблюдения), тогда как почти все объекты с меньшим вкладом ошибок относятся к T-22 (за 22 дня до момента наблюдения). ).

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

Обратите внимание, что без вклада ошибок мы бы никогда не узнали об этом.

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

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

Чтобы проверить, подтверждается ли наша интуиция, давайте сравним два подхода:

  • Традиционный RFE: сначала удаляем бесполезные функции (самый низкий вклад в прогнозирование).
  • Наше RFE: удаление вредоносных функций первый (самый высокий вклад ошибок).

Давайте посмотрим результаты на наборе проверки:

 

Ваши особенности важны? Это не значит, что они хорошие
Средняя абсолютная ошибка двух стратегий в наборе проверки. [Изображение автора]

 

Лучшая итерация для каждого метода обведена кружком: это модель с 19 функциями для традиционного RFE (синяя линия) и модель с 17 функциями для нашего RFE (оранжевая линия).

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

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

Итак, давайте посмотрим то же сравнение на тестовом наборе.

 

Ваши особенности важны? Это не значит, что они хорошие
Средняя абсолютная ошибка двух стратегий на тестовом наборе. [Изображение автора]

 

Результат аналогичен предыдущему. Даже если расстояние между двумя линиями меньше, MAE, полученное путем удаления самого высокого вкладчика ошибок, явно лучше, чем MAE, полученное путем удаления самого низкого вкладчика прогнозирования.

Поскольку мы выбрали модели, приводящие к наименьшему MAE в наборе проверки, давайте посмотрим их результат на тестовом наборе:

  • RFE-Prediction Contribution (19 функций). MAE на тестовом наборе: 2.04.
  • Вклад RFE-ошибок (17 функций). MAE на тестовом наборе: 1.94.

Таким образом, лучший MAE с использованием нашего метода на 5% лучше по сравнению с традиционным RFE!

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

Чтобы различать эти два аспекта, мы ввели две концепции: вклад прогнозирования и вклад ошибок. Обе концепции основаны на значениях SHAP набора проверочных данных, и в статье мы видели код Python для их вычисления.

Мы также опробовали их на реальном наборе финансовых данных (в котором задачей является прогнозирование цены на золото) и доказали, что рекурсивное устранение функций на основе вклада ошибок приводит к увеличению средней абсолютной ошибки на 5% по сравнению с традиционным RFE, основанным на вкладе прогнозирования.

Весь код, использованный в этой статье, можно найти в этот блокнот.

Спасибо за чтение!

 
 
Самуэле Маццанти является ведущим специалистом по данным в Jakala и в настоящее время живет в Риме. Он окончил факультет статистики, и его основные исследовательские интересы связаны с применением машинного обучения в промышленности. Он также является независимым создателем контента.

 
Оригинал, Перемещено с разрешения.
 

Отметка времени:

Больше от КДнаггетс