如何在预处理后获取使用pyspark.ml神经网络分类器的功能数量?

时间:2018-01-29 15:45:24

标签: neural-network pyspark one-hot-encoding

我正在尝试使用pyspark.ml构建一个神经网络。 问题是我使用onehotencoder和其他预处理方法来转换分类变量。我的管道中的各个阶段是:

  1. 索引分类功能
  2. 使用Onehotencoder
  3. 使用Vector汇编程序
  4. 然后我申请PCA
  5. 给出" pcaFeatures"到神经网络分类器
  6. 但问题是,在步骤4之后,我不知道功能的数量,以便将其提供给" layer"步骤5中的分类器。 我的问题是如何获得最终的功能数量?这是我的代码,我没有包含导入和数据加载部分。

    stages = []
    for c in Categories:
        stringIndexer = StringIndexer(inputCol= c , outputCol=c + "_indexed")
        encoder = OneHotEncoder(inputCol= c + "_indexed", outputCol=c + "_categoryVec")
        stages += [stringIndexer, encoder]
    
    labelIndexer = StringIndexer(inputCol="Target", outputCol="indexedLabel")
    
    final_features = list(map(lambda c: c+"_categoryVec", Categories))+Continuous
    
    
    assembler = VectorAssembler(
        inputCols= final_features,
        outputCol="features")
    
    pca = PCA(k=20, inputCol="features", outputCol="pcaFeatures")
    (train_val, test_val) = train.randomSplit([0.95, 0.05])
    
    num_classes= train.select("Target").distinct().count()
    
    NN= MultilayerPerceptronClassifier(labelCol="indexedLabel", featuresCol='pcaFeatures', maxIter=100,
                                        layers=[????, 5, 5, num_classes], blockSize=10, seed=1234)
    
    
    stages += [labelIndexer]
    stages += [assembler]
    stages += [pca]
    stages += [NN]
    
    pipeline = Pipeline(stages=stages)
    model = pipeline.fit(train_val)
    

1 个答案:

答案 0 :(得分:2)

docs开始,输入参数k是主要组件的数量。

所以在你的情况下:

pca = PCA(k=20, inputCol="features", outputCol="pcaFeatures")

功能的数量是20。

<强>更新

另一种方法是查看其中一个组合矢量的长度。

例如,如果您想要在步骤3之后的长度:

from pyspark.sql.functions import udf, col
nfeatures = assembler.withColumn('len', udf(len, IntegerType())(col('features'))\
    .select('len').take(1)

我觉得应该有更好的方法来做到这一点,即无需致电take()