【问题标题】:Differencies between OneHotEncoding (sklearn) and get_dummies (pandas)One Hot Encoding (sklearn) 和 get_dummies (pandas) 的区别
【发布时间】:2021-04-12 09:47:03
【问题描述】:

我想知道 pandas 的 get_dummies() 分类特征编码与 sklearn 的 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()

【问题讨论】:

    标签: python training-data sklearn-pandas one-hot-encoding


    【解决方案1】:

    如果在通用数据集中应用get_dummies()OneHotEncoder(),应该会得到相同的结果。

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

    get_dummies()OneHotEncoder() 之间的主要区别是当您在现实生活中使用此模型(或在生产中)以及您收到 您以前没有遇到过的分类列的“新”类

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

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

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

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

    【讨论】:

    • 使用get_dummies 与数据框进行简单连接,或者使用not in,如果使用numpy 等,仅维护火车集中的功能非常容易......跨度>
    • 是的,完全同意你的看法。但这就是我认为的主要区别,get_dummies() 你必须使用额外的连接或其他东西,而OneHotEncoder() 则不需要。也许我错了。你会回答这个问题吗?提前谢谢你
    猜你喜欢
    • 1970-01-01
    • 2021-04-15
    • 2021-11-06
    • 2020-01-21
    • 1970-01-01
    • 2019-08-09
    • 2021-06-12
    • 2023-01-10
    • 2018-03-18
    相关资源
    最近更新 更多