Применение методов фильтрации в Python для выбора функций

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

Вступление

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

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

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

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

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

Методы фильтрации для выбора функций

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

Методы фильтрации можно в общих чертах разделить на две категории: методы одномерного фильтра и методы многомерного фильтра .

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

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

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

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

Удаление постоянных функций

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

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

  • это набор данных Santandar Customer Satisfaction , который можно загрузить с Kaggle. Воспользуемся файлом train.csv. Однако я переименовал его в «santandar_data.csv» для удобства чтения.
Импорт необходимых библиотек и набора данных

Постоянные объекты имеют значения с нулевой дисперсией, поскольку все значения одинаковы. Мы можем найти постоянные столбцы с помощью функции VarianceThreshold библиотеки Python Scikit Learn. Выполните следующий сценарий, чтобы импортировать необходимые библиотеки и набор данных:

 import pandas as pd 
 import numpy as np 
 from sklearn.model_selection import train_test_split 
 from sklearn.feature_selection import VarianceThreshold 
 
 santandar_data = pd.read_csv(r"E:\Datasets\santandar_data.csv", nrows=40000) 
 santandar_data.shape 

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

Разделение данных на обучающие и тестовые наборы

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

 train_features, test_features, train_labels, test_labels=train_test_split( 
 santandar_data.drop(labels=['TARGET'], axis=1), 
 santandar_data['TARGET'], 
 test_size=0.2, 
 random_state=41) 
Удаление постоянных объектов с помощью порога отклонения

Пришло время удалить постоянные особенности. Для этого мы будем использовать VarianceThreshold которую мы импортировали ранее. Функция требует значения для своего threshold параметра. При передаче нулевого значения для параметра все функции будут отфильтрованы с нулевой дисперсией. Выполните следующий сценарий, чтобы создать фильтр для постоянных функций.

 constant_filter = VarianceThreshold(threshold=0) 

Затем нам нужно просто применить этот фильтр к нашему обучающему набору, как показано в следующем примере:

 constant_filter.fit(train_features) 

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

 len(train_features.columns[constant_filter.get_support()]) 

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

Точно так же вы можете найти количество постоянных функций с помощью следующего скрипта:

 constant_columns = [column for column in train_features.columns 
 if column not in train_features.columns[constant_filter.get_support()]] 
 
 print(len(constant_columns)) 

Чтобы увидеть все столбцы констант, выполните следующий скрипт:

 for column in constant_columns: 
 print(column) 

Outpu выглядит примерно так:

 ind_var2_0 
 ind_var2 
 ind_var18_0 
 ind_var18 
 ind_var27_0 
 ind_var28_0 
 ind_var28 
 ind_var27 
 ind_var34_0 
 ind_var34 
 ind_var41 
 ind_var46_0 
 ind_var46 
 num_var18_0 
 num_var18 
 num_var27_0 
 num_var28_0 
 num_var28 
 num_var27 
 num_var34_0 
 num_var34 
 num_var41 
 num_var46_0 
 num_var46 
 saldo_var18 
 saldo_var28 
 saldo_var27 
 saldo_var34 
 saldo_var41 
 saldo_var46 
 delta_imp_amort_var18_1y3 
 delta_imp_amort_var34_1y3 
 imp_amort_var18_hace3 
 imp_amort_var18_ult1 
 imp_amort_var34_hace3 
 imp_amort_var34_ult1 
 imp_reemb_var13_hace3 
 imp_reemb_var17_hace3 
 imp_reemb_var33_hace3 
 imp_trasp_var17_out_hace3 
 imp_trasp_var33_out_hace3 
 num_var2_0_ult1 
 num_var2_ult1 
 num_reemb_var13_hace3 
 num_reemb_var17_hace3 
 num_reemb_var33_hace3 
 num_trasp_var17_out_hace3 
 num_trasp_var33_out_hace3 
 saldo_var2_ult1 
 saldo_medio_var13_medio_hace3 

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

 train_features = constant_filter.transform(train_features) 
 test_features = constant_filter.transform(test_features) 
 
 train_features.shape, test_features.shape 

Если вы выполните приведенный выше сценарий, вы увидите, что и наши обучающие, и тестовые наборы теперь будут содержать 320 столбцов, поскольку 50 постоянных столбцов были удалены.

Удаление квазипостоянных функций

Квазипостоянные характеристики, как следует из названия, - это почти постоянные характеристики. Другими словами, эти функции имеют одинаковые значения для очень большого подмножества выходных данных. Такие функции не очень полезны для прогнозирования. Нет правила относительно того, каким должен быть порог дисперсии квазипостоянных характеристик. Однако, как правило, удалите те квазипостоянные объекты, которые имеют более чем 99% схожие значения для выходных наблюдений.

