Создание фиктивных переменных для взаимозависимых категорий в пандах - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь настроить модель линейной регрессии, чтобы прогнозировать количество трафика на основе дня и времени суток.Поскольку оба являются категориальными переменными, я должен создать фиктивные переменные.Функция get_dummies делает это очень легко, когда вы делаете это для обеих переменных по отдельности.Однако в случае прогнозирования объемов трафика важна взаимозависимость между днем ​​и временем суток.Поэтому мне понадобятся манекены для всех дней * всех временных интервалов.

Я сделал небольшой пример, чтобы не беспокоить вас большими наборами данных:

import pandas as pd

df = pd.DataFrame({'Day': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                    'Time': [11,15,9,15,17,10,20],
                    'Count': [100,150,150,150,180,60,50]})

df_dummies = pd.get_dummies(df.Day)

print(df_dummies)

В результате получается хороший кадр данных сманекены:

   Fri  Mon  Sat  Sun  Thu  Tue  Wed
0    0    1    0    0    0    0    0
1    0    0    0    0    0    1    0
2    0    0    0    0    0    0    1
3    0    0    0    0    1    0    0
4    1    0    0    0    0    0    0
5    0    0    1    0    0    0    0
6    0    0    0    1    0    0    0

Итак, что мне нужно, примерно так:

import pandas as pd

df = pd.DataFrame({'Day': ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                    'Time': [11,15,9,15,17,10,20],
                    'Count': [100,150,150,150,180,60,50]})

df_dummies = pd.get_dummies(df.Day * df.Time)

print(df_dummies)

С таким результатом:

   Fri_9  Fri_15  Mon_9 Mon_15 Sat_9 Sat_15 Sun_9 ...
0    0    1    0    0    0    0    0 ...
1    0    0    0    0    0    1    0 ...
2    0    0    0    0    0    0    1 ...
3    0    0    0    0    1    0    0 ...
4    1    0    0    0    0    0    0 ... 
5    0    0    1    0    0    0    0 ...
6    0    0    0    1    0    0    0 ...
7    0    0    0    0    0    0    0 ...
[...]

Есть ли способв котором это можно сделать элегантно?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я пытаюсь настроить модель линейной регрессии для прогнозирования

Технически, вы можете сделать макет из кортежей:

>>> pd.get_dummies(df[['Day', 'Time']].apply(tuple, axis=1))

(Fri, 17)   (Mon, 11)   (Sat, 10)   (Sun, 20)   (Thu, 15)   (Tue, 15)   (Wed, 9)
0   0   1   0   0   0   0   0
1   0   0   0   0   0   1   0
2   0   0   0   0   0   0   1
3   0   0   0   0   1   0   0
4   1   0   0   0   0   0   0
5   0   0   1   0   0   0   0
6   0   0   0   1   0   0   0
...

однако, я думаю, что этот подход не самый лучший на уровне ОД. Это, вероятно, очень сильно фрагментирует данные, усложняя процесс регрессора. Вы можете рассмотреть возможность использования дерева решений с градиентным усилением, если вы после взаимодействий.

0 голосов
/ 14 мая 2018

Мне кажется, мне нужно соединить колонки вместе с приведением к string s:

df_dummies = pd.get_dummies(df.Day + '_' + df.Time.astype(str))

#df_dummies = pd.get_dummies(df.Day.str.cat(df.Time.astype(str), sep='_'))

print(df_dummies)
   Fri_17  Mon_11  Sat_10  Sun_20  Thu_15  Tue_15  Wed_9
0       0       1       0       0       0       0      0
1       0       0       0       0       0       1      0
2       0       0       0       0       0       0      1
3       0       0       0       0       1       0      0
4       1       0       0       0       0       0      0
5       0       0       1       0       0       0      0
6       0       0       0       1       0       0      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...