我制作了一个 ML 模型,使用包含分类变量的数据对其进行训练和测试。为了创建我在拆分之前
使用的虚拟变量。
我现在想在以前看不见的数据上使用我的模型,当然,我需要重新创建我的假人。我还应该这样做吗?这样是不是编码丢失了?关于如何做的任何建议?
谢谢pd.get_dummies()
pd.get_dummies()
对现实世界中看不见的数据使用 pandas get_dummies()
数据挖掘
Python
熊猫
预处理
虚拟变量
2021-10-15 00:05:48
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
实际上将分类变量映射到存储和保存的固定长度向量表示。
其它你可能感兴趣的问题