В этом разделе мы создадим квазипостоянный фильтр с помощью функции VarianceThreshold Однако вместо того, чтобы передавать 0 в качестве значения для threshold , мы передадим 0,01, что означает, что если дисперсия значений в столбце меньше 0,01, удалите этот столбец. Другими словами, удалите столбец функций, в котором примерно 99% значений аналогичны.

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

Импорт необходимых библиотек и набора данных

Выполните следующий сценарий, чтобы импортировать набор данных и нужные библиотеки:

 import pandas as pd 
 import numpy as np 
 from sklearn.model_selection import train_test_split 
 from sklearn.feature_selection import VarianceThreshold 
 
 santandar_data = pd.read_csv(r"E:\Datasets\santandar_data.csv", nrows=40000) 
 santandar_data.shape 
Разделение данных на обучающие и тестовые наборы
 train_features, test_features, train_labels, test_labels = train_test_split( 
 santandar_data.drop(labels=['TARGET'], axis=1), 
 santandar_data['TARGET'], 
 test_size=0.2, 
 random_state=41) 
Удаление постоянных объектов с помощью порога отклонения

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

 constant_filter = VarianceThreshold(threshold=0) 
 constant_filter.fit(train_features) 
 
 len(train_features.columns[constant_filter.get_support()]) 
 
 constant_columns = [column for column in train_features.columns 
 if column not in train_features.columns[constant_filter.get_support()]] 
 
 train_features.drop(labels=constant_columns, axis=1, inplace=True) 
 test_features.drop(labels=constant_columns, axis=1, inplace=True) 
Удаление квазипостоянных признаков с помощью порога отклонения

Создадим наш квазипостоянный фильтр. Для этого выполните следующий сценарий:

 qconstant_filter = VarianceThreshold(threshold=0.01) 

Остальные шаги такие же. Нам нужно применить фильтр к нашему обучающему набору, используя fit() как показано ниже.

 qconstant_filter.fit(train_features) 

Давайте проверим количество наших неквазипостоянных столбцов. Выполните следующий скрипт:

 len(train_features.columns[qconstant_filter.get_support()]) 

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

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

 qconstant_columns = [column for column in train_features.columns 
 if column not in train_features.columns[qconstant_filter.get_support()]] 
 
 print(len(qconstant_columns)) 

Вы должны увидеть 55 на выходе.

Теперь напечатаем имена всех квазипостоянных столбцов. Выполните следующий скрипт:

 for column in qconstant_columns: 
 print(column) 

На выходе вы должны увидеть следующие имена столбцов:

 ind_var1 
 ind_var6_0 
 ind_var6 
 ind_var13_largo 
 ind_var13_medio_0 
 ind_var13_medio 
 ind_var14 
 ind_var17_0 
 ind_var17 
 ind_var19 
 ind_var20_0 
 ind_var20 
 ind_var29_0 
 ind_var29 
 ind_var30_0 
 ind_var31_0 
 ind_var31 
 ind_var32_cte 
 ind_var32_0 
 ind_var32 
 ind_var33_0 
 ind_var33 
 ind_var40 
 ind_var39 
 ind_var44_0 
 ind_var44 
 num_var6_0 
 num_var6 
 num_var13_medio_0 
 num_var13_medio 
 num_op_var40_hace3 
 num_var29_0 
 num_var29 
 delta_imp_aport_var33_1y3 
 delta_num_aport_var33_1y3 
 ind_var7_emit_ult1 
 ind_var7_recib_ult1 
 num_aport_var33_hace3 
 num_aport_var33_ult1 
 num_var7_emit_ult1 
 num_meses_var13_medio_ult3 
 num_meses_var17_ult3 
 num_meses_var29_ult3 
 num_meses_var33_ult3 
 num_meses_var44_ult3 
 num_reemb_var13_ult1 
 num_reemb_var17_ult1 
 num_reemb_var33_ult1 
 num_trasp_var17_in_hace3 
 num_trasp_var17_in_ult1 
 num_trasp_var17_out_ult1 
 num_trasp_var33_in_hace3 
 num_trasp_var33_in_ult1 
 num_trasp_var33_out_ult1 
 num_venta_var44_hace3 

Наконец, чтобы увидеть, содержат ли наши обучающие и тестовые наборы только непостоянные и qconstant_filter transform() для qconstant_filter. Для этого выполните следующий сценарий:

 train_features = qconstant_filter.transform(train_features) 
 test_features = qconstant_filter.transform(test_features) 
 
 train_features.shape, test_features.shape 

