【问题标题】:Fit a dataframe into randomForest pyspark将数据框放入 randomForest pyspark
【发布时间】:2017-11-03 15:58:58
【问题描述】:

我有一个DataFrame,看起来像这样:

+--------------------+------------------+
|            features|           labels |
+--------------------+------------------+
|[-0.38475, 0.568...]|          label1  |
|[0.645734, 0.699...]|          label2  |
|     .....          |          ...     |
+--------------------+------------------+

两列都是字符串类型 (StringType()),我想将其放入 spark ml randomForest 中。为此,我需要将特征列转换为包含浮点数的向量。有没有人知道怎么做?

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-ml


    【解决方案1】:

    如果您使用的是 Spark 2.x,我相信这就是您所需要的:

    from pyspark.sql.functions import udf
    from pyspark.mllib.linalg import Vectors
    from pyspark.ml.linalg import VectorUDT
    from pyspark.ml.feature import StringIndexer
    
    df = spark.createDataFrame([("[-0.38475, 0.568]", "label1"), ("[0.645734, 0.699]", "label2")], ("features", "label"))
    
    def parse(s):
      try:
        return Vectors.parse(s).asML()
      except:
        return None
    
    parse_ = udf(parse, VectorUDT())
    
    parsed = df.withColumn("features", parse_("features"))
    
    indexer = StringIndexer(inputCol="label", outputCol="label_indexed")
    
    indexer.fit(parsed).transform(parsed).show()
    ## +----------------+------+-------------+
    ## |        features| label|label_indexed|
    ## +----------------+------+-------------+
    ## |[-0.38475,0.568]|label1|          0.0|
    ## |[0.645734,0.699]|label2|          1.0|
    ## +----------------+------+-------------+
    

    使用 Spark 1.6,并没有太大的不同:

    from pyspark.sql.functions import udf
    from pyspark.ml.feature import StringIndexer
    from pyspark.mllib.linalg import Vectors, VectorUDT
    
    df = sqlContext.createDataFrame([("[-0.38475, 0.568]", "label1"), ("[0.645734, 0.699]", "label2")], ("features", "label"))
    
    parse_ = udf(Vectors.parse, VectorUDT())
    
    parsed = df.withColumn("features", parse_("features"))
    
    indexer = StringIndexer(inputCol="label", outputCol="label_indexed")
    
    indexer.fit(parsed).transform(parsed).show()
    ## +----------------+------+-------------+
    ## |        features| label|label_indexed|
    ## +----------------+------+-------------+
    ## |[-0.38475,0.568]|label1|          0.0|
    ## |[0.645734,0.699]|label2|          1.0|
    ## +----------------+------+-------------+
    

    Vectors 有一个parse 函数,可以帮助你实现你想要做的事情。

    【讨论】:

    • 谢谢你,但是当我这样做时出现以下错误:AttributeError: 'function' object has no attribute '_get_object_id'
    • 使用这个确切的代码,我得到了这个错误:TypeError: cannot serialize None of type 但似乎我们没有使用相同版本的 spark。实际上,我将:from pyspark.mllib.linalg import Vectors from pyspark.ml.linalg import VectorUDT 替换为:from pyspark.mllib.linalg import Vectors、VectorUDT 和 spark.createDataFrame 与 sqlContext.createDataFrame 因为我的版本不支持它们
    • 这意味着 parse(s) 函数在我的版本中只返回 Nones
    • 你用的是什么版本?您提到的第二个错误与第一个错误有什么关系?对于第一个,您可能正在使用保留字作为列名,例如 df.count
    • 我使用的是 spark 1.6.2,实际上第一个错误发生在我尝试将 parse(s) 函数应用于我自己的数据帧时,第二个错误在我运行您的确切代码时引发发布
    猜你喜欢
    • 2021-12-20
    • 2018-10-04
    • 1970-01-01
    • 2023-03-12
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    相关资源
    最近更新 更多