首页 > 解决方案 > XGBoost4J-Spark Training Performance with vector Assembler 和自定义密集向量导致两个完全不同的训练模型文件

问题描述

我目前正在使用 XGBoost4j。要使用它,我必须使用 Vector Assembler 转换我的训练数据。以下是我的问题:

  1. 我使用向量汇编器转换我的数据。向量汇编器的输出是特征向量列。 Vector assembler 何时将输出列作为密集向量以及何时转换为稀疏向量? 我应该如何将 Vector assembler 的缺失值设置为 Non-zero value

  2. 为避免上述情况,我还尝试使用以下代码来转换我的训练数据:

val feature_col = array(testing.drop("cust_xref_id","dep_var").columns.map(col).map(_.cast(DoubleType)): _*)

val trainDF = train.select(train("dep_var").cast(DoubleType), train("cust_xref_id").cast(StringType) ,feature_col).map(r => (r.getAs[Double](0), r.getAs[Long](1),**org.apache.spark.ml.linalg.Vectors.dense(r.getAs[mutable.WrappedArray[Double]**](2).toArray))).toDF("label","key","features")

where, Key_column is cust_xref_id and my label column is dep_var. 

但是,这会导致模型性能急剧下降。我不确定可能是什么问题

  1. 如果我有一个模型,其中“0”是一个有意义的值。我应该如何防止它在 XGBoost4j 训练中被视为缺失值。

https://xgboost.readthedocs.io/en/release_0.90/jvm/xgboost4j_spark_tutorial.html

在上面提到的链接中,他们要求我们将 0 替换为任何其他值。我有一些热编码的功能,我应该如何处理?

我使用的是 0.82 和 0.9 版本。

请帮我解决这个问题。

标签: apache-spark-mllibxgboost

解决方案


推荐阅读