У меня проблема классификации машинного обучения с 80% категориальных переменных. Должен ли я использовать одно горячее кодирование, если я хочу использовать какой-либо классификатор для классификации? Могу ли я передать данные классификатору без кодировки?
Я пытаюсь сделать следующее для выбора функции:
Прочитал досье поезда:
num_rows_to_read = 10000 train_small = pd.read_csv("../../dataset/train.csv", nrows=num_rows_to_read)
Я меняю тип категориальных признаков на «категория»:
non_categorial_features = ['orig_destination_distance', 'srch_adults_cnt', 'srch_children_cnt', 'srch_rm_cnt', 'cnt'] for categorical_feature in list(train_small.columns): if categorical_feature not in non_categorial_features: train_small[categorical_feature] = train_small[categorical_feature].astype('category')
Я использую одну горячую кодировку:
train_small_with_dummies = pd.get_dummies(train_small, sparse=True)
Проблема в том, что часто застревает 3-я деталь, хотя я использую крепкий станок.
Таким образом, без одного горячего кодирования я не могу выбрать какую-либо функцию для определения важности функций.
Что вы порекомендуете?
drop_first=True
сget_dummies
устраняет необходимость отбрасывать исходный столбец отдельноНамного проще использовать Pandas для простого однократного кодирования. Если вы ищете больше вариантов, вы можете использовать
scikit-learn
.Для базового однократного кодирования с помощью Pandas вы просто передаете свой фрейм данных в функцию get_dummies .
Например, если у меня есть фрейм данных imdb_movies :
... и я хочу быстро закодировать столбец Rated, я просто делаю это:
Это возвращает новый
dataframe
столбец для каждого « уровня » рейтинга, который существует, вместе с 1 или 0, указывающими наличие этого рейтинга для данного наблюдения.Обычно мы хотим, чтобы это было частью оригинала
dataframe
. В этом случае мы просто присоединяем наш новый фиктивный кодированный фрейм к исходному фрейму, используя " привязку столбца" .Мы можем связать столбцы с помощью функции Pandas concat :
Теперь мы можем провести полный анализ
dataframe
.ПРОСТАЯ ФУНКЦИЯ УТИЛИТЫ
Я бы порекомендовал сделать себе служебную функцию, чтобы сделать это быстро:
Использование :
Результат :
Кроме того, согласно комментарию @pmalbu, если вы хотите, чтобы функция удаляла исходный код feature_to_encode, используйте эту версию:
Вы можете кодировать несколько функций одновременно следующим образом:
источник
Вы можете сделать это с помощью
numpy.eye
и, используя механизм выбора элемента массива:Возвращаемое значение
indices_to_one_hot(nb_classes, data)
теперьОн
.reshape(-1)
нужен для того, чтобы убедиться, что у вас правильный формат этикеток (возможно, у вас тоже есть[[2], [3], [4], [0]]
).источник
Во-первых, самый простой способ горячего кодирования: использовать Sklearn.
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
Во-вторых, я не думаю, что использование панд для одного горячего кодирования - это так просто (хотя и не подтверждено)
Создание фиктивных переменных в пандах для Python
Наконец, нужно ли вам одно горячее кодирование? Одно горячее кодирование экспоненциально увеличивает количество функций, резко увеличивая время работы любого классификатора или всего, что вы собираетесь запускать. Особенно, когда у каждой категориальной характеристики много уровней. Вместо этого вы можете выполнить фиктивное кодирование.
Использование фиктивного кодирования обычно работает хорошо, значительно сокращая время выполнения и сложность. Один мудрый профессор однажды сказал мне: «Лучше меньше, да лучше».
Вот код моей пользовательской функции кодирования, если хотите.
РЕДАКТИРОВАТЬ: Сравнение для большей ясности:
Быстрое кодирование: преобразование n уровней в n-1 столбец.
Вы можете увидеть, как это взорвет вашу память, если у вас есть много разных типов (или уровней) в вашей категориальной функции. Имейте в виду, что это всего лишь ОДИН столбец.
Манекен кодирования:
Вместо этого конвертируйте в числовые представления. Значительно экономит место для функций за счет некоторой точности.
источник
mouse > cat > dog
но это не так.get_dummies
по моему опыту (хотя и очень ограниченному)Одно горячее кодирование с помощью pandas очень просто:
РЕДАКТИРОВАТЬ:
Другой способ one_hot с использованием sklearn
LabelBinarizer
:источник
Вы можете использовать функцию numpy.eye.
результат
источник
pandas as имеет встроенную функцию "get_dummies" для получения одной горячей кодировки этого конкретного столбца / столбцов.
однострочный код для быстрого кодирования:
источник
Вот решение, использующее
DictVectorizer
иDataFrame.to_dict('records')
метод Pandas .источник
Одноразовое кодирование требует немного большего, чем просто преобразование значений в индикаторные переменные. Обычно процесс машинного обучения требует, чтобы вы применили это кодирование несколько раз для проверки или тестирования наборов данных и применяли модель, которую вы построили, к наблюдаемым данным в реальном времени. Вы должны сохранить отображение (преобразование), которое использовалось для построения модели. Хорошее решение - использовать
DictVectorizer
илиLabelEncoder
(за которым следуетget_dummies
. Вот функция, которую вы можете использовать:Это работает с фреймом данных pandas, и для каждого столбца фрейма данных он создает и возвращает отображение. Вы бы назвали это так:
Затем для тестовых данных вызов выполняется путем передачи словаря, возвращенного из обучения:
Эквивалентный метод - использовать
DictVectorizer
. Соответствующий пост об этом есть в моем блоге. Я упоминаю его здесь , так как он обеспечивает некоторые рассуждения позади этого подхода по сравнению с простым использованием get_dummies опубликовать (раскрытие: это мой собственный блог).источник
Вы можете передать данные в классификатор catboost без кодирования. Catboost сам обрабатывает категориальные переменные, выполняя одноразовое и целевое расширяющееся среднее кодирование.
источник
Вы также можете сделать следующее. Обратите внимание на нижеприведенное, вам не нужно использовать
pd.concat
.Вы также можете изменить явные столбцы на категориальные. Например, здесь я меняю
Color
иGroup
источник
Я знаю, что опаздываю на эту вечеринку, но самый простой способ горячего кодирования фрейма данных автоматическим способом - использовать эту функцию:
источник
Я использовал это в своей акустической модели: вероятно, это помогает в вашей модели.
источник
Чтобы добавить к другим вопросам, позвольте мне рассказать, как я сделал это с помощью функции Python 2.0 с помощью Numpy:
Линия
n_values = np.max(y_) + 1
можно жестко запрограммировать, чтобы использовать достаточное количество нейронов, например, в случае использования мини-пакетов.Демо-проект / учебник, в котором использовалась эта функция: https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition
источник
Это работает для меня:
Вывод:
источник
Это может и должно быть просто:
Использование :
источник
Расширение ответа @Martin Thoma
источник
Короткий ответ
Вот функция для выполнения быстрого кодирования без использования numpy, pandas или других пакетов. Требуется список целых чисел, логических значений или строк (а также, возможно, других типов).
Пример:
Длинный (эр) ответ
Я знаю, что на этот вопрос уже есть много ответов, но я заметил две вещи. Во-первых, в большинстве ответов используются такие пакеты, как numpy и / или pandas. И это хорошо. Если вы пишете производственный код, вам, вероятно, следует использовать надежные и быстрые алгоритмы, подобные тем, которые представлены в пакетах numpy / pandas. Но я считаю, что ради образования кто-то должен дать ответ, который имеет прозрачный алгоритм, а не просто реализацию чужого алгоритма. Во-вторых, я заметил, что многие ответы не обеспечивают надежную реализацию однократного кодирования, потому что они не соответствуют одному из требований ниже. Ниже приведены некоторые из требований (как я их вижу) для полезной, точной и надежной функции однократного кодирования:
Функция однократного кодирования должна:
Я проверил многие ответы на этот вопрос, и большинство из них не соответствуют одному из приведенных выше требований.
источник
Попробуй это:
df_encoded.head ()
Результирующий фрейм данных
df_train_encoded
такой же, как и исходный, но категориальные функции теперь заменены их версиями с горячим кодированием.Больше информации
category_encoders
здесь .источник
Здесь я попробовал такой подход:
источник