Как обрабатывать категориальные данные для предварительной обработки в машинном обучении - PullRequest
0 голосов
/ 26 ноября 2018

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

Мой образец DF:

  T-size Gender  Label
0      L      M      1
1      L      M      1
2      M      F      1
3      S      F      0
4      M      M      1
5      L      M      0
6      S      F      1
7      S      F      0
8      M      M      1

Я знаю, что следующий код преобразует мои категориальные данные в числовые

Тип-1:

df['T-size'] = df['T-size'].cat.codes

Выше строки просто преобразует категорию из 0 в N-1.Это не следует никакой связи между ними.

Для этого примера я знаю S

Type-2:

В этом типе I нет отношений между M и F. Но я могу сказать, что когда M имеет большую вероятность, чем F.т. е. выборка должна быть 1 / общее количество выборок

для мужчин,

(4/5)

дляЖенский,

(2/4)

WKT,

(4/5)> (2/4)

Как заменить столбец такого типа?

Могу ли я заменить M на (4/5) и F на (2/4) для этой проблемы?

Как правильно обращаться с колонкой?

помогите мне лучше понять это.

Ответы [ 4 ]

0 голосов
/ 26 ноября 2018

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

Таким образом, набор данных из:

Gender
M
F
M
M
F

станет

Gender_M    Gender_F
1           0
0           1
1           0
1           0
0           1

Это снимает любое представление о том, что одна вещь более "позитивна", чем другая - абсолютная необходимостьдля категориальных данных с более чем 2 вариантами, где нет транзитивных отношений A> B> C, и вы не хотите размазывать свои результаты, вводя их в схему кодирования.

0 голосов
/ 26 ноября 2018

Если вы хотите иметь иерархию в параметре размера, вы можете рассмотреть возможность использования для нее линейного отображения.Это будет:

size_mapping = {"S": 1, "M":2 , "L":3}

#mapping to the DataFrame
df['T-size_num'] = df['T-size'].map(size_mapping)

Это позволяет вам обрабатывать ввод как числовые данные, сохраняя иерархию

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

df['Gender_num'] = df['Gender'].map({'M':0 , 'F':1})

Для более подробного объяснения и охвата большего количества особенностей, чем ваш вопрос, я предлагаю прочитать эту статью относительно категориальных данных вМашинное обучение

0 голосов
/ 26 ноября 2018

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

Относительно вашегофутболки выше, вы можете дать категоричному типу панд заказ:

df['T-size'].astype(pd.api.types.CategoricalDtype(['S','M','L'],ordered=True)).

, если бы вы настроили свою футболку категорически таким образом, тогда ваш метод .cat.codes будет работать отлично.Это также означает, что вы можете легко использовать scikit-learn's LabelEconder, который отлично вписывается в конвейеры.

Что касается кодировки пола, вам нужно быть очень осторожным при использовании целевой переменной (вашей Label).Вы не хотите делать эту кодировку перед разделением теста на поезд, иначе вы используете знания ваших невидимых данных, что делает их невидимыми.Это становится еще более сложным, если вы используете перекрестную проверку, так как вам нужно выполнять кодирование в каждой итерации CV (то есть, новое кодирование для каждого раза).Если вы хотите сделать это, я рекомендую вам проверить TargetEncoder из кодировщиков категории skcontribs, но опять же, обязательно используйте это в пределах sklearn Pipeline, иначе вы испортите разделение теста поезда и информацию об утечкахиз вашего тестового набора в тренировочный набор.

0 голосов
/ 26 ноября 2018

Для первого вопроса, если у вас есть небольшое количество категорий, вы можете map столбец со словарем.Таким образом, вы можете установить порядок:

d = {'L':2, 'M':1, 'S':0}
df['T-size'] = df['T-size'].map(d)

Вывод:

   T-size Gender  Label
0       2      M      1
1       2      M      1
2       1      F      1
3       0      F      0 
4       1      M      1
5       2      M      0
6       0      F      1
7       0      F      0
8       1      M      1

Для второго вопроса вы можете использовать тот же метод, но я бы оставил 2 значения для мужчини женщины 0 и 1.Если вам нужна только категория и вам не нужно выполнять операции со значениями, значения равны другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...