我试图构建一个基于日志文件的决策树。有些特征集很大,包含数千个唯一值。我试图在Java中使用管道和数据框架的新成语。我为每个分类特性列构建了一个带有几个StringIndexer管道阶段的管道。然后我使用一个VectorAssembler来创建一个特征向量。在VectorAssembler阶段之后,得到的数据框架对我来说是完美的。我的管道看起来很像
StringIndexer-> StringIndexer-> StringIndexer->VectorAssembler->DecisionTreeClassifier
但是,我得到了以下错误:
DecisionTree要求maxBins (= 32)至少与每个分类特性中的值数目一样大,但是分类功能5有49个值。考虑删除具有大量值的此功能和其他分类功能,或添加更多的培训示例。
我可以通过使用规范化器来解决这个问题,但是生成的决策树不能满足我的需要,因为我需要生成一个带有原始特征值的DSL决策树。我不能手动设置maxBins,因为整个管道是一起执行的。我希望生成的决策树具有StringIndexer生成的值(例如特性5 <= 132)。此外,但不太重要的是,我希望能够为这些特性指定自己的名称(例如,代替“功能5”,比如“域”)。
发布于 2016-08-05 05:50:39
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])https://stackoverflow.com/questions/38767786
复制相似问题