我有以下数据集,如numpy
数组
direccion_viento_pos
Out[32]:
array([['S'],
['S'],
['S'],
...,
['SO'],
['NO'],
['SO']], dtype=object)
此数组的维度为:
direccion_viento_pos.shape
(17249, 8)
我正在使用python和scikit学习以这种方式编码这些分类变量:
from __future__ import unicode_literals
import pandas as pd
import numpy as np
# from sklearn import preprocessing
# from matplotlib import pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
然后我创建一个标签编码器对象:
labelencoder_direccion_viento_pos = LabelEncoder()
我取direccion_viento_pos
的列位置0(唯一列)并应用fit_transform()
方法解决所有行:
direccion_viento_pos[:, 0] = labelencoder_direccion_viento_pos.fit_transform(direccion_viento_pos[:, 0])
我的direccion_viento_pos
就是这样:
direccion_viento_pos[:, 0]
array([5, 5, 5, ..., 7, 3, 7], dtype=object)
直到这一刻,direccion_viento_pos
的每一行/观察都有一个数值,但我想解决重量不方便的问题,即行的值比其他行更高。
由于这个原因,我创建了虚拟变量,which according to this reference是:
虚拟变量或指标变量是一个人工变量,用于表示具有两个或多个不同类别/级别的属性
然后,在我的direccion_viento_pos
上下文中,我有8个值
SO
- Sur oeste SE
- Sur este S
- Sur N
- Norte NO
- Nor oeste NE
- Nor este O
- Oeste E
- Este 这意味着,8个类别。
接下来,我使用categorical_features
属性创建一个OneHotEncoder对象,该对象指定将哪些要素视为分类变量。
onehotencoder = OneHotEncoder(categorical_features = [0])
将此onehotencoder
应用于我们的direccion_viento_pos
矩阵。
direccion_viento_pos = onehotencoder.fit_transform(direccion_viento_pos).toarray()
我的direccion_viento_pos
及其分类变量保持不变:
direccion_viento_pos
array([[0., 0., 0., ..., 1., 0., 0.],
[0., 0., 0., ..., 1., 0., 0.],
[0., 0., 0., ..., 1., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 1.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 1.]])
然后,直到这里,我为每个类别创建了虚拟变量。
我想讲述这个过程,以便得出我的问题。
如果这些虚拟编码器变量已经在0-1范围内,是否需要应用MinMaxScaler特征缩放?
有人说没有必要扩展这些虚构变量。其他人说,如果有必要,因为我们希望预测的准确性
我问这个问题是因为我将MinMaxScaler
应用于feature_range=(0, 1)
我的价值观已在一些位置发生变化......尽管仍保持这种规模。
对于我的数据集direccion_viento_pos
答案 0 :(得分:1)
我认为扩展它们根本不会改变答案。它们已经处于相同的规模。最小0,最大1,范围1。如果存在一些连续变量,则只想对连续变量进行归一化,而忽略虚拟变量。您可以使用最小-最大定标器为这些连续变量赋予相同的最小值(零,最大值为1,范围为1)。然后,回归斜率将很容易解释。您的虚拟变量已被标准化。
这里有一个related question,询问是否应该标准化二进制变量。