簡體   English   中英

如何將xgboost集成到spark中? (蟒蛇)

[英]How can I integrate xgboost in spark? (Python)

我正在嘗試使用在蜂巢中的數據使用XGBoost訓練模型,數據太大,無法將其轉換為pandas df,所以我必須將XGBoost與spark df一起使用。 創建XGBoostEstimator時,發生錯誤:

TypeError:“ JavaPackage”對象不可調用Exception AttributeError:“ NoneType”對象沒有屬性“ _detach””被​​忽略

我沒有使用xgboost產生火花的經驗,我已經在線嘗試了一些教程,但是都沒有用。 我嘗試對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正確集成到我的代碼中。

幫助將不勝感激。

謝謝

您可以嘗試使用LightGBM,而不是使用XGBoost,它是一種相似且可以說更好(至少更快)的算法。 它在pyspark中非常有效,您可以在這里閱讀更多內容

較新的Apache Spark(2.3.0)版本沒有XGBoost。 您應該嘗試使用Pyspark。 您必須將Spark數據框轉換為pandas數據框。

這是一篇很棒的文章,提供了工作流程並解釋了xgboost和spark

好的,我再次閱讀了您的文章,您聲稱數據集太大。 也許您應該嘗試使用Apache Arrow。 選中此使用Apache Arrow加速Pyspark

經過一天的調試后,問題出在了罐子的提交錯誤。 我在本地下載了罐子,並使用以下方法pyspark-submit它們:

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

這解決了問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM