Вопрос или проблема
Я работаю с набором данных, который содержит 30 столбцов (29 числовых и 1 ненумеративный категориальный). Я применил метод one-hot кодирования для категориальной переменной и в итоге получил 35 столбцов. Чтобы улучшить эффективность обучения, хочу провести отбор признаков в моем наборе данных. Однако я запутался, как работать с набором данных, содержащим как категориальные, так и числовые признаки.
- Я читал, что применять PCA к фиктивным переменным нецелесообразно, так как они дискретные. Уместно ли сначала применить PCA к числовым признакам, а затем объединить их с фиктивными?
- Я пытался применить рекурсивное исключение признаков с кросс-валидацией (RFECV) ко всему пространству признаков. Но я не думаю, что целесообразно удалять некоторые фиктивные признаки, но не все, так как они получены из одной категории.
Есть ли какие-нибудь предложения? Буду признателен за любую помощь.
python pandas scikit-learn отбор-признаков
Применение техники отбора признаков к переменным, закодированным методом one-hot, вполне допустимо. Потому что если какой-то сегмент этой переменной коррелирует с вашей целевой переменной, это хорошая новость. Ваша модель лучше поймет ситуацию.
Или вы можете сначала закодировать категориальную переменную метками, чтобы у вас осталось 30 переменных (29 числовых + 1 закодированная категориальная переменная). Теперь попробуйте определить значимость каждого признака и оставьте только релевантные (используйте любой метод для этого: будь то RFE, отбор признаков с помощью случайного леса, корреляция Пирсона и т. д.). Как только у вас будет окончательный список признаков, а закодированная переменная тоже окажется актуальной, можно включать её в модель.
Отбор признаков или инженерия признаков больше является искусством, чем просто применением доступных техник.
Я рекомендую вам заниматься/изучать интеллектуальный EDA и пытаться устранить/создать/объединить признаки.
– Kaggle имеет множество ядер/обсуждений на эту тему.
– Для обогащения интуиции прочитайте эту книгу, особенно главу #04. Инженерия и отбор признаков. Обратите внимание, как автор проводит анализ различных находок в EDA.
Кодирование категориальных признаков –
– У вас только 1 категориальный признак с небольшой кардинальностью и 29 числовых признаков. Я бы посоветовал устранить числовые признаки. Вы можете попробовать PCA на подмножестве признаков. Ссылка.
Попробуйте на 29 и посмотрите на результаты.
– Попробуйте другие подходы к кодированию категориальных данных. Используйте эти ссылки category_encoders. Читайте ссылки из справочного раздела, чтобы получить больше понимания. Даже для OHE вам понравится эта библиотека.
незаслуженно удалять некоторые, но не все фиктивные признаки, так как они получены из одной категории
Как только вы закодируете категориальный признак, у вас появится новый набор признаков. Вы рассматриваете каждый из них как независимый признак. Возможно, по результатам анализа окажется, что лишь несколько из них не полезны, и мы удалим их.
PCA для данных с кодированием One Hot
-Вы получите вывод, но я не уверен насчет добавления в предсказательную силу. Есть несколько противоречивых ссылок. Ссылка – Reddit $\hspace{1cm}$Ссылка – SE
– Есть и другие техники, предлагаемые для категориальных и смешанных данных. Ссылка-SE $\hspace{1cm}$Библиотека
Попробуйте разные комбинации и посмотрите.
В конце концов, попробуйте технику важности признаков, используя случайный лес.Ссылка – MachineLearning Mastery
Вы можете использовать пакет Dython для получения корреляции между всеми видами переменных (категориальными и числовыми) и затем установить порог для выбора необходимых переменных. Например, вы можете выбрать переменные, имеющие корреляцию более 0.5 с вашей целевой переменной. После этого вы можете построить основную модель на их основе.
Основываясь на тегах, которые вы предоставили для этого вопроса, хорошим (но не обязательно лучшим) и очень простым подходом было бы использовать SelectFromModel
. Я бы использовал RandomForestClassifier
, поскольку он хорошо обрабатывает наборы данных с числовыми и категориальными признаками и достаточно устойчив к нереформатированным признакам.
Вы правы – удалять некоторые, но не все фиктивные переменные, неправильно. На самом деле, удаление их изменит их значение. Если у вас есть возможность, просто не применяйте OHE для категориальных признаков на этапе выбора признаков, а (возможно) сделайте это после. Более того, если вы используете вышеупомянутое предложение (SelectFromModel
+ RandomForestClassifier
), вам действительно не нужно кодировать категориальные признаки методом OHE. Вы можете просто использовать LabelEncoder
Ответ или решение
Как выполнить отбор признаков в наборе данных с категориальными и числовыми признаками
Отбор признаков является важным этапом в машинном обучении, который может значительно улучшить производительность модели и ускорить процесс обучения. В данной статье рассмотрим, как выполнять отбор признаков на наборе данных, состоящем как из числовых, так и категориальных признаков.
Подготовка данных
В вашем случае у вас есть 30 столбцов (29 числовых и 1 ненормированный категориальный), который был один раз закодирован методом "one-hot" (OHE), что привело к созданию 35 колонок. Это необходимо учитывать при выборе методов для отбора признаков.
1. Кодирование категориальных признаков
Прежде всего, необходимо правильно закодировать ваши категориальные признаки. Рассмотрим несколько методов:
- One-Hot Encoding (OHE): Это стандартный метод для кодирования категориальных переменных. Однако важно помнить, что удаление некоторых из закодированных переменных может изменить смысл остальных, так как они могут быть взаимозависимы.
- Label Encoding: В случая, если категориальная переменная является порядковой, вы можете использовать кодирование метками, чтобы сохранить её в одной колонке. Так вы уменьшите размерность. Однако для ненормальных категорий данный метод может ввести ложные взаимосвязи.
Рекомендуется сначала выполнить анализ зависимостей между переменными и целевой переменной.
2. Подбор метода отбора признаков
Существует несколько методов, подходящих для отбора признаков в вашем наборе данных с комбинацией категориальных и числовых переменных:
А. Метод "Random Forest"
Используйте модель случайного леса (RandomForestClassifier
или RandomForestRegressor
). Случайные леса хорошо справляются с разнородными данными и могут выполняться с использованием как металлизованных, так и категориальных переменных. Признаки, которые имеют большую важность, можно выбрать с помощью метода SelectFromModel
:
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
# Обучение модели
model = RandomForestClassifier()
model.fit(X_train, y_train)
# Отбор признаков
selector = SelectFromModel(model, prefit=True)
X_selected = selector.transform(X_train)
B. Обратное устранение признаков (RFE)
Метод рекурсивного удаления признаков (RFE) также может быть полезен. Однако, как вы отметили, нужно соблюдать осторожность с категориальными переменными, чтобы не убрать взаимозависимые наряду с наиболее значительными.
C. Кросс-валидация
Использование кросс-валидации (например, с помощью RFECV
) позволит вам оценить производительность модели при каждом шаге отбора признаков.
3. Применение PCA
Применение анализа основных компонентов (PCA) не рекомендуется для закодированных OHE переменных, так как они являются дискретными. Однако можно применить PCA только к числовым признакам, а затем объединить с закодированным категориальным признаком. Таким образом, вы сможете уменьшить размерность числовых признаков, а также сохранить категориальные в модель, анализируя их важность.
4. Исследовательский анализ данных (EDA)
Важно выполнить хорошую исследовательскую анализ данных (EDA) перед отбором признаков. Это поможет вам выявить корреляции между признаками и целевой переменной. Используйте графики и статистические меры для понимания зависимости.
Итоговые рекомендации
- Начните с хорошего анализа данных и корреляционных матриц.
- Экспериментируйте с различными методами кодирования категориальных переменных.
- Для отбора признаков используйте комбинацию методов, включая Random Forest и RFE.
- Убедитесь, что все действия по отбору признаков соответствуют логике и не создают искажений в данных.
Следуя этим рекомендациям, вы сможете эффективно выполнить отбор признаков в вашем наборе данных, улучшая производительность и эффективность ваших моделей машинного обучения.