Xgboost: [مناقشة] التكامل مع PySpark

تم إنشاؤها على ٢٥ أكتوبر ٢٠١٦  ·  53تعليقات  ·  مصدر: dmlc/xgboost

لقد لاحظت للتو أن هناك بعض طلبات التكامل مع PySpark http://dmlc.ml/2016/03/14/xgboost4j-portable-distributed-xgboost-in-spark-flink-and-dataflow.html

تلقيت أيضًا بعض رسائل البريد الإلكتروني من المستخدمين الذين يناقشون نفس الموضوع

أود بدء مناقشة هنا حول ما إذا كنا سنبدأ هذا العمل ومتى

تضمين التغريدة

python

التعليق الأكثر فائدة

سيستفيد مجتمع CodingCattqchen Data Science بالتأكيد من تطبيق XGboost في PySpark ، للأسباب التالية:

  • بشكل عام ، أصبحت لغة Python هي اللغة رقم 3 اعتبارًا من مارس 2017 بنسبة 10.2٪ من الشعبية (مقابل 1.8٪ لـ Scala)
    http://redmonk.com/sogrady/2017/03/17/language-rankings-1-17/
    https://jobsquery.it/stats/language/group ؛
  • فيما يتعلق بأداء PySpark vs Scala ، سأفترض ، لا يهم كثيرًا لأن جميع Scala تقريبًا تحت غطاء Spark ، أليس كذلك؟
  • أعرف ، على الأقل ، 3 شركات ناشئة للذكاء الاصطناعي تستخدم PySpark للإنتاج ، وبشكل أكثر عمومية ، فإن Python أكثر شهرة لعلماء البيانات وفي الطلب في سوق العمل (
    http://r4stats.com/articles/popularity/)
    استنتاجي: XGboost المطبق في PySpark سيكون له أكبر تأثير على DataScience بين جميع التطبيقات الأخرى.
    (PS مرة واحدة مستقرة ، تأكد من أن Cloudera تنفذها)

ال 53 كومينتر

CodingCat هل تعرف ما هو حجم مجتمع PySpark؟ معظم الناس يستخدمون Scala API فقط. يبدو أن الكثير من الأشياء تحتاج إلى إعادة التنفيذ في بايثون - يرجى تصحيح ما إذا كنت مخطئًا.

أعتقد أن PySpark منتشر جدًا في مجتمع علماء البيانات ، وهذا يعني في سيناريو النماذج الأولية السريعة ، وما إلى ذلك. سمعت عن العديد من الحالات التي يستخدم فيها علماء البيانات pySpark لتحليل كميات كبيرة من البيانات.

على الجانب الآخر ، تعتمد معظم السيناريوهات على مستوى الإنتاج على Scala API (لا أعرف سوى حالة واحدة يستخدمها الأشخاص PySpark في الإنتاج على نطاق واسع)

نعم ، أشعر فقط أن واجهة برمجة تطبيقات Python الحالية يجب أن تكون قادرة على التعامل مع معظم احتياجات النماذج الأولية. أنا شخصياً أهتم أكثر بـ Spark عندما نريد المزيد من الأشياء الجاهزة للإنتاج. ربما يجب أن نترك المناقشة هنا حتى يتمكن الناس من مناقشة احتياجاتهم. في غضون ذلك ، سيكون من الرائع أن تتمكن من تقديم بعض التفاصيل حول الأساليب / التقديرات / الخطوات الخاصة بالتكامل.

لاحظت للتو بعض المناقشات في المجتمع

http://apache-spark-developers-list.1001551.n3.nabble.com/Blocked-PySpark-changes-td19712.html

يبدو أن تطوير PySpark متأخر ... كمكتبة المصب ، أصوت لـ hold on لتكريس تكامل PySpark .....

نعم ، من الصعب أيضًا تصحيح أي مشكلات واجهتها (على الأقل عندما كنت أحاول ذلك العام الماضي) ...

في خارطة الطريق (# 873) ، قالت أنه تم تنفيذ توزيع بيثون. هل هذا يعني أن xgboost يمكن أن يعمل على كتلة هادوب مع بيثون؟ (أنا لا أعني pyspark)

نعم ، انظر المثال المنشور في الارتباط

ما هو الفرق بين تشغيل xgboost على مجموعة hadoop مع Python مقابل تشغيل xgboost على مجموعة hadoop مع scala api؟ هل هناك اختلافات كبيرة في الأداء؟
أعتقد أنه لا يزال هناك الكثير من الأشخاص الذين يستخدمون pyspark لنموذج الإنتاج أيضًا.

@ yiming-chen الهدف من xgboost4j-spark هو توحيد ETL ونموذج التدريب في نفس خط الأنابيب

السؤال يعود إلى ما هي اللغة التي يستخدمها المستخدمون عند القيام بـ ETL؟ بناءً على ملاحظتي وخبرتي ، يقوم 95٪ من المستخدمين ببناء نظام ETL الخاص بهم باستخدام scala

CodingCat لا أعرف من أين حصلت على إحصائيات 95٪ الخاصة بك ، ولكن PySpark يستخدم على نطاق واسع بالتأكيد في تجربتي. على سبيل المثال ، نحاول دمج Airflow لجدولة العمل لخط الأنابيب الخاص بنا وستكون Python مناسبة في هذا الموقف.

أنت تستخدم

سيستفيد مجتمع CodingCattqchen Data Science بالتأكيد من تطبيق XGboost في PySpark ، للأسباب التالية:

  • بشكل عام ، أصبحت لغة Python هي اللغة رقم 3 اعتبارًا من مارس 2017 بنسبة 10.2٪ من الشعبية (مقابل 1.8٪ لـ Scala)
    http://redmonk.com/sogrady/2017/03/17/language-rankings-1-17/
    https://jobsquery.it/stats/language/group ؛
  • فيما يتعلق بأداء PySpark vs Scala ، سأفترض ، لا يهم كثيرًا لأن جميع Scala تقريبًا تحت غطاء Spark ، أليس كذلك؟
  • أعرف ، على الأقل ، 3 شركات ناشئة للذكاء الاصطناعي تستخدم PySpark للإنتاج ، وبشكل أكثر عمومية ، فإن Python أكثر شهرة لعلماء البيانات وفي الطلب في سوق العمل (
    http://r4stats.com/articles/popularity/)
    استنتاجي: XGboost المطبق في PySpark سيكون له أكبر تأثير على DataScience بين جميع التطبيقات الأخرى.
    (PS مرة واحدة مستقرة ، تأكد من أن Cloudera تنفذها)

لا تتردد في إرسال العلاقات العامة ، وسوف تجد التكلفة

لتجنب العودة إلى الموضوع مرارًا وتكرارًا ، سأغلق المناقشة باستنتاج أن

  • أنا شخصياً لن أصوت لمواصلة هذا الجهد لدمج PySpark (في الوقت الحالي)

  • نرحب بأي شخص آخر للمساهمة في هذا الأمر ، ومع ذلك ، نحتاج على الأقل إلى مراعاة الأمور التالية:

    • لا تقم بإدخال حزمة أخرى من حزمة python

    • التوافق مع الإصدارات السابقة لواجهة برمجة تطبيقات Python الحالية عند تنفيذ التكامل

    • التعامل مع الميزات المتخلفة عن ML's pyspark

إذن لا يمكننا استخدام pyspark لتحميل نموذج XGBoost-spark؟ تضمين التغريدة

لذلك ، يمكن أن يكون التفاف scala XGBoost أقل إيلامًا في PySpark JavaEstimator API. لقد لعبت قليلاً ولدي مثل هذا النموذج الأولي:

from pyspark.ml.wrapper import JavaEstimator, JavaModel
from pyspark.ml.param.shared import *
from pyspark.ml.util import *
from pyspark.context import SparkContext

class XGBoost(JavaEstimator, JavaMLWritable, JavaMLReadable, HasRegParam, HasElasticNetParam):

    def __init__(self, paramMap = {}):
        super(XGBoost, self).__init__()
        scalaMap = SparkContext._active_spark_context._jvm.PythonUtils.toScalaMap(paramMap)
        self._java_obj = self._new_java_obj(
            "ml.dmlc.xgboost4j.scala.spark.XGBoostEstimator", self.uid, scalaMap)
        self._defaultParamMap = paramMap
        self._paramMap = paramMap

    def setParams(self, paramMap = {}):
        return self._set(paramMap)

    def _create_model(self, javaTrainingData):
        return JavaModel(javaTrainingData)

أعتقد أنه لا يزال بحاجة إلى بعض العمل لكنني تمكنت من تشغيل Xgboost في PySpark معه.

شكرا Wieslaw لمشاركة مقتطف الشفرة على غلاف XGBoost PySpark. هل يمكنك مشاركة الكود عند استدعاء فئة XGBoost مع المعلمات المناسبة؟

شكرا

wpopielarski إنها وظيفة رائعة قمت بها. هل يمكنك مشاركة الكود عند استدعاء XGBoost مع المعلمات المطلوبة؟ ومن شأن ذلك أن يكون عونا كبيرا!

هذا شيء مثل:

        from app.xgboost import XGBoost
        xgboost_params = {
            "eta"  : 0.023,
            "max_depth" : 10,
            "min_child_weight" : 0.3,
            "subsample" : 0.7,
            "colsample_bytree" : 0.82,
            "colsample_bylevel" : 0.9,
            "base_score" : base_score,
            "eval_metric" : "auc",
            "seed" : 49,
            "silent" : 1,
            "objective" : "binary:logistic",
            "round" : 10,
            "nWorkers" : 2,
            "useExternalMemory" : True
        }
        xgboost_estimator = XGBoost.XGBoost(xgboost_params)
...
        model = xgboost_estimator.fit(data)

أقترب من إجراء العلاقات العامة بدعم PySpark المناسب.

thesuperzapper ، هذا رائع!

كم من الوقت تعتقد أنه سيستغرق إنهاء الأمر؟ هل تشارك الأفكار أثناء التقدم.

شكرا!

مرحبًا ، أكتب إصدارًا بسيطًا بـ ParamGridBuilder في حالة وجود أي شخص مهتم ، فمن السهل حقًا تخصيصه.

  • 1 قم بإنشاء حزمة dir mkdir -p ml/dmlc/xgboost4j/scala في أي مسار PYTHONPATH صالح.
  • 2 انسخ الكود أدناه إلى ml/dmlc/xgboost4j/scala/spark.py
from pyspark.ml.classification import JavaClassificationModel, JavaMLWritable, JavaMLReadable, TypeConverters, Param, \
    Params, HasFeaturesCol, HasLabelCol, HasPredictionCol, HasRawPredictionCol, SparkContext
from pyspark.ml.wrapper import JavaModel, JavaWrapper, JavaEstimator


class XGBParams(Params):
    '''

    '''
    eta = Param(Params._dummy(), "eta",
                "step size shrinkage used in update to prevents overfitting. After each boosting step, we can directly get the weights of new features. and eta actually shrinks the feature weights to make the boosting process more conservative",
                typeConverter=TypeConverters.toFloat)
    max_depth = Param(Params._dummy(), "max_depth",
                      "maximum depth of a tree, increase this value will make the model more complex / likely to be overfitting. 0 indicates no limit, limit is required for depth-wise grow policy.range: [0,∞]",
                      typeConverter=TypeConverters.toInt)
    min_child_weight = Param(Params._dummy(), "min_child_weight",
                             "minimum sum of instance weight (hessian) needed in a child. If the tree partition step results in a leaf node with the sum of instance weight less than min_child_weight, then the building process will give up further partitioning. In linear regression mode, this simply corresponds to minimum number of instances needed to be in each node. The larger, the more conservative the algorithm will berange: [0,∞]",
                             typeConverter=TypeConverters.toFloat)
    max_delta_step = Param(Params._dummy(), "max_delta_step",
                           "Maximum delta step we allow each tree’s weight estimation to be. If the value is set to 0, it means there is no constraint. If it is set to a positive value, it can help making the update step more conservative. Usually this parameter is not needed, but it might help in logistic regression when class is extremely imbalanced. Set it to value of 1-10 might help control the update.",
                           typeConverter=TypeConverters.toInt)
    subsample = Param(Params._dummy(), "subsample",
                      "subsample ratio of the training instance. Setting it to 0.5 means that XGBoost randomly collected half of the data instances to grow trees and this will prevent overfitting.",
                      typeConverter=TypeConverters.toFloat)
    colsample_bytree = Param(Params._dummy(), "colsample_bytree",
                             "subsample ratio of columns when constructing each tree",
                             typeConverter=TypeConverters.toFloat)
    colsample_bylevel = Param(Params._dummy(), "colsample_bylevel",
                              "subsample ratio of columns for each split, in each level.",
                              typeConverter=TypeConverters.toFloat)
    max_leaves = Param(Params._dummy(), "max_leaves",
                       "Maximum number of nodes to be added. Only relevant for the ‘lossguide’ grow policy.",
                       typeConverter=TypeConverters.toInt)

    def __init__(self):
        super(XGBParams, self).__init__()

class XGBoostClassifier(JavaEstimator, JavaMLWritable, JavaMLReadable, XGBParams,
                        HasFeaturesCol, HasLabelCol, HasPredictionCol, HasRawPredictionCol):
    def __init__(self, paramMap={}):
        super(XGBoostClassifier, self).__init__()
        scalaMap = SparkContext._active_spark_context._jvm.PythonUtils.toScalaMap(paramMap)
        self._java_obj = self._new_java_obj("ml.dmlc.xgboost4j.scala.spark.XGBoostEstimator", self.uid, scalaMap)
        self._defaultParamMap = paramMap
        self._paramMap = paramMap

    def setParams(self, paramMap={}):
        return self._set(paramMap)

    def _create_model(self, java_model):
        return XGBoostClassificationModel(java_model)


class XGBoostClassificationModel(JavaModel, JavaClassificationModel, JavaMLWritable, JavaMLReadable):

    def getBooster(self):
        return self._call_java("booster")

    def saveBooster(self, save_path):
        jxgb = JavaWrapper(self.getBooster())
        jxgb._call_java("saveModel", save_path)
  • 3 العبها كنموذج pyspark عادي!

AakashBasuRZThaiy، ونحن نعمل الآن على هذا صحيح في العدد رقم 3370، مع PR # 3376 تقديم الدعم الأولي.

haiy هل يمكن أن تريني مقتطفًا من التعليمات البرمجية التي تناسب المصنف في بعض مجموعات البيانات التعسفية؟ لقد اتبعت النقطتين 1 و 2 اللتين حددتهما ، لكني لا أستطيع فهم نقطتك الثالثة.

@ sagnik-rzt تحقق من هذه العينة

haiy أحاول تشغيل هذا:

import pyspark
import pandas as pd
from dmlc.xgboost4j.scala.spark import XGBoostClassifier
from sklearn.utils import shuffle

sc = pyspark.SparkContext('local[2]')
spark = pyspark.sql.SparkSession(sc)
df = pd.DataFrame({'x1': range(10), 'x2': [10] * 10, 'y': shuffle([0 for i in range(5)] + [1 for i in range(5)])})
sdf = spark.createDataFrame(df)
X = sdf.select(['x1', 'x2'])
Y = sdf.select(['y'])
print(X.show(5))

params = {'objective' :'binary:logistic', 'n_estimators' : 10, 'max_depth' : 3, 'learning_rate' : 0.033}
xgb_model = XGBoostClassifier(params)

وهي تعطي هذا الاستثناء:

Traceback (most recent call last):
  File "/home/sagnikb/PycharmProjects/auto_ML/pyspark_xgboost.py", line 20, in <module>
    xgb_model = XGBoostClassifier(params)
  File "/usr/lib/ml/dmlc/xgboost4j/scala/spark.py", line 47, in __init__
    self._java_obj = self._new_java_obj("ml.dmlc.xgboost4j.scala.spark.XGBoostEstimator", self.uid, scalaMap)
  File "/usr/local/lib/python3.6/dist-packages/pyspark/ml/wrapper.py", line 63, in _new_java_obj
    return java_obj(*java_args)
TypeError: 'JavaPackage' object is not callable

Error in sys.excepthook:
Traceback (most recent call last):
  File "/home/sagnikb/PycharmProjects/auto_ML/pyspark_xgboost.py", line 20, in <module>
    xgb_model = XGBoostClassifier(params)
  File "/usr/lib/ml/dmlc/xgboost4j/scala/spark.py", line 47, in __init__
    self._java_obj = self._new_java_obj("ml.dmlc.xgboost4j.scala.spark.XGBoostEstimator", self.uid, scalaMap)
  File "/usr/local/lib/python3.6/dist-packages/pyspark/ml/wrapper.py", line 63, in _new_java_obj
    return java_obj(*java_args)
TypeError: 'JavaPackage' object is not callable
Exception ignored in: <bound method JavaParams.__del__ of XGBoostClassifier_4f9eb5d1388e9e1424a4>
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/pyspark/ml/wrapper.py", line 105, in __del__
    SparkContext._active_spark_context._gateway.detach(self._java_obj)
  File "/usr/local/lib/python3.6/dist-packages/py4j/java_gateway.py", line 1897, in detach
    java_object._detach()
AttributeError: 'NoneType' object has no attribute '_detach'

بيئة:
Python 3.6.0 تحديث
Spark 2.3.2 تحديث
Scala 2.11.2 تحديث

@ sagnik-rzt
لست متأكدًا ولكن هل أضفت xgboost-spark.jar مع deps على سبارك كلاس باث؟

wpopielarski مرحبًا لا ، لم أفعل ذلك. أي فكرة أين يمكنني العثور على ملف الجرة؟

@ sagnik-rzt مرحبًا ، من فضلك حمل الجرة هنا ، إنها جرة دهن سبارك 4 ج الرسمية. . عذراً ، لقد وجدت للتو أن البرطمان الخاص بي مبني على أساس نظام التشغيل mac ، فقط حاول بنائه كما يقترح wpopielarski . ووضعه في شرارة deps dir ، مثل $SPARK_HOME/jars .

تحتاج إلى بنائه بنفسك :) ، مع المخضرم والملف الشخصي assembly الذي يبني جرة الدهون في jvm-packages/xgboost-spark/target أو نحو ذلك.

@ sagnik-rzt لست متأكدًا مما ستفعله ولكن لإنشاء وعاء دهون لنظام التشغيل الخاص بك ، فقط قم باستنساخ مشروع dmlc xgboost github ، و cd إلى حزم jvm وتشغيل mvn مع ملف تعريف assemby . ليس لدي أدنى فكرة عن كيفية كتابة ملف بناء gradle.

حسنًا ، لقد صنعت وعاءًا سمينًا به تبعيات ثم قمت بنسخه ولصقه في $ SPARK_HOME / jars.
ومع ذلك ، لا يزال الاستثناء نفسه ينطبق على:

Traceback (most recent call last):
  File "/home/sagnikb/PycharmProjects/xgboost/test_import.py", line 21, in <module>
    clf = xgb(params)
  File "/usr/lib/ml/dmlc/xgboost4j/scala/spark.py", line 48, in __init__
    self._java_obj = self._new_java_obj("dmlc.xgboost4j.scala.spark.XGBoostEstimator", self.uid, scalaMap)
  File "/usr/local/lib/python3.6/dist-packages/pyspark/ml/wrapper.py", line 63, in _new_java_obj
    return java_obj(*java_args)
TypeError: 'JavaPackage' object is not callable

آسف ، لكنك تقوم بتشغيله على الكتلة ، محليًا من بعض مشاريع IDE؟ إذا كنت كذلك
باستخدام spark-submit ، من الأفضل إضافة deps إلى مفتاح jars

2018-06-29 14:30 بتوقيت جرينتش + 02: 00 sagnik-rzt [email protected] :

حسنًا ، لقد صنعت وعاءًا سمينًا به تبعيات ثم قمت بنسخه
إلى SPARK_HOME / الجرار.
ومع ذلك ، لا يزال الاستثناء نفسه ينطبق على:

Traceback (آخر مكالمة أخيرة):
ملف "/home/sagnikb/PycharmProjects/xgboost/test_import.py" ، السطر 21 ، في
clf = xgb (بارامس)
ملف "/usr/lib/ml/dmlc/xgboost4j/scala/spark.py" ، السطر 48 ، في __init__
self._java_obj = self._new_java_obj ("dmlc.xgboost4j.scala.spark.XGBoostEstimator" ، self.uid ، scalaMap)
ملف "/usr/local/lib/python3.6/dist-packages/pyspark/ml/wrapper.py" ، السطر 63 ، في _new_java_obj
إرجاع java_obj (* java_args)
TypeError: كائن "JavaPackage" غير قابل للاستدعاء

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/dmlc/xgboost/issues/1698#issuecomment-401339910 ، أو كتم الصوت
الخيط
https://github.com/notifications/unsubscribe-auth/ALEzS3JmKjO0AZ6JMzcixwCce0_3zRM0ks5uBh3ogaJpZM4KgAY_
.

أنا أعمل حاليًا على إعادة تأسيس # 3376 إلى فرع شرارة جديد ، وفي الوقت نفسه ، سأل عدد قليل من الأشخاص عن كيفية استخدام الكود الحالي على XGBoost-0.72.

هذا ملف مضغوط به كود pyspark لـ XGBoost-0.72.
تنزيل: sparkxgb.zip

كل ما عليك فعله هو:

  1. أضف الجرار والتبعيات Scala XGBoost العادية إلى وظيفتك. (على سبيل المثال ، باستخدام --jars أو spark.jars config).
  2. بمجرد بدء المهمة ، قم بتشغيل هذا في لغة python: (أو أي موقع محلي يمكن لكل منفذ رؤيته)
sc.addPyFile("hdfs:///XXXX/XXXX/XXXX/sparkxgb.zip")
  1. اختبار مع الكود التالي. (بافتراض أنك قمت بنقل sample_binary_classification_data.txt إلى موقع يمكن الوصول إليه ، فعادة ما يكون بعملة $SPARK_HOME/data/mllib/sample_binary_classification_data.txt )
from sparkxgb import XGBoostEstimator

# Load Data
dataPath = "sample_binary_classification_data.txt"
dataDF = spark.read.format("libsvm").load(dataPath)

# Split into Train/Test
trainDF, testDF = dataDF.randomSplit([0.8, 0.2], seed=1000)

# Define and train model
xgboost = XGBoostEstimator(
    # General Params
    nworkers=1, nthread=1, checkpointInterval=-1, checkpoint_path="",
    use_external_memory=False, silent=0, missing=float("nan"),

    # Column Params
    featuresCol="features", labelCol="label", predictionCol="prediction", 
    weightCol="weight", baseMarginCol="baseMargin", 

    # Booster Params
    booster="gbtree", base_score=0.5, objective="binary:logistic", eval_metric="error", 
    num_class=2, num_round=2, seed=None,

    # Tree Booster Params
    eta=0.3, gamma=0.0, max_depth=6, min_child_weight=1.0, max_delta_step=0.0, subsample=1.0,
    colsample_bytree=1.0, colsample_bylevel=1.0, reg_lambda=0.0, alpha=0.0, tree_method="auto",
    sketch_eps=0.03, scale_pos_weight=1.0, grow_policy='depthwise', max_bin=256,

    # Dart Booster Params
    sample_type="uniform", normalize_type="tree", rate_drop=0.0, skip_drop=0.0,

    # Linear Booster Params
    lambda_bias=0.0
)
xgboost_model = xgboost.fit(trainDF)

# Transform test set
xgboost_model.transform(testDF).show()

# Write model/classifier
xgboost.write().overwrite().save("xgboost_class_test")
xgboost_model.write().overwrite().save("xgboost_class_test.model")

ملحوظة:

  • سيعمل هذا فقط مع Spark 2.2+
  • خطوط الأنابيب و ParamGridBuilder مدعومة نوعًا ما ، استخدم كائن خط الأنابيب المعدل مع from sparkxgb.pipeline import XGBoostPipeline,XGBoostPipelineModel كما تفعل مع الكائنات العادية.
  • يجب عليك استخدام float ("+ inf") للقيم المفقودة بدلاً من float ("nan") لتتم معالجة القيم الخالية بشكل صحيح بسبب خطأ في XGboost-0.72.
  • لا يمكنك إعادة تحميل كائنات النموذج غير المدربة ، (انظر # 3035)
  • ستتغير واجهة برمجة التطبيقات هذه بإصدار كامل من دعم pyspark.

thesuperzapper أحاول اختبار هذا مع pyspark على دفتر jupyter.

نظامي:
بيثون 3.6.1
xgboost 0.72.0 تحديث
شرارة 2.2.0
جافا 1.8
scala 2.12.0 تحديث

عندما أحاول تحميل XGBoostEstimator أحصل على:

Exception in thread "Thread-19" java.lang.NoClassDefFoundError: ml/dmlc/xgboost4j/scala/EvalTrait
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetPublicMethods(Class.java:2902)
    at java.lang.Class.getMethods(Class.java:1615)
    at py4j.reflection.ReflectionEngine.getMethodsByNameAndLength(ReflectionEngine.java:345)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:305)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326)
    at py4j.Gateway.invoke(Gateway.java:272)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:214)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: ml.dmlc.xgboost4j.scala.EvalTrait
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 12 more

