我正在修改PySpark文档中的一些交叉验证代码,并试图让PySpark告诉我选择了什么模型:
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import BinaryClassificationEvaluator
from pyspark.mllib.linalg import Vectors
from pyspark.ml.tuning import ParamGridBuilder, CrossValidator
dataset = sqlContext.createDataFrame(
[(Vectors.dense([0.0]), 0.0),
(Vectors.dense([0.4]), 1.0),
(Vectors.dense([0.5]), 0.0),
(Vectors.dense([0.6]), 1.0),
(Vectors.dense([1.0]), 1.0)] * 10,
["features", "label"])
lr = LogisticRegression()
grid = ParamGridBuilder().addGrid(lr.regParam, [0.1, 0.01, 0.001, 0.0001]).build()
evaluator = BinaryClassificationEvaluator()
cv = CrossValidator(estimator=lr, estimatorParamMaps=grid, evaluator=evaluator)
cvModel = cv.fit(dataset)
在PySpark shell中运行这个函数,我可以得到线性回归模型的系数,但是我似乎找不到交叉验证过程选择的lr.regParam
的值。
In [3]: cvModel.bestModel.coefficients
Out[3]: DenseVector([3.1573])
In [4]: cvModel.bestModel.explainParams()
Out[4]: ''
In [5]: cvModel.bestModel.extractParamMap()
Out[5]: {}
In [15]: cvModel.params
Out[15]: []
In [36]: cvModel.bestModel.params
Out[36]: []
8条答案
按热度按时间jchrr9hc1#
我也遇到了这个问题。我发现你需要调用java属性,因为一些原因,我不知道为什么。所以只要这样做:
打印所需参数:
这也适用于其他方法,如
extractParamMap()
。他们应该很快就会修复这个问题。dsekswqp2#
这可能不如wernerchao的回答好(因为在变量中存储超参数并不方便),但你可以通过以下方式快速查看交叉验证模型的最佳超参数:
bfrts1fy3#
假设cvModel3Day是您的模型名称,可以在SparkScala中提取参数,如下所示
cyvaqqii4#
我的头也撞到了墙上,不幸的是,你只能得到特定模型的特定参数。幸运的是,对于逻辑回归,你可以访问截距和权重,不幸的是,你不能检索regParam。这可以通过以下方式完成:
正如我之前所写的,每个模型都有很少的参数可以提取。总体而言,从管道中获取相关模型(例如,当交叉验证器在管道上运行时,cv.bestModel)可以通过以下方式完成:
每个模型通过简单的列表索引获得
现在可以应用上述方法。
fdx2calv5#
其实有两个问题:
bestModel
所使用的 meta参数是什么。不幸的是,拟合估计器(模型)的python API不允许(容易地)直接访问估计器的参数,这使得很难回答后一个问题。
但是,有一个使用API的变通方法。
然后,可以使用java对象上的泛型方法来获取参数值,而无需显式引用
getRegParam()
之类的方法:这将执行以下步骤:
1.从最佳模型的最后阶段获得由估计器创建的拟合logit模型:
crossval.fit(..).bestModel.stages[-1]
1.从
_java_obj
获取内部java对象1.从
paramGrid
(一个字典列表)中获取所有配置的名称。只使用第一行,假设它是一个实际的网格,如,每行包含相同的键。否则,您需要收集任何行中使用过的所有名称。1.从java对象中获取相应的
Param<T>
参数标识符。1.将
Param<T>
示例传递给getOrDefault()
函数以获取实际值0ejtzxu16#
花了几分钟才破译出来,但我猜出来了。
l2osamch7#
(2020年5月21日)
我知道这是一个老问题,但我找到了一个方法来做到这一点。
@Pierre Gourseaud给了我们一个很好的方法来获取最佳模型的超参数
但这不是以一种时尚的方式看,所以可以这样做:
在我的案例中,我训练了一个ALS模型,但它应该适用于您的案例,因为我也训练了交叉验证!
ruyhziif8#
如果只需要参数名及其值
如果你不介意描述等使用
输出将
和