【问题标题】:How can we predict using RandomForestClassifier obtained from pyspark.ml我们如何使用从 pyspark.ml 获得的 RandomForestClassifier 进行预测
【发布时间】:2017-08-23 19:22:01
【问题描述】:

我正在做一个文本分类,我已经使用管道方法建立了一个模型。我已经创建了 RF 分类器对象并设置了我在之前的步骤中获得的特征列和标签列(步骤未显示)。

我正在拟合我使用数据框创建的训练数据,其中包含“标签”和“句子”列。标签是不同的问题类型。 DF 看起来像,

training = sqlContext.createDataFrame([
("DESC:manner", "How did serfdom develop in and then leave Russia ?"),
("DESC:def", "What does '' extended definition '' mean and how would one a paper on it ? "),
("HUM:ind", " Who was The Pride of the Yankees ?")
], ["label", "sentence"])

管道的代码是,

rf = RandomForestClassifier().setFeaturesCol("features").setLabelCol("idxlabel") 
pipeline = Pipeline(stages=[pos, tokenizer, hashingTF, idf, indexer,rf])
model = pipeline.fit(training)

所以现在我可以使用以下代码得到预测,

prediction = model.transform(test)
selected = prediction.select("sentence","prediction")

我可以执行 select() 操作来获取预测的标签。

但对于我的用例,有一个来自 Kinesis 的数据流,它只是句子(纯字符串)。对于每个句子,我必须预测标签。但是现在我在执行 dir(model) 时没有找到任何 predict() 函数。为什么从 pyspark.ml 获得的 RandomForestClassifier 没有 predict() 方法?如果没有,我怎样才能成功地执行我的用例?我需要 predict() 方法来满足要求。如果不是 RF,我应该使用什么 ML 算法?我做错什么了吗?任何人都可以提出一些建议吗?任何帮助表示赞赏。我的环境是 Spark 1.6 和 Python 2.7。

【问题讨论】:

    标签: python machine-learning pyspark random-forest prediction


    【解决方案1】:

    所以我发现没有可以使用的 predict() 方法。因此,我们需要使用 transform() 方法进行预测。只需删除标签列并创建一个新的数据框。例如,就我而言,我做到了,

    pred = sqlContext.createDataFrame([("What are liver enzymes ?" ,)], ["sentence"])
    
    prediction = model.transform(pred)
    

    然后我们可以使用 select() 方法找到预测。至少现在,这个解决方案对我来说很成功。请让我知道是否有任何更正或比这更好的方法。

    【讨论】:

      【解决方案2】:

      我也在做同样的问题。你能告诉我管道阶段的“pos”(词性)是什么以及你是如何得到它的。还有你是如何准备测试数据的。下面是我的代码 -

      tokenizer = Tokenizer(inputCol="sentence", outputCol="words")
      wordsData = tokenizer.transform(training)
      hashingTF = HashingTF(inputCol="words", outputCol="rawFeatures", numFeatures=20)
      featurizedData = hashingTF.transform(wordsData)
      idf = IDF(inputCol="rawFeatures", outputCol="features")
      indexer = StringIndexer(inputCol="label", outputCol="idxlabel")
      
      rf = RandomForestClassifier().setFeaturesCol("features").setLabelCol("idxlabel") 
      pipeline = Pipeline(stages=[tokenizer, hashingTF, idf, indexer, rf])
      model = pipeline.fit(training)
      

      如果我做错了什么,请告诉我。

      【讨论】:

      • 我试过这样 - test = sqlContext.createDataFrame([ ("HUM:ind", " Who was The Pride of the Yankees ?") ], ["label", "sentence"]) prediction = model.transform(test) selected = prediction.select("sentence","prediction") selected.show() 并获得以下价值 - +--------------------+----------+ | sentence|prediction| +--------------------+----------+ | Who was The Prid...| 1.0| +--------------------+----------+
      猜你喜欢
      • 2018-11-01
      • 2019-05-09
      • 2020-11-17
      • 1970-01-01
      • 2022-09-27
      • 2011-12-06
      • 1970-01-01
      • 2021-08-20
      • 2019-06-28
      相关资源
      最近更新 更多