我有一个具有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的数字特征标准化很容易。但是,我不确定是否要对分类观测值进行标准化,如果可以,那么最好的方法是什么?
答案 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)