You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark回归模型计算R2指标报错:未识别标签ISLAND求助

解决PySpark RegressionEvaluator计算R2时的未见过标签错误

问题根源

测试集中存在训练集从未出现过的目标类别ISLAND,默认配置下,无论是标签索引器组件还是RegressionEvaluator本身,都会对未见过的类别抛出错误。你提到小型数据集正常运行,大概率是因为小数据集中训练集覆盖了所有类别,而大数据集拆分后出现了类别分布不一致的情况。

具体解决步骤

  • 修正标签索引器的配置
    如果你的目标列使用了StringIndexer进行编码,必须在训练阶段设置handleInvalid="keep",这样测试集里的未见过类别会被分配一个新的索引值,而非转为NaN导致后续评估出错。示例代码:

    from pyspark.ml.feature import StringIndexer
    label_indexer = StringIndexer(
        inputCol="your_target_column",
        outputCol="indexed_label",
        handleInvalid="keep"
    )
    

    将这个配置更新到你的Pipeline中,重新训练模型。

  • 配置RegressionEvaluator的handleInvalid参数
    直接在评估器中添加handleInvalid="keep"参数,让它正确处理未见过的标签:

    from pyspark.ml.evaluation import RegressionEvaluator
    evaluator = RegressionEvaluator(
        predictionCol="prediction",
        labelCol="indexed_label",
        metricName="r2",
        handleInvalid="keep"
    )
    r2_score = evaluator.evaluate(predictions)
    
  • 检查训练/测试集的类别分布
    先确认测试集里的ISLAND类别是否是训练集完全没有的,用以下代码排查:

    # 查看训练集目标列所有类别
    train.select("your_target_column").distinct().show()
    # 查看测试集目标列所有类别
    test.select("your_target_column").distinct().show()
    # 找出测试集独有的类别
    test_only_classes = test.select("your_target_column").distinct() \
                            .subtract(train.select("your_target_column").distinct())
    test_only_classes.show()
    

    如果是数据集拆分导致的类别缺失,可以调整拆分逻辑(比如使用分层抽样),或者对测试集里的独有类别做预处理(比如合并到相近类别、删除对应样本)。

  • 验证标签列与预测列的类型兼容性
    确保RegressionEvaluator指定的labelCol和predictionCol都是数值类型。如果目标列原本是字符串,必须经过索引编码转为数值后才能用于回归评估,避免类型不兼容引发隐性错误。

内容的提问来源于stack exchange,提问作者Ingrimm Rubikon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:58:26