运行CrossValidator时出现堆栈溢出错误o2750.cache。有人知道是什么问题吗?

2024-05-16 11:18:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用管道和交叉验证程序在我的数据集上运行机器学习分类器。在最后一步,当我尝试拟合模型时,我得到了以下错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/hdp/2.6.5.1175-1/spark2/python/pyspark/ml/base.py", line 132, in fit
    return self._fit(dataset)
  File "/usr/hdp/2.6.5.1175-1/spark2/python/pyspark/ml/tuning.py", line 288, in _fit
    validation = df.filter(condition).cache()
  File "/usr/hdp/2.6.5.1175-1/spark2/python/pyspark/sql/dataframe.py", line 538, in cache
    self._jdf.cache()
  File "/usr/hdp/2.6.5.1175-1/spark2/python/lib/py4j-0.10.6-src.zip/py4j/java_gateway.py", line 1160, in __call__
  File "/usr/hdp/2.6.5.1175-1/spark2/python/pyspark/sql/utils.py", line 63, in deco
    return f(*a, **kw)
  File "/usr/hdp/2.6.5.1175-1/spark2/python/lib/py4j-0.10.6-src.zip/py4j/protocol.py", line 320, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o2750.cache.
: java.lang.StackOverflowError
        at org.apache.spark.sql.catalyst.plans.logical.statsEstimation.SizeInBytesOnlyStatsPlanVisitor$.visitUnaryNode(SizeInBytesOnlyStatsPlanVisitor.scala:36)
        at org.apache.spark.sql.catalyst.plans.logical.statsEstimation.SizeInBytesOnlyStatsPlanVisitor$.visitProject(SizeInBytesOnlyStatsPlanVisitor.scala:136)
        at org.apache.spark.sql.catalyst.plans.logical.statsEstimation.SizeInBytesOnlyStatsPlanVisitor$.visitProject(SizeInBytesOnlyStatsPlanVisitor.scala:27)
        at org.apache.spark.sql.catalyst.plans.logical.LogicalPlanVisitor$class.visit(LogicalPlanVisitor.scala:37)
        at org.apache.spark.sql.catalyst.plans.logical.statsEstimation.SizeInBytesOnlyStatsPlanVisitor$.visit(SizeInBytesOnlyStatsPlanVisitor.scala:27)
        at org.apache.spark.sql.catalyst.plans.logical.statsEstimation.LogicalPlanStats$$anonfun$stats$1.apply(LogicalPlanStats.scala:37)
        at org.apache.spark.sql.catalyst.plans.logical.statsEstimation.LogicalPlanStats$$anonfun$stats$1.apply(LogicalPlanStats.scala:33)
        at scala.Option.getOrElse(Option.scala:121)

我有一个510054条记录的数据集。它有大约1900根柱子。我已将其清理到326列,并删除了N/A值。 首先,我使用了一个简单的DecisionTreeClassifier(带管道和不带管道)来预测目标,它工作得非常好。然而,当我使用交叉验证程序时,我得到了上面的错误

起初,我在齐柏林飞艇笔记本上运行代码。我认为这是一个记忆问题。然后,我使用pyspark shell和以下参数运行它 遗嘱执行人人数3 执行器存储器 执行器核心1

这是我的密码

读取数据集

df1=spark.read.csv("/user/mustafa/data.csv",header=True,inferSchema=True)

创建向量汇编程序

from pyspark.ml.feature import VectorAssembler
assembler=VectorAssembler(inputCols=new_columns,outputCol="features")

创建决策树分类器

from pyspark.ml.classification import DecisionTreeClassifier
decision_tree=DecisionTreeClassifier()

拆分数据

df_train,df_test = df1.randomSplit([0.8, 0.2],seed=12345)

创建管道

from pyspark.ml import Pipeline
pipeline=Pipeline(stages=[assembler,decision_tree])

设置评估器

from pyspark.ml.evaluation import MulticlassClassificationEvaluator
evaluator=MulticlassClassificationEvaluator(metricName="accuracy")

设置交叉验证程序

from pyspark.ml.tuning import CrossValidator,ParamGridBuilder
paramGrid=ParamGridBuilder().addGrid(decision_tree.maxDepth,[3,5]).build()
crossVal=CrossValidator(estimator=pipeline,estimatorParamMaps=paramGrid,evaluator=evaluator,numFolds=2)

拟合模型(这是发生错误的地方)

cvModel=crossVal.fit(df_train)

请帮助诊断问题!谢谢


Tags: inorgsqlapachelinemlatspark