Если вы выполните приведенный выше сценарий, вы увидите, что и наши обучающие, и тестовые наборы теперь будут содержать 265 столбцов, поскольку 50 постоянных и 55 квазиконстантных столбцов были удалены из 370 столбцов по умолчанию.

Удаление повторяющихся функций

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

Импорт необходимых библиотек и набора данных

Выполните следующий сценарий, чтобы импортировать набор данных и нужные библиотеки:

 import pandas as pd 
 import numpy as np 
 from sklearn.model_selection import train_test_split 
 from sklearn.feature_selection import VarianceThreshold 
 
 santandar_data = pd.read_csv(r"E:\Datasets\santandar_data.csv", nrows=20000) 
 santandar_data.shape 

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

Разделение данных на обучающие и тестовые наборы
 train_features, test_features, train_labels, test_labels = train_test_split( 
 santandar_data.drop(labels=['TARGET'], axis=1), 
 santandar_data['TARGET'], 
 test_size=0.2, 
 random_state=41) 
Удаление повторяющихся объектов с помощью транспонирования

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

 train_features_T = train_features.T 
 train_features_T.shape 

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

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

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

 print(train_features_T.duplicated().sum()) 

На выходе вы должны увидеть 94.

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

 unique_features = train_features_T.drop_duplicates(keep='first').T 

Теперь давайте распечатаем форму нашего нового обучающего набора без повторяющихся функций:

 unique_features.shape 

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

Чтобы увидеть имена повторяющихся столбцов, выполните этот скрипт:

 duplicated_features = [dup_col for dup_col in train_features.columns if dup_col not in unique_features.columns] 
 duplicated_features 

На выходе вы должны увидеть следующие столбцы:

 ['ind_var2', 
 'ind_var13_medio', 
 'ind_var18_0', 
 'ind_var18', 
 'ind_var26', 
 'ind_var25', 
 'ind_var27_0', 
 'ind_var28_0', 
 'ind_var28', 
 'ind_var27', 
 'ind_var29_0', 
 'ind_var29', 
 'ind_var32', 
 'ind_var34_0', 
 'ind_var34', 
 'ind_var37', 
 'ind_var40_0', 
 'ind_var40', 
 'ind_var41', 
 'ind_var39', 
 'ind_var46_0', 
 'ind_var46', 
 'num_var13_medio', 
 'num_var18_0', 
 'num_var18', 
 'num_var26', 
 'num_var25', 
 'num_op_var40_hace3', 
 'num_op_var39_hace3', 
 'num_var27_0', 
 'num_var28_0', 
 'num_var28', 
 'num_var27', 
 'num_var29_0', 
 'num_var29', 
 'num_var32', 
 'num_var34_0', 
 'num_var34', 
 'num_var37', 
 'num_var40_0', 
 'num_var40', 
 'num_var41', 
 'num_var39', 
 'num_var46_0', 
 'num_var46', 
 'saldo_var18', 
 'saldo_var28', 
 'saldo_var27', 
 'saldo_var29', 
 'saldo_var34', 
 'saldo_var40', 
 'saldo_var41', 
 'saldo_var46', 
 'delta_imp_amort_var18_1y3', 
 'delta_imp_amort_var34_1y3', 
 'delta_imp_reemb_var33_1y3', 
 'delta_imp_trasp_var17_out_1y3', 
 'delta_imp_trasp_var33_out_1y3', 
 'delta_num_reemb_var13_1y3', 
 'delta_num_reemb_var17_1y3', 
 'delta_num_reemb_var33_1y3', 
 'delta_num_trasp_var17_in_1y3', 
 'delta_num_trasp_var17_out_1y3', 
 'delta_num_trasp_var33_in_1y3', 
 'delta_num_trasp_var33_out_1y3', 
 'imp_amort_var18_hace3', 
 'imp_amort_var18_ult1', 
 'imp_amort_var34_hace3', 
 'imp_amort_var34_ult1', 
 'imp_var7_emit_ult1', 
 'imp_reemb_var13_hace3', 
 'imp_reemb_var17_hace3', 
 'imp_reemb_var33_hace3', 
 'imp_reemb_var33_ult1', 
 'imp_trasp_var17_out_hace3', 
 'imp_trasp_var17_out_ult1', 
 'imp_trasp_var33_in_hace3', 
 'imp_trasp_var33_out_hace3', 
 'ind_var7_emit_ult1', 
 'num_var2_0_ult1', 
 'num_var2_ult1', 
 'num_var7_emit_ult1', 
 'num_reemb_var13_hace3', 
 'num_reemb_var17_hace3', 
 'num_reemb_var33_hace3', 
 'num_reemb_var33_ult1', 
 'num_trasp_var17_out_hace3', 
 'num_trasp_var17_out_ult1', 
 'num_trasp_var33_in_hace3', 
 'num_trasp_var33_out_hace3', 
 'saldo_var2_ult1', 
 'saldo_medio_var13_medio_hace3', 
 'saldo_medio_var13_medio_ult1', 
 'saldo_medio_var29_hace3'] 

