val numBuckets = new IntParam(this, "numBuckets", "Number of buckets (quantiles, or categories) into which data points are grouped. Must be >= 2.", ParamValidators.gtEq(2))
setDefault(numBuckets -> 2)
/**
* Copies param values from this instance to another instance for params shared by them.
*
* This handles default Params and explicitly set Params separately.
* Default Params are copied from and to `defaultParamMap`, and explicitly set Params are
* copied from and to `paramMap`.
* Warning: This implicitly assumes that this [[Params]] instance and the target instance
* share the same set of default Params.
*
* @param to the target instance, which should work with the same set of default Params as this
* source instance
* @param extra extra params to be copied to the target's `paramMap`
* @return the target instance with param values copied
*/
protected def copyValues[T <: Params](to: T, extra: ParamMap = ParamMap.empty): T = {
// 将原来的参数paramMap和新加的参数集合连接起来
val map = paramMap ++ extra
params.foreach { param =>
// copy default Params
if (defaultParamMap.contains(param) && to.hasParam(param.name)) {
to.defaultParamMap.put(to.getParam(param.name), defaultParamMap(param))
}
// copy explicitly set Params
if (map.contains(param) && to.hasParam(param.name)) {
to.set(param.name, map(param))
}
}
to
}
我们看一个而例子就知道了
package org.apache.spark.ml.feature
import org.apache.spark.ml.param.{IntParam, ParamMap, ParamValidators, Params}
import org.apache.spark.ml.util.Identifiable
/**
* Created by d00454735 on 2018/9/8.
*/
object ParamTest {
def main(args: Array[String]): Unit = {
val test = new ParamTest()
test.setA(4)
println(test.a)
println(test.explainParams())
val test2 = new ParamTest2()
println("------------------------before copy------------------------")
println(test2.explainParams())
println("------------------------after copy------------------------")
test.copyValues(test2)
println(test2.explainParams())
}
}
class ParamTest(override val uid: String) extends Params {
val a = new IntParam(this, "a", "param test int param, must >2", ParamValidators.gtEq(2))
setDefault(a -> 2)
def setA(value: Int): this.type = set(a, value)
def getA: Int = getOrDefault(a)
override def copy(extra: ParamMap): ParamTest = defaultCopy(extra)
def this() = this(Identifiable.randomUID("paramTest"))
}
class ParamTest2(override val uid: String) extends Params {
val b = new IntParam(this, "b", "another param")
setDefault(b -> 0)
val a = new IntParam(this, "a", "anther")
setDefault(a -> 0)
def this() = this(Identifiable.randomUID("paramTest2"))
override def copy(extra: ParamMap): Params = defaultCopy(extra)
}
其输出结果如下,可以看到test2已经成功将test中的值copy到了自己:
paramTest_aad4637f7033__a
a: param test int param, must >2 (default: 2, current: 4)
------------------------before copy------------------------
a: anther (default: 0)
b: another param (default: 0)
------------------------after copy------------------------
a: anther (default: 2, current: 4)
b: another param (default: 0)