我想知道与sklearn的OneHotEncoder()相比,熊猫对分类特征的get_dummies()编码有什么不同。
我看到的答案提到,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()发布于 2021-01-07 16:08:25
如果在常规数据集中应用get_dummies()和OneHotEncoder(),则应获得相同的结果。
如果您在一般数据集中应用get_dummies(),在训练数据集中应用OneHotEncoder(),如果在测试数据中有一个“新”类别,您可能会获得一些(非常小的)差异。如果不是,它们应该有相同的结果。
get_dummies()和OneHotEncoder()之间的主要区别在于,当您在现实生活中(或在生产中)使用此模型时,和OneHotEncoder()之间的主要区别在于,当您在之前从未遇到过分类列的“新”类时,它们是如何工作的
例如:假设你的“性别”类别只能是:男性或女性,然后你把你的模型卖给了一家公司。如果现在,类别“性”收到值:"NA“(不适用),会发生什么?(此外,您可以将"NA“想象为一个选项,但它只显示0.001%,并且您的数据集中没有任何此值)
使用get_dummies(),你会遇到一个问题,因为你的模型只针对两种不同的性别类别进行了训练,而现在,你有了一个模型无法处理的不同的新类别。
使用OneHotEncoder(),将允许您“忽略”模型无法面对的新类别,允许您在模型输入和新样本输入之间保持相同的形状。
这就是为什么人们在训练集中而不是在一般数据集中使用OneHotEncoder()的原因,他们正在“模拟”这种类型的成功(在分类专栏中有你以前从未遇到过的“新”类)
https://stackoverflow.com/questions/65599297
复制相似问题