0

我有一个包含 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 的数值特征很容易标准化。但是,我不确定是否标准化分类观察,如果是,那么最好的方法是什么?

4

2 回答 2

0

归一化重新调整范围 0 到 1 之间的值。您的值已经在此范围内,只有当基数非常高时才需要对分类值进行归一化,但现在您可以保持原样。我还建议您标准化整个数据集。然后所有的值都将在相同的范围内,算法不会通过优先选择具有更高数值的任何特征来错误地学习任何东西。您可以在 scikit learn 中找到归一化和缩放。

from sklearn import preprocessing
X=your_data
normalized_X = preprocessing.normalize(X)
于 2019-05-24T06:25:07.237 回答
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]
于 2019-05-24T06:23:39.487 回答