我正在进行文本分类,并使用pipeline方法构建了一个模型。我已经创建了RF分类器对象,并设置了我在前几步中获得的特征列和标签列(步骤未显示)。
我正在拟合我使用数据框创建的训练数据,该数据框包含“labels”和“sentences”列。标签是不同的问题类型。数据框看起来像这样,
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"])
pipeline的代码是,
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,我应该使用什么机器学习算法?我做错了什么吗?谁能给我一些建议?任何帮助都将不胜感激。我的环境是Spark 1.6和Python 2.7。
回答:
所以我发现没有可用的predict()方法。因此,我们需要使用transform()方法来进行预测。只要移除标签列并创建一个新的数据框。例如,在我的情况下,我做了,
pred = sqlContext.createDataFrame([("What are liver enzymes ?" ,)], ["sentence"])prediction = model.transform(pred)
然后我们可以使用select()方法找到预测。至少目前为止,这个解决方案对我来说是成功的。如果有任何更正或更好的方法,请告诉我。