Skip to main content
 首页 » 编程设计

python之如何在Spark Pipeline中获取特征向量列长度

2024年10月01日29bhlsheji

我有一个有趣的问题。

我正在使用 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")