首页 > 解决方案 > 如何将训练有素的 H2O BinaryModel 从服务器移动到本地 R

问题描述

xgboost我在虚拟机上用 R训练了一个使用 h2o 框架。我使用该函数将模型保存在服务器的文件夹中,h2o.saveModel()并且可以使用该函数正确加载它h2o.loadModel()

xgboost_model    <- h2o.xgboost(
                      x = predictors,
                      y = response,
                      training_frame = train_h2o,
                      model_id       = "xgboost_v1"
                      )
path_for_model = "/data/R/xxx/xxx/xxx/"
path_saved_model <- h2o.saveModel(xgboost_model, path = path_for_model, force = FALSE)

loaded_model     <- h2o.loadModel(path_saved_model)

当我在本地硬盘上path_for_model的函数生成的目录中下载文件时,h2o.saveModel()我无法在本地 RStudio 环境中加载它,并且收到以下错误消息

找不到算法 url 名称 xgboost 的生成器

ERROR: Unexpected HTTP Status code: 400 Bad Request (url = 
http://localhost:54321/99/Models.bin/)

java.lang.IllegalArgumentException
[1] "java.lang.IllegalArgumentException: Cannot find Builder for algo url 
name xgboost"                           
[2] "    hex.ModelBuilder.ensureBuilderIndex(ModelBuilder.java:141)"                                              
[3] "    hex.ModelBuilder.havePojo(ModelBuilder.java:120)"                                                        
[4] "    hex.Model.havePojo(Model.java:119)"                                                                      
[5] "    water.api.schemas3.ModelSchemaV3.fillFromImpl(ModelSchemaV3.java:73)"                                    
[6] "    water.api.schemas3.ModelSchemaV3.fillFromImpl(ModelSchemaV3.java:21)"                                    
[7] "    water.api.ModelsHandler.importModel(ModelsHandler.java:210)"                                             
[8] "    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)"                                             
[9] "    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)"                                             
[10] "    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)"                                         
[11] "    java.lang.reflect.Method.invoke(Unknown Source)"                                                         
[12] "    water.api.Handler.handle(Handler.java:63)"                                                               
[13] "    water.api.RequestServer.serve(RequestServer.java:451)"                                                   
[14] "    water.api.RequestServer.doGeneric(RequestServer.java:296)"                                               
[15] "    water.api.RequestServer.doPost(RequestServer.java:222)"                                                  
[16] "    javax.servlet.http.HttpServlet.service(HttpServlet.java:755)"                                            
[17] "    javax.servlet.http.HttpServlet.service(HttpServlet.java:848)"                                            
[18] "    org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)"                                  
[19] "    org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)"                              
[20] "    org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)"                      
[21] "    org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)"                               
[22] "    org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)"                       
[23] "    org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)"                           
[24] "    org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)"                   
[25] "    org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)"                         
[26] "    water.JettyHTTPD$LoginHandler.handle(JettyHTTPD.java:197)"                                               
[27] "    org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)"                   
[28] "    org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)"                         
[29] "    org.eclipse.jetty.server.Server.handle(Server.java:370)"                                                 
[30] "    org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)"          
[31] "    org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53)"           
[32] "    org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)"                
[33] "    org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)"
[34] "    org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)"                                        
[35] "    org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)"                                   
[36] "    org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72)"                  
[37] "    org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264)"            
[38] "    org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)"                        
[39] "    org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)"                         
[40] "    java.lang.Thread.run(Unknown Source)"                                                                    

Error in .h2o.doSafeREST(h2oRestApiVersion = h2oRestApiVersion, urlSuffix = page,  : 


ERROR MESSAGE:

Cannot find Builder for algo url name xgboost

我知道可以下载模型的 pojo 和/或 mojo java 版本,但我想坚持使用 R 二进制文件。我在任何地方都没有看到任何与我的错误类似的相关帖子。

我正在使用 H2O 版本 3.20.0.3 和 R 版本 3.4.4 。

标签: rh2oxgboost

解决方案


推荐阅读