管道中的Spark MLLib 2.0分类function

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

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

但是我收到以下错误:

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

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

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

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

这是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])