sklearns OneHotEncoder 究竟是如何工作的?
How exactly does sklearns OneHotEncoder work?
我正在尝试在 titanic 数据集(pandas 数据帧)的一个子集上使用 sklearns OneHotEncoder。
文档显示
"By default, the encoder derives the categories based on the unique
values in each feature. Alternatively, you can also specify the
categories manually."
并且还声明我不需要指定类别,因为它是自动完成的
‘auto’ : Determine categories automatically from the training data. (default)
所以我用这个写:
print(x_train.head())
enc = OneHotEncoder(handle_unknown="ignore")
print("_____________")
print(x_train.shape)
x_train = enc.fit_transform(x_train)
print(x_train.shape)
print(x_train.toarray())
并获得输出
Pclass Sex Age SibSp Parch Fare Cabin Embarked
845 3 male 42.000000 0 0 7.5500 None S
162 3 male 26.000000 0 0 7.7750 None S
630 1 male 80.000000 0 0 30.0000 A23 S
176 3 male 29.699118 3 1 25.4667 None S
115 3 male 21.000000 0 0 7.9250 None S
_____________
(712, 8)
(712, 460)
[[0. 0. 1. ... 0. 0. 1.]
[0. 0. 1. ... 0. 0. 1.]
[1. 0. 0. ... 0. 0. 1.]
...
[0. 0. 1. ... 0. 0. 1.]
[1. 0. 0. ... 0. 0. 1.]
[0. 0. 1. ... 0. 0. 1.]]
所以我可以看到已经添加了更多功能(这是应该的),但是实际上编码了哪些类别?他们都?如果是这样,则年龄的“类别”数量有限,但显然不是分类变量。这不是问题吗?如果它使用 pandas 数据框列类型来确定是否进行 onehotencode,那么具有类型 int 但显然是分类的“Pclass”会发生什么?
一个热编码应该只用于分类特征。如果你有 3 个分类特征,它们可以分别取 1,2 和 3 个不同的值,你将有 1+2+3 个新特征。例如,如果你的特征是水果,并且在一次热编码后可以取值苹果、菠萝和梨,你就有了 3 个新特征(苹果、菠萝和梨),每个特征都可以取 1 或 0 作为值。
年龄不是一个分类特征,你不应该为它使用一种热编码。
你必须定义你的分类变量,然后应用到这些特征上,OneHotEncoder.
如果您不定义分类特征,OneHotEncoder 将对每个特征(分类或非分类)进行编码。
所以,我强烈建议您预先定义分类特征并将它们应用到 OneHotEncoder。
我正在尝试在 titanic 数据集(pandas 数据帧)的一个子集上使用 sklearns OneHotEncoder。
文档显示
"By default, the encoder derives the categories based on the unique values in each feature. Alternatively, you can also specify the categories manually."
并且还声明我不需要指定类别,因为它是自动完成的
‘auto’ : Determine categories automatically from the training data. (default)
所以我用这个写:
print(x_train.head())
enc = OneHotEncoder(handle_unknown="ignore")
print("_____________")
print(x_train.shape)
x_train = enc.fit_transform(x_train)
print(x_train.shape)
print(x_train.toarray())
并获得输出
Pclass Sex Age SibSp Parch Fare Cabin Embarked
845 3 male 42.000000 0 0 7.5500 None S
162 3 male 26.000000 0 0 7.7750 None S
630 1 male 80.000000 0 0 30.0000 A23 S
176 3 male 29.699118 3 1 25.4667 None S
115 3 male 21.000000 0 0 7.9250 None S
_____________
(712, 8)
(712, 460)
[[0. 0. 1. ... 0. 0. 1.]
[0. 0. 1. ... 0. 0. 1.]
[1. 0. 0. ... 0. 0. 1.]
...
[0. 0. 1. ... 0. 0. 1.]
[1. 0. 0. ... 0. 0. 1.]
[0. 0. 1. ... 0. 0. 1.]]
所以我可以看到已经添加了更多功能(这是应该的),但是实际上编码了哪些类别?他们都?如果是这样,则年龄的“类别”数量有限,但显然不是分类变量。这不是问题吗?如果它使用 pandas 数据框列类型来确定是否进行 onehotencode,那么具有类型 int 但显然是分类的“Pclass”会发生什么?
一个热编码应该只用于分类特征。如果你有 3 个分类特征,它们可以分别取 1,2 和 3 个不同的值,你将有 1+2+3 个新特征。例如,如果你的特征是水果,并且在一次热编码后可以取值苹果、菠萝和梨,你就有了 3 个新特征(苹果、菠萝和梨),每个特征都可以取 1 或 0 作为值。
年龄不是一个分类特征,你不应该为它使用一种热编码。
你必须定义你的分类变量,然后应用到这些特征上,OneHotEncoder.
如果您不定义分类特征,OneHotEncoder 将对每个特征(分类或非分类)进行编码。
所以,我强烈建议您预先定义分类特征并将它们应用到 OneHotEncoder。