代码之家  ›  专栏  ›  技术社区  ›  Sameer Mahajan

python spark:使用PCA缩小最相关的特性

  •  6
  • Sameer Mahajan  · 技术社区  · 7 年前

    我正在python中使用spark 2.2。我正在使用ml.feature模块中的PCA。我正在使用VectorAssembler将我的特征提供给PCA。为了澄清,假设我有一个包含三列col1、col2和col3的表,那么我正在做:

    from pyspark.ml.feature import VectorAssembler
    assembler = VectorAssembler(inputCols=table.columns, outputCol="features")
    df = assembler.transform(table).select("features")
    from pyspark.ml.feature import PCA
    pca = PCA(k=2, inputCol="features", outputCol="pcaFeatures")
    model = pca.fit(df)
    

    此时,我已使用2个组件运行PCA,我可以将其值视为:

    m = model.pc.values.reshape(3, 2)
    

    它对应于3(=原始表中的列数)行和2(=PCA中的组件数)列。我的问题是,这里的三行是否与我向上面的向量汇编程序指定输入列的顺序相同?为了进一步澄清,上述矩阵是否对应于:

              | PC1 | PC2 |
     ---------|-----|-----|
        col1  |     |     |
     ---------|-----|-----|
        col2  |     |     |
     ---------|-----|-----|
        col3  |     |     |
     ---------+-----+-----+
    

    请注意,这里的示例只是为了清楚起见。在我真正的问题中,我要处理大约1600列和一堆选择。我在spark文档中找不到对此的任何明确答案。我想这样做是为了从我的原始表中选择最好的列/特征,以基于顶部主成分来训练我的模型。或者在spark ML PCA中是否有其他/更好的方法可以推断出这样的结果?

    或者我不能用PCA来做这件事,而必须使用其他技术,如spearman排名等。?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Alper t. Turker    7 年前

    是(…)此处的行的顺序与我指定输入列的顺序相同

    是的,他们是。让我们追踪一下发生了什么:

    from pyspark.ml.feature import PCA, VectorAssembler
    
    data = [
        (0.0, 1.0, 0.0, 7.0, 0.0), (2.0, 0.0, 3.0, 4.0, 5.0), 
        (4.0, 0.0, 0.0, 6.0, 7.0)
    ]
    
    df = spark.createDataFrame(data, ["u", "v", "x", "y", "z"])
    

    VectorAseembler 按列顺序排列:

    assembler = VectorAssembler(inputCols=df.columns, outputCol="features")
    vectors = assembler.transform(df).select("features")
    
    vectors.schema[0].metadata
    # {'ml_attr': {'attrs': {'numeric': [{'idx': 0, 'name': 'u'},
    #     {'idx': 1, 'name': 'v'},
    #     {'idx': 2, 'name': 'x'},
    #     {'idx': 3, 'name': 'y'},
    #     {'idx': 4, 'name': 'z'}]},
    #   'num_attrs': 5}}
    

    主成分也是如此

    model = PCA(inputCol="features", outputCol="pc_features", k=3).fit(vectors)
    
    ?model.pc
    # Type:        property
    # String form: <property object at 0x7feb5bdc1d68>
    # Docstring:  
    # Returns a principal components Matrix.
    # Each column is one principal component.
    # 
    # .. versionadded:: 2.0.0
    

    最后,健全性检查:

    import numpy as np
    
    x = np.array(data)
    y = model.pc.values.reshape(3, 5).transpose()
    z = np.array(model.transform(vectors).rdd.map(lambda x: x.pc_features).collect())
    
    np.linalg.norm(x.dot(y) - z)
    # 8.881784197001252e-16
    
        2
  •  -1
  •   pratiklodha    7 年前

    您可以在此处查看列的实际顺序

    df.schema["features"].metadata["ml_attr"]["attrs"]
    

    通常有两个类,[“binary”&[“numeric”]

    pd.DataFrame(df.schema["features"].metadata["ml_attr"]["attrs"]["binary"]+df.schema["features"].metadata["ml_attr"]["attrs"]["numeric"]).sort_values("idx")
    

    应该给出所有列的确切顺序。 您可以验证输入的顺序;输出保持不变。