使用经过缩放特征预训练的模型进行单次预测
Posted
技术标签:
【中文标题】使用经过缩放特征预训练的模型进行单次预测【英文标题】:Single prediction using a model pre-trained with scaled features 【发布时间】:2019-11-11 14:51:12 【问题描述】:我训练了一个具有缩放特征的 SVM scikit-learn 模型,并将其保留以供以后使用。在另一个文件中,我加载了保存的模型,我想提交一组新的特征来执行预测。我是否必须扩展这组新功能?我怎样才能只用一组功能做到这一点?
我没有缩放新值,我得到了奇怪的结果,我无法进行预测。尽管如此,StratifiedShuffleSplit 生成的大型测试集的预测运行良好,准确率达到 97%。
问题在于使用经过缩放特征训练的持久 SVM 模型的单一预测。知道我做错了什么吗?
【问题讨论】:
您可以在扩展过程中包含您的测试功能,以便您在测试和训练测试的联合上进行扩展。也许这有帮助。您的测试集中缺少准确性也可能是您的测试集结构的问题,您是否进行了交叉验证?这意味着您使用不同的训练集和测试集运行它。 【参考方案1】:是的,您绝对应该对新数据执行相同的缩放。但是,如果您没有保存之前训练的缩放器,这可能是不可能的。
这就是为什么您应该与 SVM 一起训练和保存缩放器,而不是训练和保存 SVM。在机器学习术语中,这被称为流水线。
这是您在玩具示例中使用它的方式:
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_breast_cancer
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
data = load_breast_cancer()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(X,y)
pipe = Pipeline([('scaler',StandardScaler()), ('svc', SVC())])
然后,此管道支持与常规 scikit-learn
模型相同的操作:
pipe.fit(X_train, y_train)
pipe.score(X_test, y_test)
当拟合pipe
时,它首先进行缩放,然后将缩放后的特征输入分类器。
一旦经过训练,您就可以像之前保存 SVM 一样保存 pipe
对象。当您将其加载并将其应用于新数据时,它将在预测之前根据需要进行缩放。
【讨论】:
以上是关于使用经过缩放特征预训练的模型进行单次预测的主要内容,如果未能解决你的问题,请参考以下文章
如何使用分布式 Dask 和预训练的 Keras 模型进行模型预测?