是否可以在未见过的数据(没有 one-hot 编码)上使用保存的 xgboost 模型(具有 one-hot 编码功能)进行预测?

数据挖掘 机器学习 xgboost 预言
2022-02-28 17:12:27

我认为这个问题是不言自明的。但是,假设您有一个具有分类数据的一些特征的数据,并且在构建例如 XGBoost 的模型时,您一次性对分类特征进行编码。现在您想使用保存的模型根据测试数据进行预测。显然,测试数据需要进行一次热编码,并且需要具有与训练集相似的特征。问题是是否有可能找到一种方法而不是 one-hot 对测试数据进行编码并直接将其用于预测?这有可能吗?

在我看来,我保存的模型中的任何内容都需要与训练期间使用的一样,即一次性编码特征!但这并不整洁,尤其是在构建小部件和仪表板时!

任何评论/提示表示赞赏。

2个回答

模型建立在一组特定的特征上,其中可能包括使用单热编码编码的分类特征。如果您有带有其他类别的新数据,您的模型不知道如何解释这些类别的重要性。您应该将新值映射到训练中识别的任何1-hot 值,或者映射到“其他”值。

例如,假设您对颜色=[blue,green] 的数据进行了训练。您的 one-hot 字段将具有 color_blue 和 color_green。您还可以有一个名为 color=other 的字段,您可以使用它来编码非常罕见的值。这是数据准备的选择。因此,对于“红色”,您可以将其编码为:

  • color_green = 0
  • 颜色蓝色 = 0

或者

  • color_green = 0
  • 颜色蓝色 = 0
  • 颜色_其他 = 1

使用这些技术中的任何一种都可以与 xgboost 一起使用,但由于 xgboost 只接受数字输入,因此您必须选择其中一种方法作为数据预处理步骤。

由于它的帖子很旧,因此此回复可能对其他人有所帮助。

确实,某些算法接受分类格式的数据并在内部转换为 OneHotEncoding。在这种情况下,模型接受原始格式的数据并且不需要任何显式转换处理。

如果不支持,我们必须保存两个模型,即

  1. 用于编码数据的模型
  2. 用于预测数据的模型

以更简单的方式,我们也可以将相关模型保存在单个文件中。参考下面的代码片段:

from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import OneHotEncoder
import pickle as pk
import pandas as pd
import numpy as np

df = pd.read_csv(<"Some_file.csv">) #replace with actual csv file
X = df['Features']
y = df['Labels']
file = open("models.pkl", "wb")  

encoder = OneHotEncoder(sparse=False)
oneHotEncodedFeature = encoder.fit_transform(X[<'Categorical_feature'>].values.reshape(-1,1))
pk.dump(encoder, file) #dumping Encoder model

# Some processing for concatenating oneHotEncodedFeature with other features and assume it its X again.
linReg = LinearRegression()
linReg.fit(X,y)
pk.dump(linReg, file) #dumping linear Reg. model
file.close() #Create single pickle file, which has both the trained model.

#For prediction

file = open("models.pkl", "rb")
trained_encoder = pk.load(file)  #Pickle file first load the OneHotEncoder 
trained_model_for_prediction = pk.load(file) #Reading same pickle again will load the trained Linear Reg Model.