【问题标题】:Do I always have to keep a copy of training data if I do one hot encoding?如果我进行一次热编码,我是否总是需要保留一份训练数据的副本?
【发布时间】:2019-02-27 00:41:40
【问题描述】:

我正在对分类数据进行一次热编码。当我测试时,我会这样做:

data.append(train_data_X)
data.append(test_data_X)
one_hot_encode(data)
model.test(data[:test_data_X.shape[0])

我想知道是否有一种方法可以测试我的测试数据,而无需访问我的训练数据。

【问题讨论】:

    标签: python machine-learning scikit-learn one-hot-encoding


    【解决方案1】:

    通常的最佳做法是使用scikit-learnOneHotEncoder 函数,正是为了避免您遇到的问题。

    from sklearn.preprocessing import OneHotEncoder
    encoder = OneHotEncoder(categories = "auto", handle_unknown = 'ignore')
    X_train_encoded = encoder.fit_transform(X_train)
    X_test_encoded = encoder.transform(X_test)
    

    这可确保为测试集实施相同的 One Hot Encoding。 所以你可以使用 X_train_encoded 来训练你的模型,然后 X_test_encoded 来评估它。

    【讨论】:

    • 如果测试数据有一个训练数据没有看到的新类别,这会引发错误吗?
    • 我编辑了我的答案,你需要指定 handle_unknown = 'ignore' 来处理新的类别。
    【解决方案2】:

    下面是简单的方法,但这可能并不总是有效(为什么它不总是在代码后解释)

    from sklearn.preprocessing import OneHotEncoder
    enc = OneHotEncoder()
    
    #fit the encoder
    enc.fit(X_train)
    #transform the data
    X_train_encoded = enc.transform(X_train)
    #tranform test data
    X_test_encoded = enc.transform(X_test)
    

    但这种方法存在一个小问题。如果您的火车数据在一列中有 2 个唯一值,则编码器将创建 2 个虚拟特征。但是,如果您的测试数据在同一列有 3 个唯一值,我们将有额外的列,我们的模型将抛出异常。因此,始终建议在使用 one-hot 编码之前将测试和训练数据结合起来,然后根据索引将数据恢复拆分回测试和训练。

    【讨论】:

      猜你喜欢
      • 2019-08-26
      • 2012-05-31
      • 2020-10-26
      • 2020-02-29
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2020-04-28
      相关资源
      最近更新 更多