使用empty.maxBy异常并使用java.lang.OutOfMemoryError进行训练时,Predictionio评估失败

时间:2015-06-11 04:48:38

标签: java heap-memory evaluation training-data predictionio

我已在text classification模板上下载了最新更新。我创建了一个新的应用程序并通过指定app id

导入了stopwords.json和emails.json
SELECT * 
FROM  vendors
ORDER BY staffpick ='YES' AND totalfav DESC,
         staffpick IS NULL AND totalfav DESC,
         staffpick IS NULL AND totalfav IS NULL AND vendorname ASC

然后我更改了engine.json并在其中提供了我的应用名称。

$ pio import --appid <appID> --input data/stopwords.json
$ pio import --appid <appID> --input data/emails.json

但下一步即评估失败,错误为{ "id": "default", "description": "Default settings", "engineFactory": "org.template.textclassification.TextClassificationEngine", "datasource": { "params": { "appName": "<myapp>", "evalK": 3 } 。错误的一部分粘贴在

下面
empty.maxBy

然后我尝试[INFO] [Engine$] Preparator: org.template.textclassification.Preparator@79a13920 [INFO] [Engine$] AlgorithmList: List(org.template.textclassification.LRAlgorithm@420a8042) [INFO] [Engine$] Serving: org.template.textclassification.Serving@faea4da Exception in thread "main" java.lang.UnsupportedOperationException: empty.maxBy at scala.collection.TraversableOnce$class.maxBy(TraversableOnce.scala:223) at scala.collection.AbstractTraversable.maxBy(Traversable.scala:105) at org.template.textclassification.PreparedData.<init> (Preparator.scala:160) at org.template.textclassification.Preparator.prepare(Preparator.scala:39) at org.template.textclassification.Preparator.prepare(Preparator.scala:35) at io.prediction.controller.PPreparator.prepareBase(PPreparator.scala:34) at io.prediction.controller.Engine$$anonfun$25.apply(Engine.scala:758) at scala.collection.MapLike$MappedValues.get(MapLike.scala:249) at scala.collection.MapLike$MappedValues.get(MapLike.scala:249) at scala.collection.MapLike$class.apply(MapLike.scala:140) at scala.collection.AbstractMap.apply(Map.scala:58) 但是在显示一些观察结果后训练也失败了。显示的错误是pio train。错误的一部分粘贴在下面。

java.lang.OutOfMemoryError: Java heap space

这是因为内存不足吗?我运行了相同模板的先前版本,文本分类数据大于40mb而没有问题。评估是培训必须的吗?您也可以解释一下评估是如何进行的吗?

1 个答案:

答案 0 :(得分:2)

所以我只能在没有前一个问题的情况下运行评估,而后一个问题与内存使用有关。

同样,当您的数据未通过empty.maxBy读入时,会发生DataSource错误。我的第一个猜测是,如果您使用appName以外的其他MyTextApp,请确保您还在EngineParamsList脚本中的Evaluation.scala对象中反映了该更改。您将看到在那里为评估创建DataSourceParams对象。

对于OutofMemoryError,您应该在训练/评估之前增加您的驾驶员记忆。这可以通过执行以下操作来完成:

pio train -- --driver-memory xG --executor-memory yG pio eval org.template.textclassification.AccuracyEvaluation org.template.textclassification.EngineParamsList -- --driver-memory xG --executor-memory yG

设置 - 驱动程序内存到1G或2G就足够了。

至于评估的执行方式,PredictionIO默认执行k次交叉验证。为此,您的数据将分为大致等同大小的k部分。假设k为3用于说明目的。然后,对2/3的数据训练模型,并将另外1/3的数据用作测试集以估计预测性能。对每1/3数据重复此过程,然后将获得的3个性能估计值的平均值用作预测性能的最终估计值(在一般设置中,您必须自己决定什么是衡量此值的适当度量标准) 。对每个参数设置和您指定用于测试的模型重复此过程。

评估不是培训和部署的必要步骤,但是,它是一种选择应该用于培训和部署的参数/算法的方法。它被称为机器学习/统计中的模型选择。

编辑:对于文本向量化,每个文档都按以下方式进行矢量化:

说我的文件是:

“我是马可。”

第一步是对此进行标记化,这将导致以下数组/列表输出:

[“我”,“我”,“马可”]

然后,您将进行一个bigram提取,它存储以下一组令牌数组/列表:

[“我”,“我”],[“我”,“马可”],[“我”],[“我”],[“马可”]

这些中的每一个都用作构建双字母和单词计数向量的功能,然后应用tf-idf变换。请注意,要构建矢量,我们必须从每个文档中提取bigrams,以便这些特征向量可以变得非常大。您可以通过在Preparator阶段增加/减少inverseIdfMin / inverseIdfMax值来减少大量此事。