【问题标题】:python spark: narrowing down most relevant features using PCApython spark:使用 PCA 缩小最相关的功能
【发布时间】:2018-07-09 15:16:24
【问题描述】:

我在 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 排名等?

【问题讨论】:

    标签: apache-spark machine-learning pyspark pca feature-selection


    【解决方案1】:

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

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

    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】:

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

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

      通常会有两个类,[“二进制学”和[“数字”]

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        • 2014-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多