对现实世界中看不见的数据使用 pandas get_dummies()

数据挖掘 Python 熊猫 预处理 虚拟变量
2021-10-15 00:05:48

我制作了一个 ML 模型,使用包含分类变量的数据对其进行训练和测试。为了创建我在拆分之前
使用的虚拟变量。 我现在想在以前看不见的数据上使用我的模型,当然,我需要重新创建我的假人。我还应该这样做吗?这样是不是编码丢失了?关于如何做的任何建议? 谢谢pd.get_dummies()
pd.get_dummies()

1个回答

是的,编码会丢失。您应该改用sklearn OneHotEncoder并保存相应的编码器实例,以便您可以在看不见的数据上重新加载它。

可以按照以下方式做一些事情:

import pandas as pd
import pickle
from sklearn.preprocessing import OneHotEncoder


def get_encoder_inst(feature_col):
    """
    returns: an instance of sklearn OneHotEncoder fit against a (training) column feature;
    such instance is saved and can then be loaded to transform unseen data
    """
    assert isinstance(feature_col, pd.Series)
    feature_vec = feature_col.sort_values().values.reshape(-1, 1)
    enc = OneHotEncoder(handle_unknown='ignore')
    enc.fit(feature_vec) 
    with open(file_name, 'wb') as output_file:
            pickle.dump(enc, output_file)
    return enc 

然后可以加载并应用为

def get_one_hot_enc(feature_col, enc):
    """
    maps an unseen column feature using one-hot-encoding previously fit against training data 
    returns: a pd.DataFrame of newly one-hot-encoded feature
    """
    assert isinstance(feature_col, pd.Series)
    assert isinstance(enc, OneHotEncoder)
    unseen_vec = feature_col.values.reshape(-1, 1)
    encoded_vec = enc.transform(unseen_vec).toarray()
    encoded_df = pd.DataFrame(encoded_vec)
    return encoded_df

其中enc后一个函数中的参数是OneHotEncoder您通过pickle.load. 当然以上只是一个伪代码示例,请注意您使用的所有对象都保持初始形状等。

使用的问题pd.get_dummies是它没有先前映射的编码的记忆:它基本上将一列转换为因子,而OneHotEncoder实际上将分类变量映射到存储和保存的固定长度向量表示。