Вопрос или проблема
Мой набор данных содержит около 29 признаков с 3 метками классов в качестве результата. Среди этих 29 признаков около 24 признаков являются категориальными, я не могу преобразовать каждую категорию в числа, так как в некоторых признаках их более 30.
Что я сделал, так это кодирование меток. Поскольку весь мой датафрейм закодирован с помощью кодировщика меток, как я должен делать прогнозы, если я не знаю, какие числа были использованы кодировщиком меток для данных? Что, если конечный пользователь вводит категорию, которая уже не присутствует в датафрейме и не была закодирована ранее?
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
data=data.apply(le.fit_transform)
Этот код закодировал мой датафрейм в числа. Теперь что мне делать, если я хочу напечатать конкретную категорию в ее числовом преобразованном виде? Должен ли я использовать кодировщик меток или какую-то другую технику, так как я применил метод случайного леса к своему набору данных?
Этот подход, по моему мнению, вряд ли будет работать хорошо. Я думаю, вам следует более тщательно проанализировать свои данные перед применением технических обходных решений к признакам.
- Во-первых, кодировщик меток представляет значения в качестве целых чисел. Это вводит порядок, что может привести к смещению в модели. В частности, есть большой риск переобучения.
- Если вы это сделаете, очевидно, вам нужно сохранить соответствие между категорией и целым числом. Вам потребуется возможность преобразования в обоих направлениях.
- Новая категория не имеет смысла для модели с учителем: модель не была обучена на ней, так что она может с ней сделать?
Многое зависит от размера набора данных (какой он?), но на мой взгляд, лучше было бы использовать следующий метод:
- Во-первых, измерьте корреляцию каждого признака с целевой переменной. Если корреляция близка к нулю, признак можно удалить.
- Каждый оставшийся категориальный признак желательно закодировать методом one-hot. Но редкие значения сначала следует удалить (например, если $n\leq 3$), потому что эти случаи могут вызвать переобучение и вряд ли помогут в определении целевой переменной. – Общий способ удалить редкие значения для признака заключается в том, чтобы присвоить специальное значение
unknown
вместо оригинального значения. Это имеет преимущество в том, что его также можно использовать при применении модели к любому значению признака, которое было неизвестно во время обучения.
Этот процесс должен значительно сократить количество значений, а следовательно, сделать окончательное количество признаков более разумным.
Ответ или решение
Для предсказания на данных, которые закодированы с помощью меток, существует несколько аспектов, на которые следует обратить внимание. Ваша задача может усложниться, если работа будет проведена с категориальными данными, которых слишком много, как это видно из вашего описания. Давайте разберемся, как решить вашу задачу более эффективно и минимизировать риски.
Проблема кодирования категориальных данных
Вы указали, что использовали LabelEncoder
для кодирования 24 категориальных признаков. Основная проблема использования меток в этой ситуации заключается в том, что данный метод присваивает каждой категории уникальное целое число. Это может не только создать искажение данных, но и ввести модель в заблуждение из-за введенной порядковости между закодированными числами.
Всеобъемлющий подход к предсказанию
1. Сохранение соответствия меток и категорий
При использовании LabelEncoder
важно сохранить мapping (соответствие) между категориальными значениями и закодированными числами. Это можно сделать, храня в словаре каждую категорию и ее соответствующее значение. Например:
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
data['column_name'] = le.fit_transform(data['column_name'])
mapping = dict(zip(le.classes_, le.transform(le.classes_)))
# Сохраните mapping для дальнейшего использования
Таким образом, вы сможете преобразовать закодированные числа обратно в категории, если это необходимо.
2. Обработка неизвестных категорий
Когда конечный пользователь вводит категорию, которой нет в обучающем наборе данных, это может вызвать проблемы. Возможные решения включают:
-
Присвоение категории "неизвестно": Если категория введена, но не существует в обучающей выборке, вы можете назначить ее значение
-1
или как категорию "unknown". Это позволит модели распознавать новые значения, обеспечивая в то же время остановку возникновения ошибок. -
Фильтрация редких классов: Лучше всего заранее удалять из данных редкие классы. Если количество наблюдений в категории меньше определенного числа (например, меньше 3), вы можете заменить их на категорию "unknown". Этот подход поможет уменьшить избыточность и улучшить общую стабильность модели.
3. Использование техник кодирования
С учётом особенностей вашего набора данных, следует рассмотреть альтернативные методы кодирования:
-
One-Hot Encoding: Этот метод часто более предпочтителен для категориальных данных, поскольку он не вводит порядковость. Однако учтите, что он может резко увеличить размерность данных, если количество категорий велико.
-
Target Encoding: Кодирование на основе целевой переменной, где категории заменяются средним целевым значением. Эта техника требует осторожности, чтобы избежать переобучения.
4. Взаимосвязь признаков и целевой переменной
Перед тем как делать предсказания, рекомендуется изучить корреляцию между всеми признаками и целевой переменной. Это поможет вам идентифицировать незначительные или нерелевантные признаки, которые можно будет удалить для повышения производительности модели.
Заключение
Работа с категориальными данными требует тщательного подхода, чтобы избежать искажений в модели. Храните соответствия между значениями и их кодировками, обрабатывайте неизвестные категории, используйте методики, соответствующие вашей задаче, и всегда анализируйте данные на наличие избыточности. Это обеспечит надежные и стабильные предсказания, минимизируя риски, связанные с переобучением и неправильной интерпретацией данных.