首页 » python机器学习 » python机器学习全文在线阅读

《python机器学习》9.1 序列化通过scikit-learn拟合的模型

关灯直达底部

正如我们在第8章中所讨论的那样,训练机器学习模型会带来很高的计算成本。当然,我们不希望每次进行预测分析都打开Python交互窗口来训练模型,或者重新加载Web应用程序。模型持久化的一个方法就是使用Python内嵌的pickle模块[1],它使得我们可以在Python对象与字节码之间进行转换(序列化与反序列化),这样就可以将分类器当前的状态保存下来。当需要对新的样本进行分类时,可以直接加载已保存的分类器,而不必再次通过训练数据对模型进行训练。执行下列代码前,请确保已经使用第8章中介绍的方法完成了外存逻辑斯谛回归模型的训练,并且已在当前Python会话中:

通过上述代码,我们创建了一个movieclassifier目录,后续我们将在此存储Web应用中的文件和数据。在此目录下,我们创建了一个pkl_objects子目录,用于存储序列化后的Python对象。使用pickle中的dump方法,对训练好的逻辑斯谛回归模型及NLTK库中的停用词进行序列化,这样就不必在Web应用服务器上安装NLTK库了。dump方法的第一个参数是我们要持久化的对象,第二个参数用于制定序列化对象的保存路径,在此我们使用了Python中的open方法。open方法中的wb参数代表以二进制方式存储数据,而protocol=4则代表使用最新、最高效的protocol协议,此协议已在Python 3.4中使用[2]。

我们的逻辑斯谛回归模型中包含多个NumPy的数组,例如权重向量等,使用joblib库是序列化NumPy数组更加高效的一个替代方法。不过为了保障服务器环境与后续小节中的配置一致,我们仍旧使用标准的pickle方法。如果读者对joblib感兴趣,可以访问链接https://pypi.python.org/pypi/joblib以获得更多信息。

由于无需拟合HashingVectorizer,也就不必对其进行持久化操作。相反,我们可以创建一个新的Python脚本文件,通过此脚本可以将向量数据导入到当前Python会话中。请拷贝下列代码,并以vectorizer.py作为文件名,保存在movieclassifier目录下:

在对Python对象进行序列化操作以及保存好vectorizer.py文件后,最好重新启动一下Python交互窗口或者IPython Notebook,以测试是否可以准确无误地对已保存模型进行逆持久化操作。不过,请注意,由于pickle模块未对恶意代码进行防范,因此对从不受信任渠道获得的数据进行持久化操作可能会具有潜在的安全风险。在终端窗口中,定位到movieclassifier所在的路径,开启一个新的Python会话,并执行下列代码以确保可以正常导入vectorizer及对分类器进行逆持久化处理:

在成功加载vectorizer及反序列化分类器后,我们现在就可以使用这些对象对文档样本进行预处理,并对它们所代表的情感倾向进行预测:

由于分类器返回的类标为整数,我们在此定义一个简单的Python字典将整数映射到对应的情感上。然后,我们使用HashingVectorizer将样本文档转换为单词向量X。最后,我们使用逻辑斯谛回归分类器的predict方法预测类标,并通过predict_proba方法返回各预测结果相应的概率。请注意,对predict_proba方法的调用会返回一个数组,以及每个类标所对应的概率。由于predict返回的是较高概率对应的类标,我们则使用np.max函数返回对应预测类别的概率[3]。

[1] https://docs.python.org/3.4/library/pickle.html.

[2] 如果无法正常使用protocol 4,请检查是否安装了Python 3的最新版本。此外,你也可以选择一个较低版本的protocol。

[3] 情绪的概率,最终的类别是通过np.max得到的概率较高的那个。——译者注