gpt4 book ai didi

python - 一个热编码序列,其值在测试中不存在

转载 作者:行者123 更新时间:2023-11-28 22:09:01 25 4
gpt4 key购买 nike

我有一个存储为数据帧的训练集和测试集。我正在尝试对我的数据集上的标称特征进行 One-hot 编码。但是我有以下问题:

  1. 总共有 3 个分类特征,但由于数据集很大,我不知道每个特征的值是多少。
  2. 测试集有训练集上不存在的值,所以当我进行单热编码时,训练集应该将未见值的向量标记为 0。但是正如我在 1 中提到的,我并不了解所有功能。
  3. 我发现我可以使用 df = pd.get_dummies(df, prefix_sep='_') 进行单热编码,该命令适用于所有分类特征,但我注意到它移动了train DataFrame 末尾的新功能,我认为这是一个问题,因为我们不知道哪个功能的索引。还有第 2 个问题,新的火车/火车应该有相同的索引。

有什么自动化的方法可以做到这一点吗?还是图书馆?

编辑

感谢以下答案,我能够对许多功能执行一次热编码。但是下面的代码给出了以下问题:

  1. 我认为 scikit-learn 去除了列标题并将结果生成为数组而不是 DataFrame
  2. 由于特征被剥离,我们不知道哪个向量属于哪个特征。即使我执行 df_scaled = pd.DataFrame(ct.fit_transform(data2)) 将结果存储在 Dataframe 中,创建的数据帧 df_scaled 也没有标题,尤其是当标题现在在预处理后改变了。也许 sklearn.preprocessing.OneHotEncoder 有一种方法可以跟踪新功能及其索引??

最佳答案

不要使用 pd.get_dummies,它具有您发现的缺点,而是使用 sklearn.preprocessing.OneHotEncoder。它会自动从您的训练数据中获取所有名义类别,然后根据训练步骤中确定的类别对您的测试数据进行编码。如果测试数据中有新类别,它只会将您的数据编码为 0。

例子:

from sklearn.preprocessing import OneHotEncoder
import numpy as np

x_train = np.array([["A1","B1","C1"],["A2","B1","C2"]])
x_test = np.array([["A1","B2","C2"]]) # As you can see, "B2" is a new attribute for column B

ohe = OneHotEncoder(handle_unknown = 'ignore') #ignore tells the encoder to ignore new categories by encoding them with 0's
ohe.fit(x_train)
print(ohe.transform(x_train).toarray())
>>> array([[1., 0., 1., 1., 0.],
[0., 1., 1., 0., 1.]])

要按训练集中的列获取类别的摘要,请执行以下操作:

print(ohe.categories_)
>>> [array(['A1', 'A2'], dtype='<U2'),
array(['B1'], dtype='<U2'),
array(['C1', 'C2'], dtype='<U2')]

要将一个热编码列映射到类别,请执行:

print(ohe.get_feature_names())
>>> ['x0_A1' 'x0_A2' 'x1_B1' 'x2_C1' 'x2_C2']

最后,这是编码器处理新测试数据的方式:

print(ohe.transform(x_test).toarray())
>>> [[1. 0. 0. 0. 1.]] # 1 for A1, 0 for A2, 0 for B1, 0 for C1, 1 for C2

编辑:

您似乎担心在进行编码后丢失标签这一事实。实际上很容易回到这些,只需将答案包装在数据框中并指定 ohe.get_feature_names() 中的列名:

pd.DataFrame(ohe.transform(x_test).toarray(), columns = ohe.get_feature_names())

关于python - 一个热编码序列,其值在测试中不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57946006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com