Как указать переменную в пандах как порядковую / категориальную?

Я пытаюсь запустить алгоритм машинного обучения для набора данных с помощью scikit-learn. В моем наборе данных есть некоторые функции, похожие на категории. Как одна функция - это A, у которой есть значения 1,2,3, определяющие качество чего-либо. 1:Upper, 2: Second, 3: Third class. Итак, это порядковая переменная.

Точно так же я перекодировал переменную City, имеющую три значения ('London', Zurich', 'New York' в 1,2,3, но без особого предпочтения для значений. Итак, теперь это номинальная категориальная переменная.

Как мне указать алгоритм, чтобы рассматривать их как категориальные, порядковые и т. Д. В пандах ?. Как и в R, категориальная переменная определяется factor(a) и, следовательно, не считается непрерывным значением. Есть ли что-нибудь подобное в pandas / python?


person Baktaawar    schedule 09.04.2015    source источник


Ответы (3)


... годы спустя (и потому, что я думаю, что хорошее объяснение этих проблем требуется не только для этого вопроса, но и для того, чтобы напомнить себе в будущем)

Порядковый и номинальный

В общем, категориальные переменные можно перевести в фиктивные переменные (или множество других методологий), потому что они были номинальными, например у них не было чувства a > b > c. В исходном вопросе OP это будет только выполняться в городах, таких как Лондон, Цюрих, Нью-Йорк.

Фиктивные переменные для номинала

Для этого типа проблем pandas обеспечивает - безусловно, самое простое преобразование с помощью pandas.get_dummies. Так:

# create a sample of OPs unique values
series = pandas.Series(
           numpy.random.randint(low=0, high=3, size=100))
mapper = {0: 'New York', 1: 'London', 2: 'Zurich'}
nomvar = series.replace(mapper)

# now let's use pandas.get_dummies
print(
    pandas.get_dummies(series.replace(mpr))

Out[57]:
    London  New York  Zurich
0        0         0       1
1        0         1       0
2        0         1       0
3        1         0       0

Порядковое кодирование категориальных переменных

Однако в случае порядковых переменных пользователь должен с осторожностью использовать _ 5_. Причина в том, что инженер хочет сохранить взаимосвязь в отображении таким образом, чтобы a > b > c.

Поэтому, если я хочу взять набор категориальных переменных, где large > medium > small, и сохранить его, мне нужно убедиться, что pandas.factorize сохраняет эту взаимосвязь.

# leveraging the variables already created above
mapper = {0: 'small', 1: 'medium', 2: 'large'}
ordvar = series.replace(mapper)

print(pandas.factorize(ordvar))

Out[58]:
(array([0, 1, 1, 2, 1,...  0, 0]),
Index(['large', 'small', 'medium'], dtype='object'))

Фактически, связь, которую необходимо сохранить для сохранения концепции порядкового номера, была потеряна при использовании pandas.factorize. В подобном случае я использую свои собственные сопоставления, чтобы гарантировать сохранение порядковых атрибутов.

preserved_mapper = {'large':2 , 'medium': 1, 'small': 0}
ordvar.replace(preserved_mapper)
print(ordvar.replace(preserved_mapper))

Out[78]:
0     2
1     0
...
99    2
dtype: int64

Фактически, создание собственного dict для сопоставления значений - это способ не только сохранить желаемые порядковые отношения, но также может использоваться для сохранения содержимого и сопоставлений вашего алгоритма прогнозирования, гарантируя, что вы не только не потеряете никакой порядковой информации. в процессе, но также хранят записи о том, что представляет собой каждое сопоставление для каждой переменной.

intс в sklearn

Наконец, OP говорил о передаче информации в scikit-lean классификаторы, что означает, что требуется int. В этом случае убедитесь, что вы знаете о astype(int) gotcha, подробно описанном здесь, если у вас есть NaNs в ваши данные.

person benjaminmgross    schedule 26.01.2017
comment
Я знаю, что это старое. Но разве вы можете горячо кодировать переменные, которые, по вашему мнению, являются порядковыми? - person shiv_90; 26.08.2019

Вы должны использовать преобразователь OneHotEncoder с категориальными переменными, и оставьте порядковую переменную нетронутой:

>>> import pandas as pd
>>> from sklearn.preprocessing import OneHotEncoder
>>> df = pd.DataFrame({'quality': [1, 2, 3], 'city': [3, 2, 1], columns=['quality', 'city']}
>>> enc = OneHotEncoder(categorical_features=[False, True])
>>> X = df.values
>>> enc.fit(X)
>>> enc.transform(X).todense()
matrix([[ 0.,  0.,  1.,  1.],
        [ 0.,  1.,  0.,  2.],
        [ 1.,  0.,  0.,  3.]])
person dukebody    schedule 09.04.2015
comment
Привет, я пробовал это в прошлом. Так кодирует ли этот метод все категориальные переменные, которые мы указываем как фиктивные, верно? Есть ли способ сохранить порядок? Как и для качественной переменной 1,2,3 имеет смысл с точки зрения качества. - person Baktaawar; 12.04.2015
comment
OneHotEncoder позволяет указать подмножество переменных (столбцов массива) для фиксации в аргументе category_features. Таким образом, вы можете оставить порядковый номер нетронутым и сохранить порядок. - person dukebody; 12.04.2015
comment
но если вы оставите порядковые числа нетронутыми, вы тоже ничего не добьетесь ... - person LudvigH; 15.02.2021

См. https://pandas.pydata.org/pandas-docs/stable/generated/pandas.factorize.html и просмотрите этот вопрос Как переформатировать категориальные переменные Pandas для Sci-kit Learn

person dartdog    schedule 09.04.2015
comment
Лучше конкретизировать свой ответ, чем публиковать ссылки - person EdChum; 09.04.2015