Мысли и теория

На пути к созданию единой структуры для выбора функций с функциями ранжирования

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

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

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

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

Методы ранжирования выбора характеристик

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

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

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

Исходный уровень зачатия

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

Чтобы использовать его, нам нужно изолировать различные компоненты, которые нам понадобятся для создания нашей платформы; Предлагаемая мной модель основана на трех ключевых понятиях:

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

Теперь давайте перечислим основные функциональные возможности каждой категории компонентов, потому что это даст нам то, что нам нужно поставить на вершину нашей архитектуры:

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

Все, что нам нужно сделать сейчас, - это разработать нашу архитектуру сверху вниз и связать ее с нашими измерениями; это дало мне следующую архитектуру.

Тест на надежность

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

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

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

from inspect import getmembers, isclass
from sklearn.datasets import make_classification
from core.Feature_Selection import Evaluation_Function
from core.Feature_Selection.Ranking_Function import Ranking_Selection
X,y = make_classification(n_samples=1000, n_features=10, n_classes=2)
for i, j in (getmembers(Evaluation_Function, isclass)):
    if("Function" in i and not "CAT" in i):
        print("Testing: ",i, end=" ")
        EF = j()
        R = Ranking_Selection(j())
        c = R.fit(X, y)
        print("✓")

Эти несколько строк создадут набор данных из 10 функций и 1000 образцов, а метод get_member будет проверять сценарий Evaluation_Function, и для каждого класса в нем с «Function» в его имени мы выполним выбор ранжирования и напечатаем галочку, когда он Выполнено.

Используемые меры

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

  • Коэффициент корреляции Пирсона (от NumPy) - это мера расстояния, которая может быть получена путем вычисления отношения ковариации между двумя переменными.
  • Корреляция на основе сигналов (от NumPy) - еще одна мера корреляции, реализованная в NumPy.
  • Взаимная информация (от Scikit-learn) - это информационная мера, которая оценивает атрибут, измеряя уменьшение энтропии в классе, если мы разделим его относительно его значений.
  • Тест независимости Chi2 (от Scikit-learn) две переменные независимы, если P (X = x; Y = y) = P (X = x). P (Y = y), выполнив критерий Chi2 для этой гипотезы между атрибутом и классом, мы можем количественно оценить его важность.
  • Меры классификации: в качестве меры классификации для оценки каждого атрибута я обучил классификатор с набором данных, ограниченным этим конкретным атрибутом, и после этого измерил его точность; поскольку классификатор задается как параметр, я попробовал эту меру с помощью классификатора дерева решений, а затем добавил классификатор логистической регрессии.

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

Тест производительности

Каждый раз, когда мы реализуем новую функцию оценки, нас интересует не только ее соответствие структуре. Мы также хотим оценить его эффективность;

Итак, после проверки целостности, мы разработаем два простых теста производительности; Первый тест состоит из следующего:

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

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

Каждый тест проводится 10 раз, и время измеряется для каждой функции оценки.

Для первого теста с двадцатью атрибутами и только пятью информативными атрибутами мы получили следующие результаты на классификаторе SVM:

base :  0.8974500000000001   Time:  0.0
CHI2_Function :  0.52885   Time:  0.017551565170288087
CorrelationSP_Function :  0.7693999999999999   Time:  0.00019888877868652345
Correlation_Function :  0.8606   Time:  0.0020094394683837892
DTClassification_Function :  0.6241   Time:  0.09251418113708496
MI_Function :  0.89475   Time:  0.1389768123626709

База указывает точность, полученную при сохранении всех атрибутов. Мы можем заметить, что мы сохранили почти такую ​​же производительность для взаимной информации, уменьшив количество атрибутов на 80%; мы также замечаем, что функция CHI2 почти бесполезна, но это может быть связано с тем, что она особенно изменилась из-за наивной бинаризации, которую я использовал, которая заключается просто в делении диапазона данных на равные интервалы.

Давайте рассмотрим еще один пример с полным случайным набором данных, на этот раз мы возьмем 200 функций (только для 2000 выборок) и 50 информативных, мы получим следующие результаты:

base :  0.7943999999999999   Time:  0.0
CHI2_Function :  0.46049999999999996   Time:  0.171110200881958
Correlation_Function :  0.8112499999999998   Time:  0.019919610023498534
DTClassification_Function :  0.60955   Time:  0.9978075504302979
MI_Function :  0.8505000000000001   Time:  1.4385223627090453

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

Теперь давайте посмотрим на второй тест,

base :  0.9086666666666667   Time:  0.0
CHI2_Function :  0.946   Time:  0.01797773838043213
CorrelationSP_Function :  0.9740000000000001   Time:  0.00014123916625976562
Correlation_Function :  0.9693333333333334   Time:  0.0030328035354614258
DTClassification_Function :  0.3539999999999999   Time:  0.020097732543945312
MI_Function :  0.9493333333333334   Time:  0.091739821434021

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

Более надежный способ сравнения методов ранжирования

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

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

Это подтверждает, что:

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

Вывод:

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

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

Открытый вопрос:

Этот фреймворк открывает новый вопрос: можем ли мы использовать тот факт, что у нас есть много рейтингов функций? У меня есть небольшое представление об ответе; оставайтесь на связи, чтобы узнать об этом в ближайшее время :)

Не стесняйтесь присоединиться ко мне по почте ([email protected]) или на LinkedIn, если вы хотите обсудить эту тему.