Так что есть соглашение, чтобы сделать это.Гораздо проще показать на примере, чем объяснить.
Предположим, вы собрали из своего приложения веб-аналитики четыре набора показателей, описывающих каждого посетителя веб-сайта:
пол / пол
канал сбора
уровень участия в форуме
тип учетной записи
Каждая из них является категориальной переменной (также известной как фактор ), а не непрерывной переменной (например, общее время сеанса или возраст учетной записи).
# column headers of raw data--all fields are categorical ('factors')
col_headers = ['sex', 'acquisition_channel', 'forum_participation_level', 'account_type']
# a single data row represents one user
row1 = ['M', 'organic_search', 'moderator', 'premium_subscriber']
# expand data matrix width-wise by adding new fields (columns) for each factor level:
input_fields = [ 'male', 'female', 'new', 'trusted', 'active_participant', 'moderator',
'direct_typein', 'organic_search', 'affiliate', 'premium_subscriber',
'regular_subscriber', 'unregistered_user' ]
# now, original 'row1' above, becomes (for input to ML algorithm, etc.)
warehoused_row1 = [1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0]
Этот метод преобразования кажется мне более разумным, чем хранение каждой переменной в виде одного столбца.Например, если вы сделаете последнее, то вам придется согласовать три типа каналов сбора данных с их числовым представлением - т. Е. Если органический поиск равен "1", то аффилированным лицом должно быть 2, а direct_type в 3 или наоборот?
Еще одним существенным преимуществом этого представления является то, что, несмотря на расширение по ширине, оно представляет собой компактное представление данных.(В случаях, когда расширение столбца является существенным - то есть, одно поле является состоянием пользователя, что может означать, что 1 столбец становится 50, представление с разреженной матрицей, очевидно, является хорошей идеей.)
для этого типа работы iиспользуйте библиотеки числовых вычислений NumPy и SciPy .
из интерактивной подсказки Python:
>>> # create two data rows, representing two unique visitors to a Web site:
>>> row1 = NP.array([0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0])
>>> row2 = NP.array([1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0])
>>> row1.dtype
dtype('int64')
>>> row1.itemsize
8
>>> # these two data arrays can be converted from int/float to boolean, substantially
>>> # reducing their size w/ concomitant performance improvement
>>> row1 = NP.array(row1, dtype=bool)
>>> row2 = NP.array(row2, dtype=bool)
>>> row1.dtype
dtype('bool')
>>> row1.itemsize # compare with row1.itemsize = 8, above
1
>>> # element-wise comparison of two data vectors (two users) is straightforward:
>>> row1 == row2 # element-wise comparison
array([False, False, False, False, True, True, False, True, True, False], dtype=bool)
>>> NP.sum(row1==row2)
5
Для вычислений на основе подобия (например, k-Nearest Neighbours) существует особая метрика, используемая для расширенных векторов данных, состоящих из категориальных переменных, называемыхКоэффициент Танимото.Для конкретного представления, которое я здесь использовал, функция будет выглядеть следующим образом:
def tanimoto_bool(A, B) :
AuB = NP.sum(A==B)
numer = AuB
denom = len(A) + len(B) - AuB
return numer/float(denom)
>>> tanimoto_bool(row1, row2)
0.25