问题描述
我想知道与 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 set
和get_dummies()
,应该得到相同的结果。
如果在一般数据集中应用 OneHotEncoder()
,在训练数据集中应用 get_dummies()
,如果在测试数据中您有一个“新”类别,您可能会获得一些(非常小的)差异.如果不是,它们应该有相同的结果。
OneHotEncoder()
和 get_dummies()
之间的主要区别是当您在现实生活中使用此模型(或在生产中)时它们的工作方式并且您收到您以前从未遇到过的分类列的“新”类
示例:想象一下,您的“性别”类别只能是:男性或女性,并且您出售了你的模型给一家公司。如果现在类别“sex”收到值:“NA”(不适用)会发生什么? (另外,你可以想象“NA”是一个选项,但它只出现了 0.001%,随便你的数据集中没有这个值)
使用 OneHotEncoder()
,您会遇到问题,因为您的模型仅针对 2 种不同的性别类别进行训练,而现在,您有一个模型无法处理的不同的新类别。
使用 get_dummies()
,将允许您“忽略”您的模型无法面对的这个新类别,从而让您在模型输入和新样本输入之间保持相同的形状。
这就是为什么人们在训练集而不是一般数据集中使用 OneHotEncoder()
的原因,他们正在“模拟”这种类型的成功(在分类列中拥有您以前从未遇到过的“新”类)>