Как стандартизировать категориальные переменные, связанные с отметками времени

У меня есть набор данных с 8 смешанными функциями (6 числовых и 2 категориальных). Поскольку числовые значения имеют разные диапазоны, мне придется нормализовать набор данных в целом, чтобы иметь возможность выполнять дальнейшие действия, такие как алгоритмы машинного обучения, уменьшение размерности (извлечение признаков).

Мой исходный набор данных:

time          v1     v2    v3   ...     v7      v8
00:00:01     15435   0.7   13   ...    High   True
00:00:06     24356   3.6   23   ...    High   True
00:00:11     25567   8.3   82   ...    LOW    False
00:00:16     12345   5.4   110   ...   LOW    True
00:00:21     43246   1.7   93   ...    High   False
................................................
23:23:59     23456   3.8   45   ...    LOW    False

где от v1 до v6 — числовые переменные, при которых их значения находятся в разных диапазонах, как видно выше. Более того, v7 и v8 являются категориальными переменными, имеющими только два выхода (для v7 {High, Low} и для v8 {True, False}).

Я сделал кодирование меток для категориальных переменных (v7 и v8), где High и True были закодированы 1, а LOW и False были закодированы 0.

Ниже показано, как выглядит набор данных после кодирования метки:

time          v1     v2    v3   ...     v7      v8
00:00:01     15435   0.7   13   ...     1       1
00:00:06     24356   3.6   23   ...     1       1
00:00:11     25567   8.3   82   ...     0       0
00:00:16     12345   5.4   110   ...    0       1
00:00:21     43246   1.7   93   ...     1       0
................................................
23:23:59     23456   3.8   45   ...     0       0

Мой вопрос заключается в следующем: легко стандартизировать числовые характеристики от v1 до v6. Однако я не уверен, следует ли стандартизировать категорические наблюдения, и если да, то как лучше всего это сделать??


person Alex Davies    schedule 24.05.2019    source источник


Ответы (2)


Вы можете использовать время UNIX, например:

import pandas as pd 
import numpy as np

date = pd.date_range('1/1/2011', periods = 10, freq ='H')   
df = pd.DataFrame({'date':date})
df['unix_time'] = df['date'].astype(np.int64) // 10**9

df

выход:

                 date   unix_time
0 2011-01-01 00:00:00  1293840000
1 2011-01-01 01:00:00  1293843600
2 2011-01-01 02:00:00  1293847200
3 2011-01-01 03:00:00  1293850800
4 2011-01-01 04:00:00  1293854400
5 2011-01-01 05:00:00  1293858000
6 2011-01-01 06:00:00  1293861600
7 2011-01-01 07:00:00  1293865200
8 2011-01-01 08:00:00  1293868800
9 2011-01-01 09:00:00  1293872400

Теперь ваши алгоритмы машинного обучения могут сравнивать дату, а также вы можете конвертировать дату назад:

pd.to_datetime(df['unix_time'], unit='s')

выход:

0   2011-01-01 00:00:00
1   2011-01-01 01:00:00
2   2011-01-01 02:00:00
3   2011-01-01 03:00:00
4   2011-01-01 04:00:00
5   2011-01-01 05:00:00
6   2011-01-01 06:00:00
7   2011-01-01 07:00:00
8   2011-01-01 08:00:00
9   2011-01-01 09:00:00
Name: unix_time, dtype: datetime64[ns]
person Manualmsdos    schedule 24.05.2019

Нормализация изменяет масштаб значений в диапазоне от 0 до 1. Ваши значения уже находятся в этом диапазоне, вам потребовалась бы нормализация категориальных значений только в том случае, если бы кардинальность была действительно очень высокой, но пока вы можете оставить их как есть. Я также предлагаю вам нормализовать весь ваш набор данных. Тогда все значения будут в одном и том же диапазоне, и алгоритм ничего не узнает ошибочно, отдав предпочтение какой-либо функции с более высокими числовыми значениями. Вы можете найти как нормализацию, так и масштабирование в самом обучении scikit.

from sklearn import preprocessing
X=your_data
normalized_X = preprocessing.normalize(X)
person Rohan Kumar    schedule 24.05.2019
comment
если вам тоже нужны отсутствующие временные метки, тогда Дима Первый дал действительно хороший ответ - person Rohan Kumar; 24.05.2019