XGBoost4J - Scala 数据帧到稀疏 dmatrix

XGBoost4J - Scala dataframe to sparse dmatrix

将 Scala 数据帧转换为 XGBoost4J 的稀疏 dmatrix 的最有效和可扩展的方法是什么?

假设我有一个包含 row_indexcolumn_indexvalue 列的数据框 train,它类似于

new DMatrix(train.select("row_index"), train.select("column_index"), train.select("Value"), DMatrix.SparseType.CSR, n_col)

但是上面的代码导致类型不匹配,因为 DMatrix 需要 Array[Long].

train.select(F.collect_list("row_index")).first().getList[Long](0) 似乎是一个可能的选择,但它似乎不利于内存和可扩展。

我正在 Databricks 上执行此操作,因此欢迎使用其他支持的语言(python、SQL、scala)提供解决方案。

答案是按行使用稀疏向量,而不是尝试创建稀疏矩阵或 dmatrix。

train.rdd.map(r => (r.getInt(0), (r.getInt(1), r.getInt(2).toDouble))).groupByKey().map(r => (r._1, Vectors.sparse(n_col, r._2.toSeq))).toDF

我测试了使用 Matrix::sparseMatrixxgboost::dmatrixR 中的数据样本进行评分,结果匹配。