我们如何使用从pyspark.ml获得的RandomForestClassifier进行预测

时间:2017-03-30 03:45:48

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

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

我正在使用我使用数据框创建的训练数据,它有列"标签"和"句子"。标签是不同的问题类型。 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(模型)时,我现在找不到任何predict()函数。为什么没有从pyspark.ml获得的RandomForestClassifier的predict()方法?如果没有,我如何成功执行我的用例?我需要predict()方法来满足要求。如果不是RF,我应该使用什么ML算法?我做错了吗?任何人都可以建议吗?任何帮助表示赞赏。我的环境是Spark 1.6和Python 2.7。

2 个答案:

答案 0 :(得分:0)

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

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

prediction = model.transform(pred)

然后我们可以使用select()方法找到预测。至少现在,这个解决方案成功地为我工作。如果有任何更正或更好的方法,请告诉我。

答案 1 :(得分:0)

我也在做同样的问题。你能告诉我在管道阶段是什么" 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)

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