我正在尝试使用pyspark.ml构建一个神经网络。 问题是我使用onehotencoder和其他预处理方法来转换分类变量。我的管道中的各个阶段是:
但问题是,在步骤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)
答案 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()
。