OneHotEncoder如何对单个值进行预测
错误信息 – ValueError: 模型的特征数量必须与输入匹配。模型的特征数量为1261,而输入的特征数量为16
我在文本数据上训练一个随机森林分类器。我为每个文本数据实例计算16个特征。由于这16个变量都是分类变量,我对这16个变量中的每一个使用OneHotEncoder
进行编码。这导致训练矩阵有1261列。我也对这些特征进行了缩放。我还对训练数据进行了80:20
的train: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)