OneHotEncoding (sklearn) 和 get_dummies (pandas) 之间的差异

问题描述

我想知道与 sklearn 的 get_dummies() 相比,pandas 的分类特征 OneHotEncoder() 编码有什么区别。

我看到的答案提到 get_dummies() 无法为训练数据集 (answers here) 中没有的类别生成编码。然而,这是在测试和训练数据集上分别执行 get_dummies() 的结果(这可能会产生不一致的形状)。另一方面,如果我们在原始数据集上应用 get_dummies(),在拆分它之前,我认为这两种方法应该给出相同的结果。我错了吗?这会导致问题吗?

我的代码目前的工作方式如下:

def one_hot_encode(ds,feature):
    #get DF of dummy variables
    dummies = pd.get_dummies(ds[feature])
    #One dummy variable to drop (Dummy Trap)
    dummyDrop = dummies.columns[0]
    #Create a DF from the original and the dummies' DF
    #Drop the original categorical variable and the one dummy
    final =  pd.concat([ds,dummies],axis='columns').drop([feature,dummyDrop],axis='columns')
    return final

#Get data DF
dataset = pd.read_csv("census_income_dataset.csv")
columns = dataset.columns

#Perform one-hot-encoding on the DF (See function above) on categorical features
features = ["workclass","marital_status","occupation","relationship","race","sex","native_country"]
for f in features:
    dataset = one_hot_encode(dataset,f)
#Re-order to get ouput feature in last column
dataset = dataset[[c for c in dataset.columns if c!="income_level"]+["income_level"]]
dataset.head()

解决方法

如果在通用数据集中应用Error: project: required field is not setget_dummies(),应该得到相同的结果。

如果在一般数据集中应用 OneHotEncoder(),在训练数据集中应用 get_dummies(),如果在测试数据中您有一个“新”类别,您可能会获得一些(非常小的)差异.如果不是,它们应该有相同的结果。

OneHotEncoder()get_dummies() 之间的主要区别是当您在现实生活中使用此模型(或在生产中)时它们的工作方式并且您收到您以前从未遇到过的分类列的“新”类

示例:想象一下,您的“性别”类别只能是:男性女性,并且您出售了你的模型给一家公司。如果现在类别“sex”收到值:“NA”(不适用)会发生什么? (另外,你可以想象“NA”是一个选项,但它只出现了 0.001%,随便你的数据集中没有这个值)

使用 OneHotEncoder(),您会遇到问题,因为您的模型仅针对 2 种不同的性别类别进行训练,而现在,您有一个模型无法处理的不同的新类别。

使用 get_dummies(),将允许您“忽略”您的模型无法面对的这个新类别,从而让您在模型输入和新样本输入之间保持相同的形状。

这就是为什么人们在训练集而不是一般数据集中使用 OneHotEncoder() 的原因,他们正在“模拟”这种类型的成功(在分类列中拥有您以前从未遇到过的“新”类)>