【发布时间】:2017-08-16 12:26:28
【问题描述】:
我有一个有趣的问题。
我正在使用 Pipeline 对象来运行 ML 任务。
这就是我的 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 的图层属性中输入层值的参数。
那么,如何为 mlp 的层添加超参数(隐藏层和输入层大小)?
【问题讨论】:
标签: python apache-spark pyspark