PySpark PCA:避免NotConvergedException

时间:2017-11-16 23:02:39

标签: pyspark pca decomposition

我尝试使用PCA通过ml.linalg方法减少大数据集(51个功能,约1300个人),如下所示:

1)将我的列命名为一个列表:

features = indi_prep_df.select([c for c in indi_prep_df.columns if c not in{'indi_nbr','label'}]).columns

2)导入必要的库

from pyspark.ml.feature import PCA as PCAML
from pyspark.ml.linalg import Vector
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.linalg import DenseVector

3)将功能折叠到DenseVector

indi_feat = indi_prep_df.rdd.map(lambda x: (x[0], x[-1], DenseVector(x[1:-2]))).toDF(['indi_nbr','label','features'])

4)除了保留索引的功能外,其他所有内容都删除了:

dftest = indi_feat.drop('indi_nbr','label')

5)实例化PCA对象

dfPCA = PCAML(k=3, inputCol="features", outputCol="pcafeats")

6)并尝试拟合模型

PCAout = dfPCA.fit(dftest)

但我的模型无法收敛(下面的错误)。 我尝试过的事情: - 平均填充或零填充NA和Null值(视情况而定) - 减少功能的数量(到25,然后我切换到SKlearn&#PCA)

    Py4JJavaError: An error occurred while calling o2242.fit.
: breeze.linalg.NotConvergedException: 
    at breeze.linalg.svd$.breeze$linalg$svd$$doSVD_Double(svd.scala:110)
    at breeze.linalg.svd$Svd_DM_Impl$.apply(svd.scala:40)
    at breeze.linalg.svd$Svd_DM_Impl$.apply(svd.scala:39)
    at breeze.generic.UFunc$class.apply(UFunc.scala:48)
    at breeze.linalg.svd$.apply(svd.scala:23)
    at org.apache.spark.mllib.linalg.distributed.RowMatrix.computePrincipalComponentsAndExplainedVariance(RowMatrix.scala:389)
    at org.apache.spark.mllib.feature.PCA.fit(PCA.scala:48)
    at org.apache.spark.ml.feature.PCA.fit(PCA.scala:99)
    at org.apache.spark.ml.feature.PCA.fit(PCA.scala:70)

我的配置是针对50个执行者和6GB /执行者,所以我不认为这是因为没有足够的资源(我在这里看不到任何资源)。

我的输入因子是百分比,整数和2小数浮点数的混合,都是正数和所有序数。这会导致收敛困难吗?

一旦我将PySpark DF转换为Pandas DF,我很快就收到了SKLearn方法的收敛,并且很快就完成了。

0 个答案:

没有答案