用户工具

站点工具


model:errors

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
model:errors [2020/01/10 16:14]
jinlong 创建
model:errors [2020/07/12 12:07] (当前版本)
行 218: 行 218:
  
 ===== 模型发布时提示InvalidResultException错误 ===== ===== 模型发布时提示InvalidResultException错误 =====
 +
 +==== 问题现象 ====
 +
 +模型发布时,界面提示以下错误: Field "​XXXXXX"​ cannot accept user input value NaN。
 +系统后台报错如下:
 +
 +<​code>​
 +Servlet.service() for servlet [dispatcherServlet] in context with path [/register] threw exception [Request processing failed; nested exception is org.jpmml.evaluator.InvalidResultException:​ Field "​近一个月访问url个数"​ cannot accept user input value NaN] with root cause
 +
 +org.jpmml.evaluator.InvalidResultException:​ Field "​近一个月访问url个数"​ cannot accept user input value NaN
 + at org.jpmml.evaluator.InputFieldUtil.performInvalidValueTreatment(InputFieldUtil.java:​221) ~[pmml-evaluator-1.4.11.jar!/:​na]
 + at org.jpmml.evaluator.InputFieldUtil.prepareScalarInputValue(InputFieldUtil.java:​137) ~[pmml-evaluator-1.4.11.jar!/:​na]
 + at org.jpmml.evaluator.InputFieldUtil.prepareInputValue(InputFieldUtil.java:​111) ~[pmml-evaluator-1.4.11.jar!/:​na]
 + at org.jpmml.evaluator.InputField.prepare(InputField.java:​70) ~[pmml-evaluator-1.4.11.jar!/:​na]
 + at org.jpmml.evaluator.ModelEvaluator.verify(ModelEvaluator.java:​475) ~[pmml-evaluator-1.4.11.jar!/:​na]
 + at org.jpmml.evaluator.ModelEvaluator.verify(ModelEvaluator.java:​78) ~[pmml-evaluator-1.4.11.jar!/:​na]
 + at cn.eppdev.mlib.basic.util.EppdevMlibPmmlUtils.getEvaluatorByContent(EppdevMlibPmmlUtils.java:​105) ~[eppdev-mlib-basic-utils-1.0.0.jar!/:​1.0.0]
 + at cn.eppdev.mlib.basic.util.EppdevMlibPmmlUtils.valid(EppdevMlibPmmlUtils.java:​42) ~[eppdev-mlib-basic-utils-1.0.0.jar!/:​1.0.0]
 + at cn.eppdev.mlib.register.admin.service.AdminModelService.insert(AdminModelService.java:​88) ~[classes!/:​1.0.0]
 + at cn.eppdev.mlib.register.admin.service.AdminModelService$$FastClassBySpringCGLIB$$4dcc733.invoke(<​generated>​) ~[classes!/:​1.0.0]
 + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:​218) ~[spring-core-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:​749) ~[spring-aop-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:​163) ~[spring-aop-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:​294) ~[spring-tx-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:​98) ~[spring-tx-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:​186) ~[spring-aop-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:​688) ~[spring-aop-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at cn.eppdev.mlib.register.admin.service.AdminModelService$$EnhancerBySpringCGLIB$$c913079a.insert(<​generated>​) ~[classes!/:​1.0.0]
 + at cn.eppdev.mlib.register.admin.web.AdminModelController.doAddModel(AdminModelController.java:​126) ~[classes!/:​1.0.0]
 + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:​1.8.0_232-ea]
 + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:​62) ~[na:​1.8.0_232-ea]
 + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:​43) ~[na:​1.8.0_232-ea]
 + at java.lang.reflect.Method.invoke(Method.java:​498) ~[na:​1.8.0_232-ea]
 + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:​189) ~[spring-web-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:​138) ~[spring-web-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:​102) ~[spring-webmvc-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:​895) ~[spring-webmvc-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:​800) ~[spring-webmvc-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:​87) ~[spring-webmvc-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:​1038) ~[spring-webmvc-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:​942) ~[spring-webmvc-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:​1005) ~[spring-webmvc-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:​908) ~[spring-webmvc-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at javax.servlet.http.HttpServlet.service(HttpServlet.java:​660) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:​882) ~[spring-webmvc-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at javax.servlet.http.HttpServlet.service(HttpServlet.java:​741) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:​231) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:​166) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:​53) ~[tomcat-embed-websocket-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:​193) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:​166) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:​99) ~[spring-web-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:​107) ~[spring-web-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:​193) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:​166) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:​92) ~[spring-web-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:​107) ~[spring-web-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:​193) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:​166) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:​93) ~[spring-web-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:​107) ~[spring-web-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:​193) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:​166) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:​200) ~[spring-web-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:​107) ~[spring-web-5.1.4.RELEASE.jar!/:​5.1.4.RELEASE]
 + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:​193) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:​166) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:​199) ~[tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:​96) [tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:​490) [tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:​139) [tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:​92) [tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:​74) [tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:​343) [tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:​408) [tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:​66) [tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:​834) [tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:​1417) [tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:​49) [tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:​1149) [na:​1.8.0_232-ea]
 + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:​624) [na:​1.8.0_232-ea]
 + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:​61) [tomcat-embed-core-9.0.14.jar!/:​9.0.14]
 + at java.lang.Thread.run(Thread.java:​748) [na:​1.8.0_232-ea]
 +</​code>​
 +
 +==== 原因分析 ====
 +
 +此为jpmml的Bug,主要是因为在模型pmml文件保存时,pmml中自动保存的验证数据,
 +将空值直接为NaN,而在pmml中该字段被认为时int字段,导致pmml发布过程中的自检失败。
 +验证数据示例如下:
 +
 +<code xml>
 + <​row>​
 + <​data:​来源四级>​懂车帝DCC订单</​data:​来源四级>​
 + <​data:​性别>​女</​data:​性别>​
 + <​data:​年龄>​20-25</​data:​年龄>​
 + <​data:​消费能力>​中</​data:​消费能力>​
 + <​data:​终端品牌>​欧珀</​data:​终端品牌>​
 + <​data:​近一周访问url天数>​NaN</​data:​近一周访问url天数>​
 + <​data:​近一个月访问url个数>​NaN</​data:​近一个月访问url个数>​
 + <​data:​probability_false>​0.12311307178035973</​data:​probability_false>​
 + <​data:​probability_true>​0.8768869282196402</​data:​probability_true>​
 + </​row>​
 + <​row>​
 + <​data:​来源四级>​懂车帝DCC订单</​data:​来源四级>​
 + <​data:​性别>​男</​data:​性别>​
 + <​data:​年龄>​20-25</​data:​年龄>​
 + <​data:​消费能力>​中</​data:​消费能力>​
 + <​data:​终端品牌>​苹果</​data:​终端品牌>​
 + <​data:​近一周访问url天数>​0</​data:​近一周访问url天数>​
 + <​data:​近一个月访问url个数>​0</​data:​近一个月访问url个数>​
 + <​data:​probability_false>​0.11877290234764215</​data:​probability_false>​
 + <​data:​probability_true>​0.8812270976523577</​data:​probability_true>​
 + </​row>​
 +</​code>​
 +
 +
 +==== 解决方案 ====
 +
 +解决方案有三个:
 +
 +  - 手工将验证数据中含有NaN的数据删除,可以值删除该字段数据,也可以将整条数据全部删除
 +  - 调整pmml输出,pmml中不再包含验证数据
 +  - 在建模过程中,首先对该数据进行处理(使用dataframe.fillna方法),但是在数据预处理过程中仍然保留缺失值填充的方法,避免实际计算时出错
model/errors.1578644092.txt.gz · 最后更改: 2020/07/12 12:07 (外部编辑)