【问题标题】:Correct usage of One Hot Encoding, got unexpected value error正确使用 One Hot Encoding,得到意外的值错误
【发布时间】:2020-06-29 18:59:51
【问题描述】:

我正在尝试通过对 sklearn 库中的一些分类数据进行热编码来预处理一些数据。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('Churn_Modelling.csv')
X = dataset.iloc[:, 3:13].values
y = dataset.iloc[:, 13].values

# Encoding categorical data
from sklearn.preprocessing import OneHotEncoder

onehotencoder = OneHotEncoder(categories =X[:,1].reshape(-1,1))

如果一切顺利,我应该可以通过

对数据进行编码
X = onehotencoder.fit_transform(X).toarray()

(对吗?) 但这引发了这个特殊的错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

有什么基本的我做的不对吗?我检查了文档 https://scikit-learn.org/0.20/modules/generated/sklearn.preprocessing.OneHotEncoder.html#sklearn.preprocessing.OneHotEncoder ,但这对我没有任何帮助...

我做错了什么基本的事情吗?我也很好奇为什么会弹出这个错误,我已经查过了,但我不明白它在这种情况下做了什么。 如果我需要提供更多信息,请告诉我。

为了明确数据集:我有十列我只想对国家/地区的分类值进行热编码(有三个:法国、德国和西班牙),其余列保存数值。

我想知道的一件事是,对于参数类别,是否应该传递希望编码的整个列,或者是否只提供具有不同值的数组?所以不是

onehotencoder = OneHotEncoder(categories =X[:,1].reshape(-1,1))

应该做类似的事情

onehotencoder = OneHotEncoder(categories = np.array(['France','Germany','Spain']).reshape(-1,1))

?

最后一次编辑:我只是尝试找到一种“快速”的方式对整个数据集中的特定列进行热编码。

我知道我总是可以取出我想要热编码的列,在该列上运行简单的代码,然后将其重新插入数据帧,我只是希望我能找到一些可以应用的代码许多不同的情况,只需极少的编辑。

编辑:添加数据集的打印屏幕: Example of the data set

【问题讨论】:

  • 只需从 fit_transform 中删除 .toarray()
  • 感谢您的回复。但是,即使我删除它,我也会遇到同样的错误
  • 你能提供你的数据样本吗?你有缺失值吗?
  • 你为什么要在 OneHotEncoder 中填写 categories 参数?如果您需要对所有类别进行编码,它将自动进行。您想具体转换哪些类别?
  • 嗨,我有一个数值范围,性别类别,我可以使用标签对其进行编码并且不需要热编码,我要编码的唯一类别是“地理”类别,它可以只取法国、德国和西班牙的值。我填写了类别参数,因为如果我将其保留在“自动”上,它似乎会编码所有值,数字值当然也不是我想要的。我通过切片此列并按如下方式成功地对地理进行了热编码,但随后将它们再次插入数据集中会变得混乱......我将提供数据集的示例

标签: python scikit-learn one-hot-encoding


【解决方案1】:

你有问题:当你这样做时:

X = dataset.iloc[:, 3:13].values

你得到一个 numpy 数组,没有列名。

你做的:

onehotencoder = OneHotEncoder(categories =X[:,1].reshape(-1,1))

这意味着您只需要第二列中的值作为类别。 但是您需要唯一的值,因此您应该这样做:

categories=np.unique(X[:,1]).reshape(-1,1)
onehotencoder = OneHotEncoder(categories=categories, handle_unknown='ignore')

我还添加了handle_unknown 参数,以防矩阵中的值可能不在categories 中。

先试试这个。

【讨论】:

  • 嗨,是的,我尝试了两种方法:删除 .values 并正常进行,并添加列表类别(在数据集中,唯一的选项是德国、法国和西班牙。数据集非常更干净,没有缺失值等)
  • 您应该只在categories 中设置唯一值,这就是重点。你试过了吗?它奏效了吗?如果您的数据与您所说的一致,您可以添加或不添加 handle_unknown 参数。
  • 谢谢你,我确实认为有一次,如果我没记错的话,我会再试一次以确保。我目前正在运行一些大型计算,所以我会尽快发布结果
  • 实际上当程序必须在多个选项中进行选择时会发生错误(您必须添加all()any())。这可能与多项选择有关。否则,如果您想进行测试,您可以在数据集的较小样本上运行它,例如 100 个样本。
猜你喜欢
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
相关资源
最近更新 更多