【问题标题】:using get_dummies() and OneHotEncoding on large number of Categorical Variable在大量分类变量上使用 get_dummies() 和 OneHotEncoding
【发布时间】:2019-03-13 18:06:28
【问题描述】:

在大多数学术示例中,我们曾经使用get_dummies()OneHotEncoding() 转换分类特征。假设我想使用 Country 作为特征,并且在数据集中我们有 100 个独特的国家。当我们在国家/地区应用 get_dummies()OneHotEncoding() 时,我们将获得 100 个列,模型将使用 100 个国家/地区列 + 其他特征进行训练。

可以说,我们已将此模型部署到生产中,但我们只收到了 10 个国家/地区。当我们使用get_dummies()OneHotEncoding() 对数据进行预处理时,模型将无法进行预测,因为“模型训练的特征数量与传递的特征不匹配”,因为我们正在传递 10 个国家/地区列+其他特征。

你能帮我理解如何处理这种情况吗?如何处理多列中的大量分类变量可以在模型构建中进行预处理。

【问题讨论】:

  • 重点是您获得了相同的功能,或者能够在生产/测试期间弥补相同的功能。在测试时,您不仅要像在训练一样执行这些步骤,还要执行这些步骤以确保您得到与训练完全匹配的东西。只要这 10 个国家/地区是 100 个国家/地区的子集,您始终可以将其他 99 个国家/地区填充为 0,将 1 个国家/地区填充为 1,以获得您的 100 个标签。
  • 这意味着如果这 10 个国家是 100 个国家的子集,那么它们在预测中不会有任何问题。
  • 是的。这是你的问题还是不是?这 10 个国家是子集吗?
  • 是的,这 10 个国家是子集,我只是想知道这是否可行。我会运行我的模型,看看它是否顺利。非常感谢。
  • @ParitoshSingh - 我还有一个查询,假设我做了 OneHotEncoding,它将我的一个分类列转换为另外 10 个具有二进制值的列。现在我将在这个 OneHotEncoded 数据上训练和测试我的模型。现在如果我想传递一个新数据,我是否需要先将这个新数据转换为 OneHotEncoding,然后再让我的模型适应它??

标签: python machine-learning


【解决方案1】:

pandas.get_dummies() 函数确实不应该在部署中使用,因为你描述的原因。不过,scikit-learn 的 OneHotEncoder 可以很好地处理这种情况:

from sklearn import preprocessing
import pandas as pd

ohe = preprocessing.OneHotEncoder(handle_unknown='ignore')
X_train = pd.DataFrame({'country':['USA', 'Russia', 'China', 'Spain']})
X_test = pd.DataFrame({'country':['Russia', 'Ukraine', 'China', 'Russia']})
ohe.fit(X_train) 
ohe.transform(X_test).toarray()

array([[0., 1., 0., 0.],
       [0., 0., 0., 0.],
       [1., 0., 0., 0.],
       [0., 1., 0., 0.]])

(在这里我设置了handle_unknown='ignore',以便新标签('Ukraine')被编码为全零。如果设置handle_unknown='error'(这是默认设置),新标签将引发错误。)所以, OneHotEncoder 可以处理测试集中不同的标签集。

【讨论】:

  • 所以,这意味着如果测试数据有新条目(不是训练数据的子集),那么它将编码为 0。它不会影响我的模型精度吗?(显然是因为我的模型不是对这个新条目进行了培训,对吗?)所以我认为我需要将可能的条目添加到培训中。如果有误,请纠正我。
  • 是的,Aditya,如果可以的话,你应该这样做。 (有时您的数据并没有包含生产中可能出现的所有值。例如,您是一个热门的编码汽车模型并且市场上出现了新模型。)
  • 我还有一个查询,假设我做了 OneHotEncoding,它将我的分类列之一转换为另外 10 个具有二进制值的列。现在我将在这个 OneHotEncoded 数据上训练和测试我的模型。现在如果我想传递一个新数据,是否需要先将这个新数据转换为 OneHotEncoding,然后再让我的模型适应它??
猜你喜欢
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 2015-05-17
  • 1970-01-01
  • 2021-09-14
相关资源
最近更新 更多