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

《python机器学习》9.5 在公共服务器上部署Web应用

关灯直达底部

当完成应用的本地测试后,我们现在可以将其部署到公共Web服务器上了。在本书中,我们将使用PythonAnywhere托管Web服务,它专门用于Python Web应用的托管。此外,PythonAnywhere还提供了初学者账户,我们可以免费运行一个Web应用程序。

要创建一个新的PythonAnywhere账户,我们需要访问https://www.pythonanywhere.com,并点击右上角的“Pricing&signup”链接。接下来,点击“Create a Beginner account”按钮,此时需要输入用户名、密码,及一个有效的电子邮件地址,阅读并同意相关条款之后,我们就拥有一个新的账户了。

不过,免费账户无法在命令行终端通过SSH协议访问远程服务器。因此,只能使用PythonAnywhere Web界面管理我们的Web应用。在上传Web应用之前,需要事先在PythonAnywhere账户中创建一个新的Web应用。点击右上角的“Dashboard”按钮,就可以看到页面顶部显示的控制面板。接下来,点击页面顶部的“Web”标签,然后点击左侧的“Add a new Web app”按钮创建一个新的基于Python 3.4的Flask Web应用,并将其命名为movieclassifier。

在PythonAnywhere中创建好新的应用后,我们选择页面顶部的File标签,使用PythonAnywhere的Web界面上传本地movieclassifier目录下的文件。完成本地计算机中Web应用文件的上传后,在PythonAnywhere账号中能够看到一个movieclassifier目录。它与我们本地计算机上movieclassifier目录中的文件和目录结构完全相同,如下图所示:

最后,我们再次选择“Web”标签,并点击“Reload<读者自己注册的用户名>.pytho-nanywhere.com”按钮发送更新,刷新Web应用。这时,Web应用应该已经启动和运行起来了,可访问<读者自己注册的用户名>.pythonanywhere.com。

不幸的是,Web服务器可能对Web应用程序中的细微问题也相当敏感。如果读者通过浏览器访问在PythonAnywhere中的应用程序时出错,可以在个人账号主页面的“Web”标签下检查服务器日志信息,以更好地帮助查找问题所在。

更新电影评论分类器

当收到用户关于分类的反馈后,模型会自动即时更新,但是如果服务器崩溃或者重启,clfd对象的更新就会被重置。如果我们重新加载Web应用,clf对象将通过classifier.pkl文件重新初始化。使得更新能够持久保存的一个方法就是:模型一旦被更新就立刻序列化新的clf对象。但是,随着用户的增多,此方案效率会逐渐低下,而且如果用户同时提交反馈信息,有可能会损坏序列化文件。另一种解决方案就是使用SQLite数据库保存的反馈信息更新预测模型。我们可以从PythonAnywhere的服务器上下载SQLite数据库,在本地计算机上更新clf对象,并上传新的序列化文件到PythonAnywhere。为了在本地计算机上更新分类器,我们在movieclassifier目录下创建一个update.py脚本文件,并键入以下代码:

update_model函数以每次10000条记录的方式批量从数据库中读取数据,如果记录数量小于10000条,则根据实际数量读取。或者我们可以将代码中的fetchmany改为fetchone,从而每次只读取一条记录,但这样计算效率会很差。如果使用fetchall方法,则可能在面对海量数据时导致计算机或服务器的内存溢出。

创建好update.py脚本后,我们将其上传到PythonAnywhere服务器上的movieclassifier目录下,并在应用的入口脚本app.py中导入update_model函数,确保每次重启Web服务器后,能够根据SQLite数据库内容对分类器进行更新。为了实现此功能,我们需要在app.py开头增加一行导入update.py脚本中update_model函数的代码:

然后,我们就可以在应用程序的主脚本中调用update_model函数了: