如何获取PySpark.ml预处理后的特征数以配置神经网络分类器
解决PCA后特征数获取与神经网络layers配置问题
嘿,这个问题其实很好解决,我给你两种实用的思路,帮你搞定MultilayerPerceptronClassifier的layers参数配置:
方法一:直接用你指定的PCA k值(最简单)
你在代码里已经明确设置了PCA(k=20, ...),这里的k就是PCA后保留的特征数量。所以你完全可以直接把layers的第一个参数写成20,也就是:
NN= MultilayerPerceptronClassifier(labelCol="indexedLabel", featuresCol='pcaFeatures', maxIter=100, layers=[20, 5, 5, num_classes], blockSize=10, seed=1234)
这种方法最直接,因为你已经手动指定了要保留20个主成分,不需要额外计算。
方法二:动态获取(适合k值不固定的场景)
如果以后你可能会调整PCA的k值,或者想通过数据自动确定主成分数量(比如基于解释方差占比),可以先单独运行预处理流程,拿到PCA模型后提取特征维度:
- 先构建不含神经网络的预处理Pipeline:
# 复制原stages但去掉最后加的NN preprocessing_stages = stages.copy() preprocessing_stages.pop() # 移除最后一个元素NN pre_pipeline = Pipeline(stages=preprocessing_stages) pre_model = pre_pipeline.fit(train_val)
- 从预处理模型中提取PCA组件,获取特征数:
# 因为preprocessing_stages最后一个是PCA,所以取最后一个stage pca_model = pre_model.stages[-1] pca_feature_count = pca_model.getK() # 直接获取设置的k值 # 或者也可以通过查看预处理后数据的特征维度来验证 preprocessed_data = pre_model.transform(train_val) pca_feature_count = preprocessed_data.select("pcaFeatures").first()[0].size
- 用动态获取的数值配置神经网络:
NN= MultilayerPerceptronClassifier(labelCol="indexedLabel", featuresCol='pcaFeatures', maxIter=100, layers=[pca_feature_count, 5, 5, num_classes], blockSize=10, seed=1234)
这样不管你怎么调整PCA的参数,layers的第一个值都会自动匹配,不用手动修改。
内容的提问来源于stack exchange,提问作者Alaleh Rz
相关产品推荐
相关产品推荐

