将一个数据框适配到随机森林(pyspark)。

3

我有一个类似这样的DataFrame:

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

这两列都是字符串类型(StringType()),我想将其适配到Spark ML的随机森林中。 为此,我需要将特征列转换为包含浮点数的向量。 有人知道如何做吗?

1个回答

6

如果您正在使用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' - ABK
使用这段精确的代码,我得到了如下错误: TypeError: 无法序列化类型为<class 'NoneType'>的None对象。但是看起来我们使用的spark版本不同。 实际上,我将以下代码段替换掉了: from pyspark.mllib.linalg import Vectors from pyspark.ml.linalg import VectorUDT 替换为: from pyspark.mllib.linalg import Vectors, VectorUDT和spark.createDataFrame 替换为 sqlContext.createDataFrame因为它们在我的版本中不被支持。 - ABK
这意味着在我的版本中,parse(s)函数只返回Nones。 - ABK
你使用的是哪个版本?第二个你提到的错误与第一个错误有什么关系?对于第一个错误,你可能正在使用保留字作为列名,比如 df.count。 - eliasah
我正在使用Spark 1.6.2,实际上第一个错误发生在我尝试将parse(s)函数应用于自己的数据框时,第二个错误是在运行您发布的确切代码时引发的。 - ABK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接