将Scikit中交叉验证训练的模型保存

15

我已经使用 scikit-learn 中的交叉验证和朴素贝叶斯分类器训练了一个模型。如何将这个模型保存下来,以便稍后对新实例运行?

这里是我的简单描述,我可以得到 CV 分数,但不知道如何访问已经训练好的模型。

gnb = GaussianNB() 
scores = cross_validation.cross_val_score(gnb, data_numpy[0],data_numpy[1], cv=10)
2个回答

17

cross_val_score不会更改您的估算器,也不会返回已拟合的估算器。它只返回交叉验证估算器的得分。

要拟合您的估算器-您应该显式地调用提供的数据集上的fit方法。要保存(序列化)它-可以使用pickle:

# To fit your estimator
gnb.fit(data_numpy[0], data_numpy[1])
# To serialize
import pickle
with open('our_estimator.pkl', 'wb') as fid:
    pickle.dump(gnb, fid)
# To deserialize estimator later
with open('our_estimator.pkl', 'rb') as fid:
    gnb = pickle.load(fid)

我想使用交叉验证来拟合估计器,也就是使用交叉验证来计算参数。那么我该怎么做呢? - Ali
6
@alivar,CV会将数据集拆分成不同的子集,并使用不同的分类器进行拟合,然后平均它们的得分。这就是为什么不存在使用交叉验证来拟合估计器的概念。基本上,您只需在完整数据集上拟合估计器即可。如果您想找到估计器的超参数,请查看GridSearchCV - Ibraim Ganiev
GridSearchCV很不错,但是训练后我找不到theta和sigma向量。BTE让我再解释一下我的问题,这样你可能有更好的解决方案或纠正我。我有一个带有标签实例的数据集,我可以用它来训练一个分类器,然后我必须在我不知道真实类别的新实例上运行分类器。现在,我所关心的是,如果我仅仅使用带有标签的数据集来训练一个GaussianNB,我不确定它是否会给我与使用CV时相同准确性的分类器。这有意义吗? - Ali
2
@alivar,如果您在完整数据集上训练评估器,而不是在K折交叉验证中的k-1部分上进行训练,那么它将会得到更好的结果(而不是更差)。在评估器已经在CV中显示出足够的得分后,在完整数据集上学习评估器是一种常见做法。 - Ibraim Ganiev

0

关于multioutput.RegressorChain()的内部机制,我可能会有所疏漏,但我相信您可以向RegressorChain提供相同的cv,并仅使用一个dv运行RegressorChain。

这将允许您按照您的意愿使用.predict()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接