Одна горячая кодировка для возрастных категориальных данных - PullRequest
0 голосов
/ 24 февраля 2019

При попытке реализовать кодирование для указанных ниже категорий с помощью одного горячего кодировщика я получил ошибку couldn't convert string to float.

['0-17', '55+', '26-35', '46-50', '51-55', '36-45', '18-25']

1 Ответ

0 голосов
/ 24 февраля 2019

Я сделал что-то очень быстрое, что должно сработать.Вы увидите, что у меня была действительно противная внешность для предобработки ваших пределов;однако будет гораздо проще, если вы просто преобразуете ограничения непосредственно в правильный формат.

По сути, это просто перебирает список ограничений и производит сравнение с ограничениями.Если выборка данных меньше предела, мы делаем этот индекс равным 1 и разбиваем.

import random

# str_limits = ['0-17', '55+', '26-35', '46-50', '51-55', '36-45', '18-25']
#
# oneline conditioning for the limit string format
# limits = sorted(list(filter(lambda x: not x.endswith("+"), map(lambda v: v.split("-")[-1], str_limits))))
# limits.append('1000')

# do this instead
limits = sorted([17, 35, 50, 55, 45, 25, 1000])

# sample 100 random datapoints between 0 and 65 for testing
samples = [random.choice(list(range(65))) for i in range(100)]

onehot = []  # this is where we will store our one-hot encodings
for sample in samples:
    row = [0]*len(limits)  # preallocating a list
    for i, limit in enumerate(limits):
        if sample <= limit:
            row[i] = 1
            break

    # storing that sample's onehot into a onehot list of lists
    onehot.append(row)

for i in range(10):
    print("{}: {}".format(onehot[i], samples[i]))

Я не уверен насчет специфики вашей реализации, но вы, вероятно, забыли конвертировать из строкив целое число в некоторый момент.

...