火花2.0.0+
乍一看全部Transformers
and Estimators
实施MLWritable具有以下界面:
def write: MLWriter
def save(path: String): Unit
and MLReadable具有以下界面
def read: MLReader[T]
def load(path: String): T
这意味着您可以使用save
将模型写入磁盘的方法,例如
import org.apache.spark.ml.PipelineModel
val model: PipelineModel
model.save("/path/to/model")
稍后阅读:
val reloadedModel: PipelineModel = PipelineModel.load("/path/to/model")
PySpark 中也实现了等效方法MLWritable / JavaMLWritable and MLReadable / JavaMLReadable分别:
from pyspark.ml import Pipeline, PipelineModel
model = Pipeline(...).fit(df)
model.save("/path/to/model")
reloaded_model = PipelineModel.load("/path/to/model")
SparkR提供write.ml / read.ml函数,但截至今天,这些与其他支持的语言不兼容 -SPARK-15572.
请注意,加载器类必须与存储的类相匹配PipelineStage。例如,如果您保存了LogisticRegressionModel
你应该使用LogisticRegressionModel.load
not LogisticRegression.load
.
如果您使用 Spark
除了 Spark 特定方法之外,还有越来越多的库设计用于使用 Spark 独立方法保存和加载 Spark ML 模型。参见示例如何服务 Spark MLlib 模型?.
火花 >= 1.6
从 Spark 1.6 开始,可以使用以下命令保存模型save
方法。因为几乎每一个model
实施ML可写界面。例如,线性回归模型拥有它,因此可以使用它将模型保存到所需的路径。
火花
我相信你在这里做出了错误的假设。
一些操作DataFrames
可以进行优化,与普通的相比,它可以提高性能RDDs
. DataFrames
提供高效的缓存,并且 SQLish API 可以说比 RDD API 更容易理解。
ML 管道非常有用,像交叉验证器或不同评估器这样的工具是任何机器管道中都必须具备的,即使上述这些都不是特别难在低级 MLlib API 之上实现,但最好准备好使用、通用且经过相对良好测试的解决方案。
到目前为止一切顺利,但存在一些问题:
- 据我所知,简单的操作
DataFrames
like select
or withColumn
显示与其 RDD 等效项相似的性能,例如map
,
- 在某些情况下,与精心调整的低级转换相比,增加典型管道中的列数实际上会降低性能。您当然可以添加 drop-column-transformers 来纠正这个问题,
- 许多机器学习算法,包括
ml.classification.NaiveBayes
只是简单的包装围绕其mllib
API,
- PySpark ML/MLlib 算法将实际处理委托给其 Scala 对应项,
- 最后但并非最不重要的一点是,即使很好地隐藏在 DataFrame API 后面,RDD 仍然存在
我相信最终通过 MLLib 使用 ML 会得到相当优雅的高级 API。您可以做的一件事是将两者结合起来创建自定义的多步骤管道:
- 使用机器学习来加载、清理和转换数据,
- 提取所需数据(参见示例提取标记点方法)并传递给
MLLib
算法,
- 添加自定义交叉验证/评估
- save
MLLib
使用您选择的方法(Spark 模型或PMML)
这不是一个最佳解决方案,但在给定当前 API 的情况下,这是我能想到的最佳解决方案。