هل هذا خطأ أم أنني فقدت بعض المتطلبات؟

BogdanCojocar يبدو أنك تفتقد مكتبة xgboost.

أنت بحاجة إلى هاتين الجرارين لكي يعمل xgboost بشكل صحيح:

يمكنك تنزيل الجرار المطلوبة من تلك الروابط المخضرمة.

شكراthesuperzapper. يعمل بشكل جيد. عمل رائع مع هذا التكامل إلى pyspark!

أي اقتراح حول كيفية حفظ النموذج المدرّب لتعزيز التحميل في وحدة Python؟

@ ericwang915 عادةً للحصول على نموذج يعمل مع مكتبات XGBoost الأخرى ، يمكنك استخدام طريقة .booster.saveModel("XXX/XXX") على كائن النموذج ، حيث XXX هو مسار محلي (غير HDFS) على برنامج تشغيل Spark. إذا كنت تستخدم طريقة حفظ أخرى ، فستتلقى خطأ (راجع: # ​​2480)

ومع ذلك ، فقد نسيت إضافة طريقة لاستدعاء وظيفة الحفظ في هذا الإصدار من الغلاف ، سأفعل ذلك غدًا إذا توفرت لي بعض الوقت. (أنا أعيش في نيوزيلندا ... لذلك المناطق الزمنية)

شكرا لك. بالمناسبة ، أثناء عملية التدريب ، لا يوجد سجل يوضح مقاييس التقييم وجولة التعزيز على الرغم من تعيين الوضع الصامت على 1.

thesuperzapper شكرا على التعليمات. لقد تمكنت من اتباع التعليمات الخاصة بك لتدريب / حفظ نموذج xgboost في pyspark. هل لديك أي فكرة عن كيفية الوصول إلى وظيفة نموذج xgboost الأخرى مثل (scala) getFeatureScore ()؟

ccdtzccdtz حاليًا أقوم بإعادة توصيل غلاف pyspark نظرًا لأن 0.8 كان لديه تغييرات هائلة في Spark API ، عند الانتهاء ، أهدف إلى الحصول على تكافؤ مع واجهة Spark Scala API.

لم أفضح طريقة التعزيز الأصلية في غلاف pyspark الأولي ، ولكن إذا كنت تستخدم Spark Scala API ، فيمكنك استدعاء xgboost_model_object.nativeBooster.getFeatureScore( واستخدامها كالمعتاد.

لقد رأيت XGBoost على pyspark يفشل باستمرار إذا تم تشغيله مرتين أو أكثر. أنا أقوم بتشغيله على نفس مجموعة البيانات بنفس الكود. نجحت في المرة الأولى ولكن في المرة الثانية ثم فشلت. أنا أستخدم XGBoost 0.72 على Spark 2.3. لا بد لي من إعادة تشغيل قذيفة pyspark لتشغيل الوظيفة بنجاح مرة أخرى.

أستخدم xgboost.trainWithDataFrame لأغراض التدريب.

هل رأى أي شخص هذه القضية؟

مرحبًاthesuperzapper
ما وصفته يعمل بالنسبة لي على عقدة عامل واحدة.
ومع ذلك ، عندما أحاول تشغيل pyspark xgboost على أكثر من عامل واحد (3 في هذه الحالة) ، يصبح المنفذون خاملين ويغلقون بعد فترة.
هذا هو الكود الذي أحاول تشغيله على مجموعة بيانات Titanic (وهي مجموعة بيانات صغيرة):

from pyspark.sql.session import SparkSession
from pyspark.sql.types import *
from pyspark.ml.feature import StringIndexer, VectorAssembler
from pyspark.ml import Pipeline
from pyspark.sql.functions import col

spark = SparkSession\
        .builder\
        .appName("PySpark XGBOOST Titanic")\
        .getOrCreate()

#spark.sparkContext.addPyFile("../sparkxgb.zip")

from automl.sparkxgb import XGBoostEstimator

schema = StructType(
  [StructField("PassengerId", DoubleType()),
    StructField("Survival", DoubleType()),
    StructField("Pclass", DoubleType()),
    StructField("Name", StringType()),
    StructField("Sex", StringType()),
    StructField("Age", DoubleType()),
    StructField("SibSp", DoubleType()),
    StructField("Parch", DoubleType()),
    StructField("Ticket", StringType()),
    StructField("Fare", DoubleType()),
    StructField("Cabin", StringType()),
    StructField("Embarked", StringType())
  ])

df_raw = spark\
  .read\
  .option("header", "true")\
  .schema(schema)\
  .csv("titanic.csv")


df = df_raw.na.fill(0)

sexIndexer = StringIndexer() \
    .setInputCol("Sex") \
    .setOutputCol("SexIndex") \
    .setHandleInvalid("keep")

cabinIndexer = StringIndexer() \
    .setInputCol("Cabin") \
    .setOutputCol("CabinIndex") \
    .setHandleInvalid("keep")

embarkedIndexer = StringIndexer() \
    .setInputCol("Embarked") \
    .setOutputCol("EmbarkedIndex") \
    .setHandleInvalid("keep")

vectorAssembler  = VectorAssembler()\
  .setInputCols(["Pclass", "SexIndex", "Age", "SibSp", "Parch", "Fare", "CabinIndex", "EmbarkedIndex"])\
  .setOutputCol("features")

xgboost = XGBoostEstimator(nworkers=2,
    featuresCol="features",
    labelCol="Survival",
    predictionCol="prediction"
)

pipeline = Pipeline().setStages([sexIndexer, cabinIndexer, embarkedIndexer, vectorAssembler, xgboost])
trainDF, testDF = df.randomSplit([0.8, 0.2], seed=24)

model  =pipeline.fit(trainDF)
print(trainDF.schema)

هذا هو تتبع المكدس:
Tracker started, with env={DMLC_NUM_SERVER=0, DMLC_TRACKER_URI=172.16.1.5, DMLC_TRACKER_PORT=9093, DMLC_NUM_WORKER=3}2018-09-04 08:52:55 ERROR TaskSchedulerImpl:70 - Lost executor 0 on 192.168.49.43: Remote RPC client disassociated. Likely due to containers exceeding thresholds, or network issues. Check driver logs for WARN messages.2018-09-04 08:52:55 ERROR AsyncEventQueue:91 - Interrupted while posting to TaskFailedListener. Removing that listener.java.lang.InterruptedException: ExecutorLost during XGBoost Training: ExecutorLostFailure (executor 0 exited caused by one of the running tasks) Reason: Remote RPC client disassociated. Likely due to containers exceeding thresholds, or network issues. Check driver logs for WARN messages. at org.apache.spark.TaskFailedListener.onTaskEnd(SparkParallelismTracker.scala:116) at org.apache.spark.scheduler.SparkListenerBus$class.doPostEvent(SparkListenerBus.scala:45) at org.apache.spark.scheduler.AsyncEventQueue.doPostEvent(AsyncEventQueue.scala:37) at org.apache.spark.scheduler.AsyncEventQueue.doPostEvent(AsyncEventQueue.scala:37) at org.apache.spark.util.ListenerBus$class.postToAll(ListenerBus.scala:91)

المنفذ عالق في:
org.apache.spark.RDD.foreachPartition(RDD.scala:927) ml.dmlc.xgboost4j.scala.spark.XGBoost$$anonfun$trainDistributed$4$$anon$1.run(XGBoost.scala:348)

البيئة: Python 3.5.4 ، إصدار Spark 2.3.1 ، Xgboost 0.72

هل يمكنك مشاركة تكوينات xgboost و Spark؟ كم عدد
العمال (عمال xgboost) ، منفذي الشرارة ، النوى إلخ.

نيتين

في الثلاثاء ، 4 سبتمبر 2018 الساعة 5:03 صباحًا ، كتب sagnik-rzt [email protected] :

مرحبًا thesuperzapper https://github.com/thesuperzapper
ما وصفته يعمل بالنسبة لي على عقدة عامل واحدة.
ومع ذلك ، عندما أحاول تشغيل pyspark xgboost باستخدام أكثر من واحد
العامل ، المنفذين يصبحون عاطلين ويغلقون بعد فترة.
هذا هو تتبع المكدس:
""
بدأ المقتفي ، مع env = {DMLC_NUM_SERVER = 0 ، DMLC_TRACKER_URI = 172.16.1.5 ،
DMLC_TRACKER_PORT = 9093، DMLC_NUM_WORKER = 3} 2018-09-04 08:52:55 خطأ
TaskSche dulerImpl: 70 - المنفذ المفقود 0 على 192.168.49.43: Remote RPC
العميل مفصول. على الأرجح بسبب تجاوز الحاويات العتبات ، أو
مشاكل الشبكة. تحقق من سجلات برنامج التشغيل بحثًا عن رسائل WARN.2018-09-04 08:52:55
خطأ AsyncE ventQueue: 91 - تمت
إزالة هذا listener.java.lang.InterruptException: Executor Lost أثناء
تدريب XGBoost: ExecutorLostFailure (خرج المنفذ 0 بسبب أحد
المهام قيد التشغيل) السبب: تم ​​إلغاء ارتباط عميل RPC البعيد. من المحتمل بسبب
حاويات تتجاوز العتبات ، أو مشاكل الشبكة. تحقق من سجلات السائق ل
رسائل تحذير. في
org.apache.spark.TaskFailedListener.onTaskEnd (SparkParallelismTracker.scala: 116)
في
org.apache.spark.scheduler.SparkListenerBus $ class.doPostEvent (SparkListenerBus.scala: 45)
في
org.apache.spark.scheduler.AsyncEventQueue.doPostEvent (AsyncEventQueue.scala: 37)
في
org.apache.spark.scheduler.AsyncEventQueue.doPostEvent (AsyncEventQueue.scala: 37)
على org.apache.spark.util.ListenerBus $ class.postToAll (ListenerBus.scala: 91)
""

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/dmlc/xgboost/issues/1698#issuecomment-418341557 ، أو كتم الصوت
الخيط
https://github.com/notifications/unsubscribe-auth/AJY-XklxsZB_FE7ZoAarV_fqw8D3JqxWks5uXmwqgaJpZM4KgAY_
.

@ sagnik-rzt أنا مندهش من أنه يعمل على الإطلاق ، حيث أن غلاف pyspark يدعم XGboost 0.72 فقط ، وما زلنا نعمل على 0.8.

thesuperzapper ، بناءً على الإصدار الذي قدمته ، أعدت تجديد بعض الأجزاء لدعم xgboost 0.80.
ومع ذلك ، انتهى بي الأمر بخطأ py4j.protocol.Py4JError: ml.dmlc.xgboost4j.scala.spark.XGBoostClassifier does not exist in the JVM . لقد قدمت وصفا كاملا هنا . ايمكنك القاء نظرة؟

يتم وضع جميع الرموز هنا .

هناك الكثير من التغييرات المطلوبة أكثر مما قمت بإجرائه لجعله يعمل مع 0.8.

السبب الرئيسي في أنني لم أخرج فقط من الإصدار 0.8 ، هو أنني لا أريد حقًا إنشاء كائن خط أنابيب محدد xgboost مثل ما لدي في 0.72 ، فأنا أعمل على طريقة آمل أن يكون لها كائن pyspark xgboost يعمل مع استمرار خط الأنابيب الافتراضي.

thesuperzapper ، أثناء استخدام أكواد 0.72 ، استخدمت الكائن XGBoostEstimator مباشرة بدون استخدام الكائن XGBoostPipeline . وأثناء القيام بذلك ، لاحظت أن التدريب / التركيب لا يتم توزيعه على العمال في الكتلة. هل من الضروري استخدام XGBoostPipeline للتوزيع على العمال؟

إذا لم يكن الأمر كذلك ، فهل تعلم لماذا لا يتم توزيع التدريب على العمال؟

تحديث
لقد جربت التدريب من خلال تعيين XGBoostEstimator كمرحلة في XGBoostPipeline لكن المشكلة استمرت. لا يتم توزيع التدريب على العمال عندما أقوم بتشغيله على الكتلة بينما يحدث مع النماذج الأخرى المدعومة من pyspark.

هل لاحظت هذا السلوك؟ كيف أتعامل معها؟

لقد قمت في الغالب بإعادة ترميز الغلاف لـ XGBoost 0.8 ، ولكن نظرًا لأن مجموعة العمل الخاصة بي لا تزال على 2.2 ، لا يمكنني اختبارها بسهولة في الوضع الموزع ، نظرًا لأن مجموعة Dockerized Spark 2.3 الخاصة بي لا تستطيع حتى تدريب نماذج Scala XGBoost الموزعة دون الحصول على مشاكل مفقودة في الموقع العشوائي .

أعتقد أن المشكلات التي يواجهها @ sagnik-rzt وغيرها ، مرتبطة بتكوين المجموعة أو بعض المشكلات الأعمق في Spark-Scala XGBoost.

هل أنت قادر على تدريب عارضة أزياء في Spark-Scala XGBoost؟

شكرًا thesuperzapper ، اعتقدت أنه تم التعامل مع المواقع العشوائية داخليًا ، أي أنه سيتم الاعتناء بها بشكل مستقل عن تكوين المجموعة. لكنني وجدت هذا التدرج المكدس لذلك سيتم تنفيذ تلك الاقتراحات.

هل يمكنك أيضًا مشاركة إصدار 0.8 ، إذا كان جاهزًا؟ يمكنني اختبار التوزيع على مجموعتي. لديها شرارة 2.3.1 و python 3.5.

بعد حفظ النموذج وتحميل الحصول على الخطأ التالي

IllegalArgumentException: فشل u'requirement: خطأ في تحميل البيانات الوصفية: اسم الفئة المتوقع org.apache.spark.ml.Pipeline ولكن تم العثور على اسم الفئة org.apache.spark.ml.PipelineModel '

هل يمكنك المساعدة في هذا. شكرا

import pyspark
from pyspark.sql.session import SparkSession
from pyspark.sql.types import *
from pyspark.ml.feature import StringIndexer, VectorAssembler
from pyspark.ml import Pipeline
from pyspark.sql.functions import col

spark.sparkContext.addPyFile("sparkxgb.zip")
from sparkxgb import XGBoostEstimator
schema = StructType(
  [StructField("PassengerId", DoubleType()),
    StructField("Survival", DoubleType()),
    StructField("Pclass", DoubleType()),
    StructField("Name", StringType()),
    StructField("Sex", StringType()),
    StructField("Age", DoubleType()),
    StructField("SibSp", DoubleType()),
    StructField("Parch", DoubleType()),
    StructField("Ticket", StringType()),
    StructField("Fare", DoubleType()),
    StructField("Cabin", StringType()),
    StructField("Embarked", StringType())
  ])

df_raw = spark\
  .read\
  .option("header", "true")\
  .schema(schema)\
  .csv("train.csv")

 df = df_raw.na.fill(0)

 sexIndexer = StringIndexer()\
  .setInputCol("Sex")\
  .setOutputCol("SexIndex")\
  .setHandleInvalid("keep")

cabinIndexer = StringIndexer()\
  .setInputCol("Cabin")\
  .setOutputCol("CabinIndex")\
  .setHandleInvalid("keep")

embarkedIndexer = StringIndexer()\
  .setInputCol("Embarked")\
  .setOutputCol("EmbarkedIndex")\
  .setHandleInvalid("keep")

vectorAssembler = VectorAssembler()\
  .setInputCols(["Pclass", "SexIndex", "Age", "SibSp", "Parch", "Fare", "CabinIndex", "EmbarkedIndex"])\
  .setOutputCol("features")
xgboost = XGBoostEstimator(
    featuresCol="features", 
    labelCol="Survival", 
    predictionCol="prediction"
)

pipeline = Pipeline().setStages([sexIndexer, cabinIndexer, embarkedIndexer, vectorAssembler, xgboost])
model = pipeline.fit(df)
model.transform(df).select(col("PassengerId"), col("prediction")).show()

model.save("model_xgboost")
loadedModel = Pipeline.load("model_xgboost")


IllegalArgumentException: u'requirement failed: Error loading metadata: Expected class name org.apache.spark.ml.Pipeline but found class name org.apache.spark.ml.PipelineModel'


#predict2 = loadedModel.transform(df)

حاولت الخيار التالي

from pyspark.ml import PipelineModel
#model.save("model_xgboost")
loadedModel = PipelineModel.load("model_xgboost")

الحصول على الخطأ التالي

لا توجد وحدة باسم ml.dmlc.xgboost4j.scala.spark

رابط تنزيل DEV: sparkxgb.zip

سيعمل هذا الإصدار مع XGBoost-0.8 ، لكن من فضلك لا تستخدمه لأي شيء آخر غير الاختبار ، أو المساهمة في هذا الموضوع ، حيث ستتغير الأشياء.
(لاحظ أيضًا: لقد قمت بإزالة جميع النسخ الخلفية لـ Spark 2.2 ، لذلك هذا يدعم Spark 2.3 فقط)

المشكلة الرئيسية التي أدركها مع هذا الإصدار ، هي أن نماذج التصنيف لن يتم إعادة تحميلها بعد حفظها ، مما يعطي الخطأ: TypeError: 'JavaPackage' object is not callable . ومع ذلك ، من الغريب أن XGBoostPipelineModel يعمل بشكل جيد مع مرحلة تصنيف XGBoost. هذا يقودني إلى الاعتقاد بأنها مشكلة من جانبي ، هل يمكن لشخص ما التحقق مما إذا كانت قراءة نماذج التصنيف مناسبة لهم؟

بغض النظر ، أنا أحاول تنفيذ DefaultParamsWritable بشكل صحيح ، والذي من شأنه أن يزيل الحاجة إلى XGBoostPipeline المخصص ، والذي سيكون أسهل بكثير للحفاظ عليه على المدى الطويل ، لذلك يجب أن تصبح مشكلة القراءة / الكتابة غير ذات صلة على أي حال. (قد يسمح هذا أيضًا بالمثابرة على CrossValidator للعمل)

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات