Способ сближения категориальных данных в алгоритме кластеризации k-средних в Python - PullRequest
0 голосов
/ 11 декабря 2018

Я столкнулся со следующей проблемой.У меня есть CSV-файл со следующими полями

vendor, number_of_products, price, shipping_country

, который я пытаюсь кластеризовать, используя python и k-means из sci-kit.Основная проблема, с которой я столкнулся, - это способ работы с категориальными данными (более конкретно, поле shipping_country, которое содержит строки стран).Мое намерение состоит в том, чтобы назначить веса в поле shipping_country.Моей первоначальной мыслью было заменить каждую страну числом от 1 до 20 (например, 1 «сильнее», чем 20 - по всему миру -> 1, Панама -> 20, например).Проблема с этим подходом состоит в том, что он не является научно обоснованным (или, по крайней мере, я не смог доказать это).У кого-нибудь есть предложения?Я был бы очень признателен за пример кодирования (если это возможно) из-за нехватки времени!Я использую Python.Заранее спасибо!

1 Ответ

0 голосов
/ 12 декабря 2018

Как уже упоминалось в моем комментарии, я не думаю, что вы обязательно хотите взвесить этот столбец.То, что вы хотите (я думаю), это способ для категорий быть числовыми.Это может быть выполнено в Sci-Kit Learn через горячее кодирование.В пандах это делается с помощью pd.get_dummies ().

Я покажу вам, как это работает:

df = pd.DataFrame({'nums' : [1, 4, 6, 7],
                   'colors': ['red', 'blue', 'green', 'yellow']})

df
Out[21]: 
   nums  colors
     1     red
     4    blue
     6   green
     7  yellow

pd.get_dummies(df)
Out[22]: 
   nums  colors_blue  colors_green  colors_red  colors_yellow
     1            0             0           1              0
     4            1             0           0              0
     6            0             1           0              0
     7            0             0           0              1

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

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

По этой причине вы можете добавить аргументdrop_first=True, как это делается ниже.

pd.get_dummies(df, drop_first=True)
Out[23]: 
   nums  colors_green  colors_red  colors_yellow
     1             0           1              0
     4             0           0              0
     6             1           0              0
     7             0           0              1

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

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