管道

时间:2016-08-04 12:47:41

标签: java machine-learning apache-spark-mllib

我正在尝试基于日志文件构建决策树。某些功能集很大,包含数千个唯一值。我正在尝试在Java中使用管道和数据框架的新习惯用法。我为每个分类功能列构建了一个包含多个StringIndexer管道阶段的管道。然后我使用VectorAssembler创建一个特征向量。在VectorAssembler阶段之后,结果数据帧对我来说是完美的。我的管道看起来很像

StringIndexer-> StringIndexer-> StringIndexer-> VectorAssembler-> DecisionTreeClassifier

但是我收到以下错误:

  

DecisionTree要求maxBins(= 32)至少与每个分类要素中的值数一样大,但分类要素5有49个值。考虑使用大量值删除此分类和其他分类功能,或添加更多培训示例。

我可以通过使用规范化器解决此问题,但随后生成的决策树无法满足我的需求,因为我需要生成具有原始特征值的DSL决策树。我无法手动设置maxBins,因为整个管道一起执行。我希望结果决策树具有StringIndexer生成的值(例如,特征5 <= 132)。此外,但不太重要,我希望能够为功能指定我自己的名称(例如,而不是'功能5',说'域')

1 个答案:

答案 0 :(得分:1)

DecisionTree算法使用单个maxBins值来决定要执行的拆分数。默认值为(= 32)。 maxBins应大于或等于分类要素的最大类别数。由于您的功能5有49个不同的值,因此您需要将maxBins增加到49或更大。

DecisionTree算法有几个超参数,将它们调整到您的数据可以提高准确性。您可以使用Spark的交叉验证框架进行此调整,该框架会自动测试超参数网格并选择最佳。

以下是python测试中的示例3 maxBins [49,52,55]

dt = DecisionTreeClassifier(maxDepth=2, labelCol="indexed")
paramGrid = ParamGridBuilder().addGrid(dt.maxBins, [49, 52, 55]).addGrid(dt.maxDepth, [4, 6, 8]).addGrid(rf.impurity, ["entropy", "gini"]).build()
pipeline = Pipeline(stages=[labelIndexer, typeIndexer, assembler, dt])