【问题标题】:How can I integrate xgboost in spark? (Python)如何将 xgboost 集成到 spark 中? (Python)
【发布时间】:2019-09-16 19:31:14
【问题描述】:

我正在尝试使用 XGBoost 对我在蜂巢上的数据训练模型,数据太大,我无法将其转换为 pandas df,因此我必须将 XGBoost 与 spark df 一起使用。 创建 XGBoostEstimator 时出现错误:

TypeError: 'JavaPackage' 对象不可调用 异常AttributeError:“'NoneType'对象没有属性'_detach'”被忽略

我没有使用 xgboost for spark 的经验,我在网上尝试了一些教程,但都没有奏效。 我试图转换为 pandas df,但数据太大,我总是从 Java 包装器中得到OutOfMemoryException(我也尝试查找它,但该解决方案对我不起作用,提高了执行器内存)。

我关注的最新教程是:

https://towardsdatascience.com/pyspark-and-xgboost-integration-tested-on-the-kaggle-titanic-dataset-4e75a568bdb

放弃XGBoost模块后,我开始使用sparkxgb

spark = create_spark_session('shai', 'dna_pipeline')
# sparkxgboost files 
spark.sparkContext.addPyFile('resources/sparkxgb.zip')

def create_spark_session(username=None, app_name="pipeline"):
    if username is not None:
        os.environ['HADOOP_USER_NAME'] = username

    return SparkSession \
        .builder \
        .master("yarn") \
        .appName(app_name) \
        .config(...) \
        .config(...) \
        .getOrCreate()

def train():
    train_df = spark.table('dna.offline_features_train_full')
    test_df = spark.table('dna.offline_features_test_full')

    from sparkxgb import XGBoostEstimator

    vectorAssembler = VectorAssembler() \
        .setInputCols(train_df.columns) \
        .setOutputCol("features")

    # This is where the program fails
    xgboost = XGBoostEstimator(
        featuresCol="features",
        labelCol="label",
        predictionCol="prediction"
    )

    pipeline = Pipeline().setStages([xgboost])
    pipeline.fit(train_df)

完整的例外是:

Traceback (most recent call last):
  File "/home/elad/DNA/dna/dna/run.py", line 283, in <module>
    main()
  File "/home/elad/DNA/dna/dna/run.py", line 247, in main
    offline_model = train_model(True, home_dir=config['home_dir'], hdfs_client=client)
  File "/home/elad/DNA/dna/dna/run.py", line 222, in train_model
    model = train(offline_mode=offline, spark=spark)
  File "/home/elad/DNA/dna/dna/model/xgboost_train.py", line 285, in train
    predictionCol="prediction"
  File "/home/elad/.conda/envs/DNAenv/lib/python2.7/site-packages/pyspark/__init__.py", line 105, in wrapper
    return func(self, **kwargs)
  File "/tmp/spark-7781039b-6821-42be-96e0-ca4005107318/userFiles-70b3d1de-a78c-4fac-b252-2f99a6761b32/sparkxgb.zip/sparkxgb/xgboost.py", line 115, in __init__
  File "/home/elad/.conda/envs/DNAenv/lib/python2.7/site-packages/pyspark/ml/wrapper.py", line 63, in _new_java_obj
    return java_obj(*java_args)
TypeError: 'JavaPackage' object is not callable
Exception AttributeError: "'NoneType' object has no attribute '_detach'" in <bound method XGBoostEstimator.__del__ of XGBoostEstimator_4f54b37156fb0a113233> ignored

我不知道为什么会发生此异常,也不知道如何将 sparkxgb 正确集成到我的代码中。

我们将不胜感激。

谢谢

【问题讨论】:

    标签: python apache-spark pyspark xgboost


    【解决方案1】:

    在调试了这个模块一天之后,问题只是错误地提交了 jars。 我在本地下载了 jars 并使用 pyspark 提交它们:

    PYSPARK_SUBMIT_ARGS=--jars resources/xgboost4j-0.72.jar,resources/xgboost4j-spark-0.72.jar

    这解决了问题。

    【讨论】:

      【解决方案2】:

      您可以尝试使用 LightGBM,而不是使用 XGBoost,这是一种类似且可以说更好(至少更快)的算法。它在 pyspark 中开箱即用,您可以 read more here

      【讨论】:

      • 虽然我找到了解决方案,但我会研究这个模块,谢谢
      【解决方案3】:

      较新的 Apache Spark(2.3.0) 版本没有 XGBoost。您应该尝试使用 Pyspark。您必须将 Spark 数据框转换为 pandas 数据框。

      这是一篇很好的文章,提供了工作流程和解释 xgboost and spark

      好的,我再次阅读了您的帖子,您声称数据集太大。也许你应该试试 Apache Arrow。检查这个Speeding up Pyspark with Apache Arrow

      【讨论】:

      • 你好,我试过很多工具,比如Arrow,包括Arrow,还是不行,我得到了同样的OutOfMemoryException错误。 Spark 本身没有 XGBoost,但我正在尝试使用这个 api:github.com/dmlc/xgboost/pull/4656
      • 你的数据集的实际大小是多少?
      • 大约 6gb(更大的 dfs 大约是 12gb)
      • 尝试在某处上传一个 dfs,然后发布一个链接。当然,如果数据不是机密的。
      • 很遗憾,我无法共享数据。
      猜你喜欢
      • 1970-01-01
      • 2020-08-21
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 2015-10-13
      相关资源
      最近更新 更多