0

我已经下载了文本分类模板的最新更新。我创建了一个新应用程序并通过指定应用程序 ID 导入了 stopwords.json 和 emails.json

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

然后我更改了 engine.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。错误的一部分粘贴在下面。

[INFO] [Engine$] Data santiy check is on.
[INFO] [Engine$] org.template.textclassification.TrainingData supports data sanity check. Performing check.

Observation 1 label: 1.0
Observation 2 label: 0.0
Observation 3 label: 0.0
Observation 4 label: 1.0
Observation 5 label: 1.0

[INFO] [Engine$] org.template.textclassification.PreparedData does not support data sanity check. Skipping check.
[WARN] [BLAS] Failed to load implementation from: com.github.fommil.netlib.NativeSystemBLAS
[WARN] [BLAS] Failed to load implementation from: com.github.fommil.netlib.NativeRefBLAS
[INFO] [Engine$] org.template.textclassification.NBModel does not support data sanity check. Skipping check.
[INFO] [Engine$] EngineWorkflow.train completed
[INFO] [Engine] engineInstanceId=AU3g4XyhTrUUakX3xepP
[INFO] [CoreWorkflow$] Inserting persistent model
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at  java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at com.esotericsoftware.kryo.io.Output.flush(Output.java:155)
at com.twitter.chill.Tuple2Serializer.write(TupleSerializers.scala:36)
at com.twitter.chill.Tuple2Serializer.write(TupleSerializers.scala:33)
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
at  com.twitter.chill.TraversableSerializer$$anonfun$write$1.apply(Traversable.scala:29)

这是因为内存不足吗?我已经使用大于 40mb 的文本分类数据运行了相同模板的先前版本,没有问题。评估是培训的必要条件吗?另外,您能否解释一下评估是如何进行的?

4

1 回答 1

2

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

同样,empty.maxBy当您的数据没有通过DataSource. 我的第一个猜测是,如果您使用的appName不是MyTextApp,请确保您还在脚本中的EngineParamsListObject 中反映了该更改。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

将 --driver-memory 设置为 1G 或 2G 就足够了。

至于如何进行评估,PredictionIO 默认执行 k 折交叉验证。为此,您的数据被分成大致 k 大小的部分。假设 k 为 3 以进行说明。然后在 2/3 的数据上训练一个模型,另外 1/3 的数据作为测试集来估计预测性能。对每 1/3 的数据重复此过程,然后将获得的 3 个性能估计的平均值用作预测性能的最终估计(在一般情况下,您必须自己决定什么是衡量这一点的合适指标) . 对您指定用于测试的每个参数设置和模型重复此过程。

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


编辑:至于文本矢量化,每个文档都按以下方式矢量化:

说我的文件是:

“我是马可。”

第一步是对其进行标记,这将导致以下 Array/List 输出:

[“我”、“我”、“马可”]

然后,您进行二元提取,其中存储以下一组标记数组/列表:

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

这些中的每一个都用作构建二元组和字数向量的特征,然后应用tf-idf转换。请注意,要构建一个向量,我们必须从每个文档中提取二元组,这样这些特征向量就会变得非常大。您可以通过在准备阶段增加/减少 inverseIdfMin/inverseIdfMax 值来消除很多这种情况。

于 2015-06-11T16:15:13.653 回答