Apache spark 如何在没有DataFrames/SparkContext的情况下评估spark.ml模型?
使用Spark MLLib,我将构建一个模型(如Apache spark 如何在没有DataFrames/SparkContext的情况下评估spark.ml模型?,apache-spark,apache-spark-mllib,apache-spark-ml,Apache Spark,Apache Spark Mllib,Apache Spark Ml,使用Spark MLLib,我将构建一个模型(如RandomForest),然后通过加载模型并使用predict传递特征向量,可以在Spark之外对其进行评估 似乎在Spark ML中,predict现在被称为transform,只作用于数据帧 有没有办法在Spark之外构建数据帧,因为构建数据帧似乎需要SparkContext 我遗漏了什么吗?Re:有没有办法在Spark之外构建数据帧 这是不可能的。数据帧存在于SQLContext中,而它存在于SparkContext中。也许你可以设法解决这
RandomForest
),然后通过加载模型并使用predict
传递特征向量,可以在Spark之外对其进行评估
似乎在Spark ML中,predict
现在被称为transform
,只作用于数据帧
有没有办法在Spark之外构建数据帧
,因为构建数据帧似乎需要SparkContext
我遗漏了什么吗?Re:有没有办法在Spark之外构建数据帧
这是不可能的。数据帧存在于SQLContext中,而它存在于SparkContext中。也许你可以设法解决这个问题,但总的来说,数据帧和SparkContext之间的连接是经过设计的。以下是我在spark上下文之外使用spark模型的解决方案(使用PMML):
SparkConf SparkConf=new SparkConf()代码>
SparkSession session=SparkSession.builder().enablehavesupport().config(sparkConf.getOrCreate();
String tableName=“schema.table”;
Properties dbProperties=新属性();
setProperty(“用户”,vKey);
setProperty(“密码”,password);
setProperty(“AuthMech”,“3”);
setProperty(“源”、“jdbc”);
setProperty(“driver”,“com.cloudera.impala.jdbc41.driver”);
String tableName=“schema.table”;
String simplerl=“jdbc:impala://host:21050/schema"
Dataset data=session.read().jdbc(simplerl、tableName、dbProperties);
字符串[]inputCols={“column1”};
StringIndexer indexer=新的StringIndexer().setInputCol(“column1”).setOutputCol(“indexed_column1”);
StringIndexerModel alphabet=indexer.fit(数据);
数据=字母表。转换(数据);
VectorAssembler assembler=新的VectorAssembler().setInputCols(inputCols).setOutputCol(“功能”);
预测器p=新的GBTRegressor();
p、 设置(“maxIter”,20);
p、 设置(“最大深度”,2);
p、 设置(“maxBins”,204);
p、 setLabelCol(“faktor”);
PipelineStage[]stages={indexer,assembler,p};
管道=新管道();
管道安装阶段(阶段);
PipelineModel pmodel=pipeline.fit(数据);
PMML PMML=ConverterUtil.toPMML(data.schema(),pmodel);
FileOutputStream fos=新的FileOutputStream(“model.pmml”);
marshalpml(pmml,newstreamresult(fos));
使用PPML进行预测(本地,无spark上下文,可应用于参数映射,而非数据帧):
PMML-PMML=org.jpmml.model.PMMLUtil.unmarshal(新文件输入流(pmmlFile));
ModelEvaluatorFactory ModelEvaluatorFactory=ModelEvaluatorFactory.newInstance();
MiningModelEvaluator evaluator=(MiningModelEvaluator)modelEvaluatorFactory.newModelEvaluator(pmml);
inputFieldMap=新HashMap();
Map args=new HashMap();
字段curField=evaluator.getInputFields().get(0);
args.put(curField.getName(),“1.0”);
映射结果=evaluator.evaluate(args);
在这个问题上也花了很多天。这并不简单。我的第三个建议涉及我专门为此编写的代码
选项1
正如其他评论者所说,现在可以使用。但是,您需要知道如何构造向量。如果没有,请参见选项3
选项2
如果目标是避免设置Spark服务器(独立或群集模式),则可以在本地模式下启动Spark。整个过程将在单个JVM中运行
val spark = SparkSession.builder().config("spark.master", "local[*]").getOrCreate()
// create dataframe from file, or make it up from some data in memory
// use model.transform() to get predictions
但这会给预测模块带来不必要的依赖,并且在运行时会消耗JVM中的资源。此外,如果预测延迟非常关键,例如,在请求传入后的毫秒内进行预测,则此选项速度太慢
选项3
MLlib的输出可以用作学习者的输入。该类适用于一次热编码,也适用于固定特征维度的大小。即使所有功能都是数字,也可以使用它。如果您在培训中使用它,那么您在预测时所需要的只是散列逻辑。它作为一个火花变压器,所以在火花环境之外不容易重复使用。因此,我已经完成了将哈希函数提取到lib的工作。在培训期间,您可以正常地应用FeatureHasher和学习者。下面是如何在预测时使用精简的哈希器:
// Schema and hash size must stay consistent across training and prediction
val hasher = new FeatureHasherLite(mySchema, myHashSize)
// create sample data-point and hash it
val feature = Map("feature1" -> "value1", "feature2" -> 2.0, "feature3" -> 3, "feature4" -> false)
val featureVector = hasher.hash(feature)
// Make prediction
val prediction = model.predict(featureVector)
您可以在我的github中查看详细信息,网址为。如果你想复制我的代码,请看一下。这里还有示例代码和单元测试。如果您需要帮助,请随意创建问题。它仍然有predict
、predictprobability
和predictRaw
处理向量的方法,您不能使用它们吗?我在文档中没有看到这些方法:您在spark.ml中看到RandomForest的哪些方法?理论上,您可能可以编写一个从ml扩展RFClassictionaModel(使用scala包)的类,并使一些公共方法公开上述受保护的方法,但不确定这是否是最好的方法。您不能使用mllib
包中的实现吗?我不确定他们是否仍然支持它,但我的理解是spark ml取代了mllib,而mllib在某个时候将被弃用。我以前使用过mllib,但我正在尝试获取每个类的概率,并且该功能仅在最近才可用,并且仅在spark ml实现上可用。是的,不幸的是,您是正确的。。。你看过H2O吗?不确定他们是否有你正在寻找的概率(;-),但在那里你可以将你的模型导出为pojo,并在任何地方使用它们好吧,这不是我想要听到的答案。。。如果是这样的话,Spark似乎正在倒退。这是一个强大的工具来训练模型,但被迫使用它来评估是很烦人的。有没有一种方法可以将模型导出为无需DataFramesTh即可使用的格式
val spark = SparkSession.builder().config("spark.master", "local[*]").getOrCreate()
// create dataframe from file, or make it up from some data in memory
// use model.transform() to get predictions
// Schema and hash size must stay consistent across training and prediction
val hasher = new FeatureHasherLite(mySchema, myHashSize)
// create sample data-point and hash it
val feature = Map("feature1" -> "value1", "feature2" -> 2.0, "feature3" -> 3, "feature4" -> false)
val featureVector = hasher.hash(feature)
// Make prediction
val prediction = model.predict(featureVector)