首页 > 解决方案 > 训练并加载了 sklearn 模型,但无法访问模型以执行预测

问题描述

我已经训练了一个模型并使用类方法保存了它。在进行评估时,我想加载经过训练的模型并在我的测试文件上进行预测;但我什至无法使用我加载的模型。我检查了加载模型的类型,它是一种方法,但我不确定它是否是正确使用的类型。

另外,我不确定我的 save_model 方法是否已将拟合模型与经过训练的模型一起保存,我想这可能是我无法访问加载的模型的原因。抱歉,如果我不是很清楚,请参阅下面的代码——我的意思会更清楚。

我在互联网上搜索了所有的解决方案,似乎都没有帮助..所以任何帮助都将不胜感激!!!!

保存模型方法

# POS class
def __init__(self):
    self.vec = DictVectorizer()
    self.model = LinearSVC()

def fit_and_report(self, X, Y):
    X = self.vec.fit_transform(X)
    self.model.fit(X, Y)

def save_model(self, output_file):
    with open(output_file, "wb") as outfile:
        pickle.dump(self, outfile)

在第一次训练模型时,我做了以下事情。

X, Y = pre_process.load_dataset('my_train_file')
X, Y = pre_process.prepare_data_for_training(X, Y)
my_model = function_in_tagger.POS() #call the POS class from a separate script
my_model.fit_and_report(X, Y) # I assumed the self.model.fit(X, Y) in the method is also saved to the model???
my_model.save_model('my_model_file')

加载并执行预测

X_test, Y_test = pre_process.load_dataset('my_test_file') # it returns X and Y (both are list)
loaded_model = pickle.load(open('my_model_file', 'rb'))
y_predict = loaded_model.predict(X_test)

我得到的错误是

y_predict = loaded_model.predict(Y_test)

AttributeError: 'POS' object has no attribute 'predict'

我也尝试获取训练模型的分数,但得到了同样的错误

score = loaded_model.score(X_test, Y_test)

AttributeError: 'POS' object has no attribute 'score'

新编辑

我尝试使用 DictVectorizer 转换我的测试数据,但它给了我一个属性错误('DictVectorizer' 对象没有属性'feature_names_')

vec = DictVectorizer()
vec.transform(X_test)

然后我尝试在转换之前拟合测试数据,然后它没有给我任何错误消息。但据我了解,我不应该拟合我的测试数据,而只是变换。

当同时使用 fit 和 transform 方法时,它仍然给我以下错误

y_predict = loaded_model.predict(Y_test)

AttributeError: 'POS' object has no attribute 'predict'

标签: pythonscikit-learnpickle

解决方案


您的错误源于您的测试数据。您应该在接受训练的模型之前转换测试数据。您的模型是在未列出的转换数据上训练的,请参见下面基于文本分类的示例;

#加载训练好的模型

with open('Rf Classifier', 'rb') as training_model: Rf_model = pickle.load(training_model))

加载模型后,在我的情况下转换测试数据,它是数据框的形式。由于我使用了多个变量,因此我使用 DataframeMapper 库来转换测试数据

test_data=mapper.transform(df_test) #df_test refers to the test data which is a dataframe

之后,您使用经过训练的模型预测您的转换/矢量化数据,如下所示;

df_test["class"] = Rf_model.predict(test_data) # this section creates a new column for predicted class

推荐阅读