0

2 つの列を持つデータフレームである XGBoost モデルのトレーニングに成功しましtrainDFた。11kの 1 と 57M の 0 (不均衡なデータセット) があります。すべて正常に動作します。featureslabel

val udnersample = 0.1
// Undersampling of 0's -- choosing 10%
val training1 = output1.filter($"datestr" < end_period1 && 
    $"label" === 1)
val training0 = output1.filter($"datestr" < end_period1 && 
    $"label" === 0).sample(
    false, undersample)
val training = training0.unionAll(training1)
val traindDF = training.select("label", 
    "features").toDF("label", "features")}
val paramMap = List("eta" -> 0.05,
                    "max_depth" -> 6,
                    "objective" -> "binary:logistic").toMap
val num_trees = 400
val num_cores = 200
val XGBModel = XGBoost.trainWithDataFrame(trainDF, 
                                          paramMap, 
                                          num_trees, 
                                          num_cores, 
                                          useExternalMemory = true)

次に、ウィンドウ処理を使用して y ラベルを変更し、各グループで y ラベルをより早く予測できるようにします。

val sum_label = "sum_label"
val label_window_length = 19
val sliding_window_label =  Window.partitionBy("id").orderBy(
    asc("timestamp")).rowsBetween(0, label_window_length)

val training_source = output1.filter($"datestr" < 
    end_period1).withColumn(
    sum_label, sum($"label").over(sliding_window_label)).drop(
    "label").withColumnRenamed(sum_label, "label")
val training1 = training_source.filter(col("label") === 1)
val training0 = training_source.filter(col("label") === 0).sample(false, 0.099685)
val training = training0.unionAll(training1)
val traindDF = training.select("label", 
    "features").toDF("label", "features")}

結果には、57M の 0 と 214k の 1 があります (行数はほぼ同じですが)。の列にNAs がなく、タイプは stillです。その後、xgboost は失敗します。"label"trainDFdouble (nullable=true)

Name: ml.dmlc.xgboost4j.java.XGBoostError
Message: XGBoostModel training failed
StackTrace:   at ml.dmlc.xgboost4j.scala.spark.XGBoost$.postTrackerReturnProcessing(XGBoost.scala:316)
at ml.dmlc.xgboost4j.scala.spark.XGBoost$.trainWithRDD(XGBoost.scala:293)
at ml.dmlc.xgboost4j.scala.spark.XGBoostEstimator.train(XGBoostEstimator.scala:138)
at ml.dmlc.xgboost4j.scala.spark.XGBoostEstimator.train(XGBoostEstimator.scala:35)
at org.apache.spark.ml.Predictor.fit(Predictor.scala:118)
at ml.dmlc.xgboost4j.scala.spark.XGBoost$.trainWithDataFrame(XGBoost.scala:169)

必要に応じてログを含めることができます。私の混乱は、ウィンドウ機能を使用し、文字通り他の設定を変更しないと、XGB が失敗することです。これについて何か考えていただければ幸いです。

4

1 に答える 1

0

テーブルtraindDFをハイブに保存し、Spark にリロードすると問題が解決することがわかりました。

traindDF.write.mode("overwrite").saveAsTable("database.tablename")

次に、テーブルを簡単にロードできます。

val traindDF = spark.sql("""select * from database.tablename""")

このトリックは問題を解決しました。スパークウィンドウ機能は少し不安定で、結果をハイブテーブルに保存すると機能するようです。

これを行うより良い方法は、Spark の代わりにハイブでウィンドウ関数を使用することです。

于 2018-07-17T17:36:29.127 に答える