我有一个有趣的问题。
我正在使用Pipeline对象来运行一个机器学习任务。
这是我的Pipeline对象的样子。
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)尚未适配数据。
通过使用Spark的交叉验证器对象,管道对象将在交叉验证期间拟合数据。然后,我才能够使用CountVectorizerModel来知道特征向量的大小。
如果我已经有了Countvectorizer,则可以使用countvectorizerModel.vocab来获取特征向量的长度,并将其作为mlp的layers属性中输入层值的参数。
那么,如何为mlp添加层的超参数(包括隐藏层和输入层大小)呢?