... годы спустя (и потому, что я думаю, что хорошее объяснение этих проблем требуется не только для этого вопроса, но и для того, чтобы напомнить себе в будущем)
Порядковый и номинальный
В общем, категориальные переменные можно перевести в фиктивные переменные (или множество других методологий), потому что они были номинальными, например у них не было чувства 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, подробно описанном здесь, если у вас есть NaN
s в ваши данные.
person
benjaminmgross
schedule
26.01.2017