使用OneHotEncoder进行单个数据实例预测时的特征不匹配

OneHotEncoder如何对单个值进行预测

错误信息 – ValueError: 模型的特征数量必须与输入匹配。模型的特征数量为1261,而输入的特征数量为16

我在文本数据上训练一个随机森林分类器。我为每个文本数据实例计算16个特征。由于这16个变量都是分类变量,我对这16个变量中的每一个使用OneHotEncoder进行编码。这导致训练矩阵有1261列。我也对这些特征进行了缩放。我还对训练数据进行了80:20train:test分割,并应用了预测器以获得混淆矩阵和分类报告。我还将分类器、标准缩放器变量、onehotencoder变量以pickle格式保存在本地磁盘上。

现在,我想在新的单独文件中创建一个预测器的服务(REST)。这个API将使用保存的.pkl格式的模型,并预测新单个文本值的值——基本上有它的预测类名和相应的置信度得分。

我面临的问题是:当我编码这个单个文本值时,我得到一个具有16个特征的向量。它没有被编码为1261个特征。因此,当我在这新文本上运行这个分类器的predict()函数时,它给我以下错误:

% (self.n_features_, n_features)) ValueError: 模型的特征数量必须与输入匹配。模型的特征数量为1261,而输入的特征数量为16

当编码矩阵与之前训练的分类器大小不匹配时,如何使用反序列化的pkl模型来对单个实例进行预测?如何解决这个问题。

编辑: 同时发布代码片段和异常堆栈:

# 加载训练中使用的.pkl文件with open('model.pkl', 'rb') as f_model:    classifier = pickle.load(f_model) # 训练的分类器模型with open('labelencoder_file.pkl', 'rb') as f_lblenc:    label_encoder = pickle.load(f_lblenc) # 训练中使用的标签编码器对象with open('encoder_file.pkl', 'rb') as f_onehotenc:    onehotencoder = pickle.load(f_onehotenc) # 训练中使用的onehotencoder对象with open('sc_file.pkl', 'rb') as f_sc:    scaler = pickle.load(f_sc) # 训练中使用的标准缩放器对象X = df_features # df_features是包含计算的特征值的数据框。它有16列,因为为新值计算了16个特征X.values[:, 0] = label_encoder.fit_transform(X.values[:, 0])X.values[:, 1] = label_encoder.fit_transform(X.values[:, 1])# 重复至X.values[:, 15],因为所有特征都是分类特征X = onehotencoder.fit_transform(X).toarray()X = scaler.fit_transform(X)print(X.shape) # 这打印出(1, 16),因此显示编码未正确工作y_pred = classifier.predict(X) # 这会抛出异常

Traceback (most recent call last):

文件 “/home/Test/api.py”,第256行,在api_func() y_pred = classifier.predict(X)

文件 “/usr/local/lib/python3.6/dist-packages/sklearn/ensemble/forest.py”,第538行,在predict proba = self.predict_proba(X)

文件 “/usr/local/lib/python3.6/dist-packages/sklearn/ensemble/forest.py”,第578行,在predict_proba X = self._validate_X_predict(X)

文件 “/usr/local/lib/python3.6/dist-packages/sklearn/ensemble/forest.py”,第357行,在_validate_X_predict return self.estimators_[0]._validate_X_predict(X, check_input=True)

文件 “/usr/local/lib/python3.6/dist-packages/sklearn/tree/tree.py”,第384行,在_validate_X_predict % (self.n_features_, n_features))

ValueError: 模型的特征数量必须与输入匹配。模型的特征数量为1261,而输入的特征数量为16


回答:

在此发布解决问题的修改后的代码

'''加载训练中持久化的.pkl文件'''with open('model.pkl', 'rb') as f_model:    classifier = pickle.load(f_model) # 训练的分类器模型with open('labelencoder00.pkl', 'rb') as f_lblenc00:    label_encoder00 = pickle.load(f_lblenc00) # 用于编码第一个分类变量的LabelEncoder()对象with open('labelencoder01.pkl', 'rb') as f_lblenc01:    label_encoder01 = pickle.load(f_lblenc01) # 用于编码第二个分类变量的LabelEncoder()对象with open('onehotencoder.pkl', 'rb') as f_onehotenc:    onehotencoder = pickle.load(f_onehotenc) # 训练中使用的OneHotEncoder对象X = df_features # df_features是包含计算的特征值的数据框X.values[:, 0] = label_encoder00.transform(X.values[:, 0])X.values[:, 1] = label_encoder01.transform(X.values[:, 1])X = onehotencoder.transform(X).toarray()pred = classifier.predict(X)

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注