我正在搜索此错误,但我找不到与TrainValidationSplit
相关的任何内容。所以我想进行参数调整,并使用TrainValidationSplit
执行此操作会出现以下错误:org.apache.spark.SparkException: Unseen label
。
我理解为什么会发生这种情况并且增加trainRatio
可以缓解问题,但并不能完全解决问题。
就此而言,这是代码的一部分:
stages = []
for categoricalCol in categoricalCols:
stringIndexer = StringIndexer(inputCol=categoricalCol, outputCol=categoricalCol+"Index")
stages += [stringIndexer]
assemblerInputs = [x+"Index" for x in categoricalCols] + numericCols
assembler = VectorAssembler(inputCols=assemblerInputs, outputCol="features")
stages += [assembler]
labelIndexer = StringIndexer(inputCol='label', outputCol='indexedLabel')
stages += [labelIndexer]
dt = DecisionTreeClassifier(labelCol="indexedLabel", featuresCol="features")
stages += [dt]
evaluator = MulticlassClassificationEvaluator(labelCol='indexedLabel', predictionCol='prediction', metricName='f1')
paramGrid = (ParamGridBuilder()
.addGrid(dt.maxDepth, [1,2,6])
.addGrid(dt.maxBins, [20,40])
.build())
pipeline = Pipeline(stages=stages)
trainValidationSplit = TrainValidationSplit(estimator=pipeline, estimatorParamMaps=paramGrid, evaluator=evaluator, trainRatio=0.95)
model = trainValidationSplit.fit(train_dataset)
train_dataset= model.transform(train_dataset)
我见过这个answer,但我不确定它是否也适用于我的情况,我想知道是否有更合适的解决方案。 请帮忙吗?
答案 0 :(得分:2)
Unseen label
例外通常与StringIndexer
相关联。
您将数据拆分为训练(95%)和验证(5%)数据集。我认为有一些类别值(在categoricalCol
列中)出现在训练数据中但未出现在验证集中。
因此,在验证过程的字符串索引阶段,StringIndexer
会看到一个看不见的标签并抛出该异常。通过提高培训比率,您增加了培训集中类别值是验证集中类别值的机会,但这只是一种解决方法,因为无法保证。
一种可能的解决方案:fit
首先StringIndexer
train_dataset
,然后将生成的StringIndexerModel
添加到管道阶段。这样StringIndexer
就会看到所有可能的类别值。
for categoricalCol in categoricalCols:
stringIndexer = StringIndexer(inputCol=categoricalCol, outputCol=categoricalCol+"Index")
strIndexModel = stringIndexer.fit(train_dataset)
stages += [strIndexModel]