我正在尝试基于日志文件构建决策树。某些特征集很大,包含数千个唯一值。我试图在Java中使用新的管道和数据框惯用法。我为每个分类特征列构建了几个StringIndexer管道阶段。然后我使用VectorAssembler创建一个特征向量。在VectorAssembler阶段之后,结果数据框看起来对我来说非常完美。我的管道大致如下所示:
StringIndexer-> StringIndexer-> StringIndexer->VectorAssembler->DecisionTreeClassifier
然而,我收到了以下错误:
决策树要求maxBins(= 32)至少要大于或等于每个分类特征的值数,但分类特征5有49个值。考虑移除这个及其他具有大量值的分类特征,或者添加更多训练示例。
我可以通过使用Normalizer来解决这个问题,但这样生成的决策树对于我的需求来说是不可用的,因为我需要生成具有原始特征值的DSL决策树。我无法手动设置maxBins,因为整个管道是同时执行的。我希望结果决策树具有StringIndexer生成的值(例如,特征5 <= 132)。另外,虽然不太重要,但我希望能够为特征指定自己的名称(例如,不是‘特征5’,而是‘域名’)。
回答:
决策树算法使用单个maxBins值来决定进行的分割数。默认值是(=32)。maxBins应该大于或等于分类特征的最大类别数。由于你的特征5有49个不同的值,你需要将maxBins增加到49或更高。
决策树算法有几个超参数,通过调整这些参数以适应你的数据可以提高准确性。你可以使用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])