在Java中使用Apache Spark(版本1.5.2)进行逻辑回归有几种选择:
spark.ml:
1) LogisticRegression lr = new LogisticRegression();
a) lr.train(dataFrame);
b) lr.fit(dataFrame);
spark.mllib:
2) LogisticRegressionWithSGD lr = new LogisticRegressionWithSGD();
a) lr.train(rdd);
b) lr.run(rdd);
3) LogisticRegressionWithLBFGS lr = new LogisticRegressionWithLBFGS();
a) lr.train(rdd);
b) lr.run(rdd);
我想知道a)和b)之间有什么区别,除了 run()函数的 GeneralizedLinearAlgorithm 输出,而不是 LogisticRegressionModel 从另一个?我无法在Java或Scala文档中找到任何提示。在此先感谢您的帮助。
答案 0 :(得分:7)
Spark确实包含两个可用于机器学习的库:ML和MLLib。你能指定一下你正在使用哪个版本的Spark吗?
MLLib。这是Spark的第一个机器学习库。它实际上有一个非常浅的结构,并使用RDD
来运行。这在MLLib中是一种无政府状态,所以你必须查看代码才能知道使用哪一个。我不确定您使用的是哪种语言或版本,但对于Scala上的Spark 1.6.0,还有一个单例:
object LogisticRegressionWithSGD {
def train(input: RDD[LabeledPoint], ...) = new LogisticRegressionWithSGD(...).run(input,...)
}
这意味着要在对象LogisticRegressionWithSGD
上将列车称为静态方法,但如果您有LogisticRegressionWithSGD
的实例,那么只有run
方法:
LogisticRegressionWithSGD.train(rdd, parameters)
// OR
val lr = new LogisticRegressionWithSGD()
lr.run(rdd)
无论如何,如果你有另一个版本,你绝对可以使用超级版本,即run
。
ML。它是基于DataFrame
使用的最新库,基本上是RDD[Row]
({{1}只是一个带有模式的无类型对象序列(即包含有关列名称,类型,元数据......的信息的对象)。我绝对建议你使用它,因为它可以实现优化!在这种情况下,您应该使用Row
方法,这是所有估算工具需要实现的方法。
说明: ML库使用fit
的概念(与sci-kit学习中的相同)。管道实例基本上是一个阶段数组(类型为Pipeline
),每个阶段都是PipelineStage
或Estimator
(还有一些其他类型,例如{{1}但是我不会在这里进入他们,因为他们很少见。 Transformer
只是一种转换数据的算法,因此其主要方法为Evaluator
,并输出另一个Transformer
。 transform(DataFrame)
是一种生成DataFrame
(Estimator
的子类型)的算法。它基本上是任何需要适合数据的块,因此它具有输出Model
的函数Transformer
。例如,如果你想将所有数据乘以$ 2 $,你只需要一个变换器来实现一个转换方法,它接受你的输入并乘以$ 2 $。如果您需要计算平均值并将其减去,则需要一个适合数据的估算器来计算平均值,并输出一个变换器,即减去所学习的平均值。因此,只要您使用ML,请使用fit(DataFrame)
和Transformer
方法。它允许您执行以下操作:
fit
现在,如果您真的想知道transform
存在的原因,那么val trainingSet = // training DataFrame
val testSet = // test DataFrame
val lr = new LogisticRegession().setInputCol(...).setOutputCol(...) // + setParams()
val stage = // another stage, i.e. something that implements PipelineStage
val stages = Array(lr, stage)
val pipeline: Pipeline = new Pipeline().setStages(stages)
val model: PipelineModel = pipeline.fit(trainingSet)
val result: DataFrame = model.transform(testSet)
继承的功能本身就会扩展train
。确实有一些可能的Predictor
- 你可以计算平均值,IDF,......当你实现一个预测器,比如逻辑回归时,你有一个扩展{{1}的抽象类Estimator
。并允许你一些快捷方式(例如它有一个标签列,功能列和预测列)。特别是这段代码已经覆盖Estimators
以相应地更改数据框架构的标签/功能/预测,您只需要实现自己的列车:
Predictor
如您所见,Estimator
方法应受保护/私有,以免外部用户使用。