我已经下载了文本分类模板的最新更新。我创建了一个新应用,并通过指定应用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,没有问题。评估是否必须进行培训?还可以请您解释一下评估是如何进行的吗?
因此,我只能够运行评估而没有前一个问题,而后一个问题与内存使用情况有关。
同样,empty.maxBy
如果未通过读取数据,则会发生错误DataSource
。我的第一个猜测是,如果您使用以外的appName
其他语言MyTextApp
,请确保您还在脚本中的EngineParamsList
Object中反映了这一更改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个性能估算值的平均值用作预测性能的最终估算值(在一般情况下,您必须自己决定什么才是合适的度量标准) 。对于您指定用于测试的每个参数设置和模型,都会重复此过程。
评估不是培训和部署的必要步骤,但是,它是一种选择用于培训和部署的参数/算法的方法。在机器学习/统计中称为模型选择。
编辑:至于文本向量化,每个文档都通过以下方式向量化:
说我的文件是:
“我是Marco。”
第一步是对此进行标记化,这将导致以下Array / List输出:
[“ I”,“ am”,“ Marco”]
然后,您执行一个双链提取程序,该程序存储以下令牌集/列表的集合:
[“ I”,“ am”],[“ am”,“ Marco”],[“ I”],[“ am”],[“ Marco”]
其中的每一个都用作构建bigram和字数向量的功能,然后应用tf-idf转换。请注意,要构建矢量,我们必须从每个文档中提取双字母组,这样这些特征矢量可能会变得很大。您可以通过在Preparator阶段增加/减小inverseIdfMin / inverseIdfMax值来减少大量此类操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句