如何标准化与时间戳相关的分类变量

时间:2019-05-24 05:23:20

标签: python pandas dataset categorical-data standardized

我有一个具有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)进行了标签编码,其中高和True分别编码为1,低和假为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的数字特征标准化很容易。但是,我不确定是否要对分类观测值进行标准化,如果可以,那么最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

您可以使用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]

答案 1 :(得分:0)

归一化会在0到1的范围内重新调整值。您的值已经在此范围内,仅当基数确实很高时才需要对分类值进行归一化,但是现在您可以保持原样。我还将建议您标准化整个数据集。这样,所有值都将在同一范围内,并且算法不会偏爱具有较高数值的任何特征,从而不会错误地学习任何东西。您可以在scikit自学中找到归一化和缩放。

from sklearn import preprocessing
X=your_data
normalized_X = preprocessing.normalize(X)