Я пытаюсь понять следующую проблему, возникшую при обучении случайного леса в pyspark. Стандартом мы определяем конвейер, оценщик, сетку и т. Д. c
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder
rfClassifier = RandomForestClassifier(labelCol='Target')
cv_pipeline = Pipeline(stages=[rfClassifier])
evaluator = MulticlassClassificationEvaluator(labelCol='Target')
paramGrid = ParamGridBuilder().addGrid(RandomForestClassifier.numTrees, [100, 120]).\
addGrid(RandomForestClassifier.maxDepth, [7, 10] ).addGrid(RandomForestClassifier.subsamplingRate, [0.8,0.9]).\
addGrid(RandomForestClassifier.featureSubsetStrategy, ['auto','log2', 'onethird']).build()
Выполните перекрестную проверку
train.cache()
crossval = CrossValidator(estimator = cv_pipeline, estimatorParamMaps=paramGrid, evaluator=evaluator, numFolds=3)
cvModel=crossval.fit(train)
и посмотрите на лучшую модель
model = cvModel.bestModel
java_model = model.stages[-1]._java_obj
{param.name: java_model.getOrDefault(java_model.getParam(param.name))
for param in paramGrid[0]}
Неожиданно я получаю следующий результат
{'featureSubsetStrategy': 'auto',
'maxDepth': 5,
'numTrees': 20,
'subsamplingRate': 1.0}
Может кто-нибудь объяснить мне, почему оптимальные параметры не были выбраны из сетки? большое спасибо