在生产水平上,我想使用预先保存的模型来预测我的实时数据.
但是,当分解分类数据时,我不知道如何将实时数据设置为与训练数据保持一致的映射。
From this article我知道我可以将训练数据和新数据堆叠在一起,并使它们保持一致。
然而,堆叠和贯穿整个过程(做整个特征工程、训练和预测)太费时了。
由于生产级别系统是时间敏感的,是否有任何方法可以将新数据分解为具有与培训数据相同的映射?
或者只能手动完成,例如
df.loc[df['col_name']=='YES', 'col_name'] = '1'
这会导致很长的编码?
发布于 2018-08-21 12:12:58
如果您的意思是在新的分类值(例如,您得到一个新的值‘蓝绿色’的df.color),您可以弹出任何意想不到的值到相同的-1桶(例如,未知),然后处理在后处理或任何时候,您重新调整模型。
本质上,您可以捕获类别异常,然后稍后处理它们。
发布于 2018-08-22 05:14:43
工作了几个小时后,我从pd.factorize切换到了LabelEncoder()。由于LabelEncoder只支持pd.series数据,所以我尝试使用一个循环来遍历所有列,并将每个符合LabelEncoder()的模型存储到字典中。
在培训数据部分
# list you want to do Label encoding
col_list = ['colA', 'colB', 'colC']
df[col_list]= df[col_list].fillna('NAN')
# create a dictionary to save LabelEncoder() model for each col
model = {}
# convert Categorical Data
for x in col_list:
encoder = LabelEncoder()
df[x]=encoder.fit_transform(df.__getattr__(x))
model[x]= encoder
# save dictionary to pickle file
with open('model.pkl', 'wb') as f:
pickle.dump(model, f)
在实时数据部分:
with open('model.pkl', 'rb') as f:
model= pickle.load(f)
for x in col_list:
encoder = model[x]
try:
df[x]=encoder.transform(df[x].astype(str))
except:
df[x]=encoder.transform(df[x].astype(int))
结果,我花了1.5秒的时间来加载数据,进行特征工程和预测。
发布于 2019-11-08 09:15:48
你用的是哪种算法?我遇到了同样的问题,但是由于我使用的是LGBM,所以没有必要对我的数据进行因式分解,该算法可以处理已处理的值。我不得不将数据类型从'object‘更改为’change‘。
categorical_feats = [f for f in combined_data.columns if combined_data[f].dtype == 'object']
categorical_feats
for f_ in categorical_feats:
# Set feature type as categorical
combined_data[f_] = combined_data[f_].astype('category')
https://stackoverflow.com/questions/51943037
复制相似问题