Удаление коррелированных функций

В дополнение к повторяющимся объектам набор данных может также содержать коррелированные объекты. Два или более двух объектов коррелируют, если они расположены близко друг к другу в линейном пространстве .

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

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

Набор данных, который мы собираемся использовать в этом разделе, - это набор данных BNP Paribas Cardif Claims Management , который можно загрузить с Kaggle. Выполните следующие действия, чтобы найти и удалить коррелированные объекты из набора данных.

Импорт необходимых библиотек и набора данных

Выполните следующий сценарий, чтобы импортировать набор данных и нужные библиотеки:

 import pandas as pd 
 import numpy as np 
 from sklearn.model_selection import train_test_split 
 from sklearn.feature_selection import VarianceThreshold 
 
 paribas_data = pd.read_csv(r"E:\Datasets\paribas_data.csv", nrows=20000) 
 paribas_data.shape 

В приведенном выше сценарии я импортировал набор данных вместе с необходимыми библиотеками. Затем мы распечатали форму нашего фрейма данных. В выводе вы должны увидеть (20000, 133), что означает, что наш набор данных содержит 20 тысяч строк и 133 объекта.

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

Предварительная обработка данных

Выполните следующий сценарий, чтобы удалить нечисловые функции из набора данных.

 num_colums = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64'] 
 numerical_columns = list(paribas_data.select_dtypes(include=num_colums).columns) 
 paribas_data = paribas_data[numerical_columns] 

В первой строке приведенного выше сценария мы определяем список, содержащий типы данных столбцов, которые мы хотим сохранить в нашем наборе данных. Затем мы вызываем метод select_dtypes() для нашего набора данных и передаем ему num_colums , содержащий тип столбцов, который мы хотим сохранить. Метод select_dtypes() вернет имена указанных числовых столбцов, которые мы храним в списке numeric_columns . Затем мы фильтруем наши столбцы из paribas_data с помощью списка numerical_colums Давайте распечатаем форму paribas_data чтобы увидеть, сколько числовых столбцов у нас есть, выполните следующий скрипт:

 paribas_data.shape 

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

Разделение данных на обучающие и тестовые наборы

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

 train_features, test_features, train_labels, test_labels = train_test_split( 
 paribas_data.drop(labels=['target', 'ID'], axis=1), 
 paribas_data['target'], 
 test_size=0.2, 
 random_state=41) 

В приведенном выше скрипте мы делим наши данные на 80% обучающий и 20% тестовый набор.

Удаление коррелированных признаков с помощью метода corr ()

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

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

 correlated_features = set() 
 correlation_matrix = paribas_data.corr() 

В приведенном выше скрипте мы создаем матрицу correlation_matrix для всех столбцов в нашем наборе данных. Мы также создали набор correlated_features который будет содержать имена всех коррелированных функций.

Затем мы пройдемся по всем столбцам в correlation_matrix и добавим столбцы со значением корреляции 0,8 в correlated_features как показано ниже. Вы можете установить любое пороговое значение для корреляции.

 for i in range(len(correlation_matrix .columns)): 
 for j in range(i): 
 if abs(correlation_matrix.iloc[i, j]) > 0.8: 
 colname = correlation_matrix.columns[i] 
 correlated_features.add(colname) 

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

 len(correlated_features) 

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

 print(correlated_features) 

Результат выглядит так:

 {'v55', 'v105', 'v130', 'v12', 'v60', 'v67', 'v63', 'v46', 'v53', 'v43', 'v68', 'v123', 'v95', 'v103', 'v44', 'v108', 'v89', 'v104', 'v109', 'v83', 'v115', 'v21', 'v101', 'v93', 'v40', 'v78', 'v54', 'v118', 'v124', 'v73', 'v96', 'v121', 'v77', 'v114', 'v48', 'v116', 'v87', 'v86', 'v65', 'v122', 'v64', 'v81', 'v128', 'v49', 'v37', 'v84', 'v98', 'v111', 'v41', 'v25', 'v106', 'v32', 'v126', 'v76', 'v100'} 

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

Следующий скрипт удаляет эти столбцы из набора данных:

 train_features.drop(labels=correlated_features, axis=1, inplace=True) 
 test_features.drop(labels=correlated_features, axis=1, inplace=True) 

Заключение

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

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

В следующей статье мы рассмотрим некоторые другие типы методов выбора функций. А пока удачного кодирования!

comments powered by Disqus