用Shiny APP封装发布墨尔本房价回归模型

Jean

墨尔本房价回归模型的研究去年已经完成,有两篇文章介绍:<br>1、<a href="https://www.meipian.cn/3s16a1ol?share_depth=1" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>《房价预测模型:集成回归与深度学习》</a><br>2、<a href="https://www.meipian.cn/3u1prcl8?share_depth=1" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>《房价预测回归模型之超参数调整》</a><br>我的书《图解税收大数据分析》的第八章<a href="http://jeanye.cn/melbourne/Chapter-8-Melbourne-Regress.docx" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>《回归分析 房价预测模型》</a>整理了这些研究,该章内容及相关的数据和程序都可以<a href="http://jeanye.cn/melbourne/" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>从我的研究网站上下载</a>。<br>本篇介绍用Shiny APP封装上述各回归模型,并嵌入集成到Tomcat WEB APP的传统J2EE业务应用系统处理流程中,完成落地应用的最后一个环节,体验地址: <a href="https://jeanye.cn:8443/melbourne" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>墨尔本房价回归示例</a>,如果美篇内不能导航过去,可以拷贝下面的网址到浏览器:https://jeanye.cn:8443/melbourne 。<br>当时的研究都是用Python完成的,这些回归算法都有相应的R语言版本与库,也可以用R语言去完成,精力有限就不用R语言重写了,在Shiny中用reticulate包调用Python程序也是一样的,读者诸君就不必再去纠缠这个问题了,海纳百川,有容乃大,太极是两仪的统一。 图一、Tomcat Web APP调用Shiny APP 图二、Shiny APP分析异常房价,选中要进一步了解的数据,传回Tomcat Web APP。 图三、Tomcat Web APP后续处理,这里是显示原始数据。 一、数据及预处理<br>详细介绍可以看书或上面的第一篇文章,《房价预测模型:集成回归与深度学习》。原始数据共34857条,经过预处理过滤后,剩下9015条符合本文回归算法的使用要求(主要是要有经纬度坐标等关键数据项,基本上没有使用需要插值的数据),80%划分为测试集共7212条,20%划分为验证集共1803条,这个样本量对训练与验证来说都是可以的。如果有需要,也可以分为训练集、验证集与测试集3个子集,后面可以看到,训练集上都有很高的准确率,验证集的作用是测试模型抗过拟合的性能,测试集则可以测试模型在新数据上的泛化性能。也可以在剩余的2万多条数据中选一些缺失项较少的来做测试集。<br>1、<a href="http://jeanye.cn/melbourne/Melbourne_housing_Pre.ipynb" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>预处理程序</a>。<br>2、<a href="http://jeanye.cn/melbourne/Melbourne_housing_FULL.csv" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>原始数据</a>。<br>3、<a href="http://jeanye.cn/melbourne/Melbourne_housing_pre.csv" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>预处理结果数据</a>,后面的回归算法将用预处理结果数据。 图四、ln(房价)接近正态分布 二、模型训练及超参数调优<br>详细介绍可以看书或上面的两篇文章。<br>1、以<a href="http://jeanye.cn/melbourne/Melbourne_housing_CatBoost.ipynb" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>CatBoost为例的模型训练、分析、超参数调优程序NoteBook</a>,这个是<a href="http://jeanye.cn/melbourne/Melbourne_housing_CatBoost.py" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>Spyder中运行的.py版</a>,Linux虚拟主机上也可以用Rstudio Server直接运行py版的程序。<br>其它程序只列出py版,因为原来都是在Spyder上调试的,上面的CatBoost NoteBook是为了测试Linux虚拟主机上的安装环境,看看JupyterHub能否正常运行,需要的话根据py版自己写就可以了。它们主要是算法初始化与要调优的超参数不同。Blend算法是取RF、GBR、XGB、LightGBM、CatBoost五个算法各占20%的权重组合而成,属于水平堆叠,主要的作用是增强模型的抗过拟合能力与泛化能力,效果也不错。理论上选不同类型的算法效果要好一点,但在本数据集中,SVM等其它算法与各GBDT算法的准确率差距较大,就没有选。Stack层次堆叠回归算法因为速度太慢,精度上改善也不大,这里没有列入。在房价回归模型这个问题上,深度学习DNN回归的效果比不上上面的那些算法,可能是还没有找到有效的神经网络结构,这个方向暂时也没有继续研究。<div>2、<a href="http://jeanye.cn/melbourne/Melbourne_housing_SVM.py" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>SVM</a>。<br>3、<a href="http://jeanye.cn/melbourne/Melbourne_housing_RF.py" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>随机森林</a>。<br>4、<a href="http://jeanye.cn/melbourne/Melbourne_housing_GBR.py" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>GBR</a>。<br>5、<a href="http://jeanye.cn/melbourne/Melbourne_housing_XGB.py" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>XGB</a>。<br>6、<a href="http://jeanye.cn/melbourne/Melbourne_housing_LGBM.py" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>LightGBM</a>。<br>7、<a href="http://jeanye.cn/melbourne/Melbourne_housing_keras.py" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>Keras+TensorFlow</a>。<br>8、<a href="http://jeanye.cn/melbourne/Melbourne_housing_All.ipynb" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>所有模型调优前后性能对比Notebook</a>,都有比较大的提升,贝叶斯优化是比较有效的超参数优化算法。不过要记住,在具体训练集上优化的超参数,必然是与具体的数据集相关的,人们只能期望它有较好的抗过拟合与泛化能力,在新的数据集上表现足够好,至于是否最好,那就未必了。<br></div> 图五、CatBoost回归算法训练 图六、Stack与Blend堆叠回归算法 <div>三、Shiny引用各回归模型<br></div><div>Shiny中是在global.R中用上面各模型的最优参数,一次过加载所有模型,训练好,拟合好(预测)训练集与验证集,并把各算法训练集与验证集预测的结果生成dataframe,以便后面在交互式的UI中快速反复引用。数据集不大,速度也很快,一般不到2分钟(取决于服务器的负荷)。</div><div>9、 <a href="http://jeanye.cn/melbourne/Melbourne_Regress.py" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>加载最优参数各模型Python程序</a>,由Shiny调用。<br>10、 <a href="http://jeanye.cn/melbourne/Melbourne_Regress.R" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>测试Python模型加载R语言程序</a>。<br></div><div>以下是Shiny APP的源码,访问上面的<a href="https://jeanye.cn:8443/melbourne" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>体验网址</a>也可以看到:</div><div>11、<a href="http://jeanye.cn/melbourne/shiny/global.R" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>global.R</a>。</div><div>12、<a href="http://jeanye.cn/melbourne/shiny/server.R" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>server.R</a>。</div><div>13、<a href="http://jeanye.cn/melbourne/shiny/ui.R" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>ui.R</a>。</div><div>server.R中主要的处理是在renderImage()中,把ggplot作的图输出到SVG临时文件中,以支持中文标注,因为从源码安装R时选了Cairo而不是默认的TCL/TK后端图形支持。如果编译安装R时就选了TCL/TK图形支持,就不需要SVG临时文件,直接在renderImage()或renderPlot()中用ggplot就可以了,Windows上就是这样。</div><div>然后是Shiny Data Table菜单的中文支持,它的资源文件也可以在离线运行时从本地加载,不需要每次都联网加载。在APP目录下建立子目录"www",把菜单语言资源文件Chinese.json拷贝进去,然后在renderDataTable()的options中设置语言url为下面即可:</div><div>language = list(url = 'Chinese.json') <br></div><div>Shiny Data Table支持多选,对它的操作会记录在input$下的一系列reactive输入变量中,可以引用,具体参阅<a href="https://rstudio.github.io/DT/shiny.html" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>Shiny Data Table文档</a>,这里引用它的input$tabel_ID_rows_selected,更新显示UI中的textAreaInput输入框,以便在UI中传出选中的行到外层的Tomcat Web APP。</div> 图七、在Rstudio中调试Shiny APP 四、Shiny APP嵌入到Tomcat WEB APP中<br>演示性质,这个嵌入的业务流程非常简单,就是传入选择的算法名称,调用回归算法得到验证集异常房价列表,选择感兴趣的异常值传给下一环节处理。所以Tomcat WEB APP很简单,只有2个页面,index.jsp通过IFRAME嵌入对上面Shiny APP的引用,Shiny APP按业务(系统)流程传入的算法及选择的异常值阀值选出验证集候选的异常值后,人工浏览分析,在datatable中选中要进一步处理的样本,传给业务流程中的下一个环节details.jsp处理,演示性质也是简单的显示选中样本的原始数据。<br>14、<a href="http://jeanye.cn/melbourne/tomcat/index.jsp" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>index.jsp</a>。<br>15、<a href="http://jeanye.cn/melbourne/tomcat/details.jsp" target="_blank" class="link"><i class="iconfont icon-iconfontlink"> </i>details.jsp</a>。 图八、在Tomcat Web APP中嵌入Shiny APP 五、小结<div>这是一个典型的税收大数据AI应用场景。</div><div>1、集成进业务应用系统的业务流程中。本例用嵌入的方式,业务流程也简单,但所有的元素都实现了。</div><div>2、交互式UI,交互式图表分析数据,所有分析最后都要业务的参与,由业务使用,并从业务得到反馈改进。技术最后是为业务服务,业务能否与技术有效融合是应用成功的关键。</div><div>3、应用机器学习AI算法分析数据,并且非常有效。AI算法的作用是总结了业务经验与数据统计规律,全量扫描,这样就突破了案头分析的人工与经验局限,便于进行规模化、常态化、自动化的精准分析。</div><div>4、有效的深度分析都需要编程。机器学习与深度学习等AI算法的应用都需要编程。当然成熟的落地应用也可以参数化,在傻瓜式搭积木的用户界面中设定参数,然后调用后面编好的模型。但人们要知道,后端模型的开发、调试与迭代,一定是要编程的,甲方参与到哪个程度与层面,会影响整个系统的体系设计与UI。如果分析需求灵活多变,或者希望释放自身及基层的力量与积极性,甲方参与的程度就要高一点,主动权也多一点,那就要培养一支掌握当代大数据分析技术的队伍,并且要精通业务或形成业务与技术有效融合的团队。深度分析是金字塔尖的工作,队伍精炼但会产生很大的价值。</div><div>5、这一系列的落地应用例子,发票货劳名称识别、交易网络分析、房价回归分析等都说明了,有效的落地应用,一定是有效集成各个系统与平台,综合应用各种技术。比如上述各例子,应用了机器学习、深度学习、NLP、数据库、图数据库、GIS、GPU等多种技术,集成了各种云计算平台、J2EE平台、HanLP、Neo4j、Shiny等,综合运用了R、Python、Java、Cypher、SQL、JavaScript、HTML、CSS等各种语言。在实际落地应用中,要根据应用场景的需要组合运用,一种技术,一个平台,或者一种语言,无法包打天下,这要成为一个基本的认识。</div><div><br></div><div>作为个人的兴趣与研究,资源有限,所以我选择使用的都是优秀的开源软件,做出来的也是开源解决方案。再次说明一下,纯属个人的兴趣与研究,不代表工作或任何其它的立场。</div> 这个阶段本来春节的时候应该就结束了,因为学习Shiny又延长了几个月,因为它确实优秀,也确实适合用来封装发布我的书中的各项研究结果。写完这篇文章,这段路该告一段落了。