我有一个有趣的问题。
我正在使用 Pipeline 对象来运行 ML 任务。
这就是我的管道对象的样子。
jpsa_mlp.pipeline.getStages()
Out[244]:
[StringIndexer_479d82259c10308d0587,
Tokenizer_4c5ca5ea35544bb835cb,
StopWordsRemover_4641b68e77f00c8fbb91,
CountVectorizer_468c96c6c714b1000eef,
IDF_465eb809477c6c986ef9,
MultilayerPerceptronClassifier_4a67befe93b015d5bd07]
此管道对象中的所有估算器和转换器都已编码为类方法的一部分,JPSA 是类对象。
现在我想放一个超参数调整的方法。所以我在下面使用:
self.paramGrid = ParamGridBuilder()\
.addGrid(self.pipeline.getStages()[5].layers, [len(self.pipeline.getStages()[3].vocab),10,3])\
.addGrid(self.pipeline.getStages()[5].maxIter, [100,300])\
.build()
问题是神经网络分类器的超参数之一基本上是隐藏层大小。 MLP 分类器的 layers 属性需要输入层、隐藏层和输出层的大小。输入和输出是固定的(基于我们拥有的数据)。所以我想把输入层的大小作为我的特征向量的大小。但是我不知道我的特征向量的大小,因为管道对象中用于创建特征向量的估计器(Count Vectorizer,IDF)尚未适合数据。
pipeline 对象将在交叉验证时使用 Spark 的交叉验证器对象来拟合数据。那么只有我才能让 CountVectorizerModel 知道特征向量的大小。
如果我实现了 Countvectorizer,那么我可以使用 countvectorizerModel.vocab 来获取特征向量的长度,并将其用作 mlp layers 属性中输入层值的参数。
那么我该如何为 mlp 的层添加超参数(隐藏层和输入层大小)?
请您参考如下方法:
您可以从数据框架构元数据中找到该信息。
Scala 代码:
val length = datasetAfterPipe.schema(datasetAfterPipe.schema.fieldIndex("columnName"))
.metadata.getMetadata("ml_attr").getLong("num_attrs")
