Краткое руководство по оценке важности признаков вашей нейронной сети.
Нейронные сети чрезвычайно практичны. Они могут использоваться как для регрессии, так и для классификации, работают со структурированными и неструктурированными данными, хорошо обрабатывают таймфреймы и могут достичь высокой производительности, если их обучить на большом количестве данных.
В прошлом году команда Data Science, в которую я вхожу, хотела убедить клиента перейти от модели дерева решений к нейронной сети, и на то были веские причины: у нас был доступ к большому количеству данных, и большинство из них были временными. Клиент был согласен, но хотел сохранить понимание того, на чем модель основывает свои решения, что означает оценку важности ее характеристик.
Имеет ли это смысл?
Это спорный вопрос. В дереве решений или бустинг-модели важность признаков можно понять непосредственно с помощью установленного атрибута feature_importances для большинства деревьев решений или методов get_booster() и get_score() для моделей XGBoost.
Для нейронной сети таких атрибутов и методов не существует. Каждый нейрон обучается, чтобы узнать, когда ему активироваться или нет, на основе сигнала, который он получает, так что каждый слой извлекает некоторую информацию из исходного входного сигнала, вплоть до последнего слоя . Я даже слышал, как эксперты по глубокому обучению говорили, что лучше позволить данным самим говорить, а не пытаться понять модель. В принципе, полезно ли знать, что шерсть кошки оказывает большее влияние на нейронные сети, чем ее глаза? Возможно, нет. Но полезно знать, что для модели кошка на столе - это не меньшая кошка, чем кошка на полу, и именно этим мы здесь и займемся.
Оценка работы
Мы будем искать важностью признаков . Для классических моделей машинного обучения Scikit-Learn предоставляет функцию для этого. Если вы хотите использовать эту функцию в своей модели, этот фрагмент кода вычислит и отобразит ее важностью признаков:
Принцип важности перестановки
Допустим, у вас есть несколько студентов, и вы хотите оценить вероятность того, что они сдадут экзамен по математике. Для этого у вас есть доступ к 3 переменным: время, которое они потратили на подготовку к экзамену, их уровень знаний по математике и цвет волос.
В этом примере Пол много учился и умеренно способен к математике. С большой вероятностью он успешно сдаст экзамен по математике. Майк, с другой стороны, учился гораздо меньше и не очень способен в математике, он вряд ли добьется успеха. Боб вообще не учился, но он чрезвычайно талантлив, поэтому у него есть шансы.
Давайте изменим значения признака "Время учебы":
Пол перешел от того, чтобы много заниматься, к тому, чтобы не заниматься вообще. Его способности к математике будет недостаточно для компенсации, и теперь он вряд ли сдаст экзамен. Точно так же и у других студентов это изменение сильно повлияло на вероятность успеха.
Таким образом, мы можем сделать вывод, что время обучения является важной характеристикой для прогнозирования результатов экзамена.
Мы получим тот же результат, если изменим характеристику математических способностей:
Боб стал бездарным в математике и совсем не учился. Крайне маловероятно, что он сдаст экзамен.
По тем же соображениям, что и раньше, этот признак также важен.
Теперь, когда мы пермутируем признак цвета волос:
Переход Майка из блондина в темноволосого не улучшит его шансы на экзамене, как и любое изменение цвета волос не повлияет на любого студента. Поэтому эта особенность не имеет никакого значения для нашего прогноза.
Пределы применения данного метода
Допустим, что из 100 студентов у нас есть один списывающий, который сумел использовать шпаргалку, что гарантирует ему проходной балл на экзамене. Если мы переставим столбец "списывающий", у нас будет только один студент, переходящий от списывающего к не списывающему, и еще один студент, переходящий от не списывающего к списывающему. Из 100 студентов только двое будут затронуты, и мы ошибочно посчитаем этот признак несущественным из-за его малой распространенности.
Поэтому данный метод не будет хорошо работать на несбалансированных бинарных признаках и на категориальных признаках. В этих случаях лучше установить для всего столбца редкое значение и посмотреть, как это повлияет на прогноз (в нашей аналогии это означало бы установить для столбца "списывание" значение True для каждого студента).
Реализация
Первый шаг - сделать вывод на тестовом наборе данных. Затем, для каждого признака, вы перетасуете их случайным образом.
Когда все выводы сделаны, объедините их в один набор данных, а затем подсчитайте для каждого наблюдения, насколько каждый из них отклонился от первоначального прогноза.
После этого построим диаграмму отклонений всех наблюдений.
Для примера возьмем набор данных Kaggle для конкурса Home Credit Default Risk.
После предварительной обработки и обучения я получил два набора данных: X_test, содержащий статические данные для тестового набора, и X_test_batch, содержащий временные данные для обучающего набора.
Следующий фрагмент просматривает каждый признак и создает возмущенный вывод:
Затем этот фрагмент кода будет вычислять отклонение от исходного вывода для каждого смещения:
Наконец, этот фрагмент кода выведет значение важности признака:
У вас должен получиться такой график: