Java Spark MLLib 2.0分类功能正在开发中

Java Spark MLLib 2.0分类功能正在开发中,java,machine-learning,apache-spark-mllib,Java,Machine Learning,Apache Spark Mllib,我正试图建立一个基于日志文件的决策树。某些要素集很大,包含数千个唯一值。我试图在Java中使用新的管道和数据帧习惯用法。我已经为每个分类功能列构建了一个带有几个StringIndexer管道阶段的管道。然后我使用矢量汇编程序创建一个特征矢量。在VectorAssembler阶段之后,生成的数据帧在我看来非常完美。我的管道看起来像 StringIndexer->StringIndexer->StringIndexer->VectorAssembler->DecisionTreeClassifier

我正试图建立一个基于日志文件的决策树。某些要素集很大,包含数千个唯一值。我试图在Java中使用新的管道和数据帧习惯用法。我已经为每个分类功能列构建了一个带有几个StringIndexer管道阶段的管道。然后我使用矢量汇编程序创建一个特征矢量。在VectorAssembler阶段之后,生成的数据帧在我看来非常完美。我的管道看起来像

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

但是,我得到以下错误:

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


我可以通过使用规范化器来解决这个问题,但是生成的决策树不能满足我的需要,因为我需要用原始特征值生成DSL决策树。我无法手动设置maxBins,因为整个管道是一起执行的。我希望生成的决策树具有StringIndexer生成的值(例如,功能5决策树算法采用单个maxBins值来决定要采用的拆分数量。默认值为(=32).maxBins应大于或等于分类功能的最大类别数。由于功能5具有49个不同的值,因此需要将maxBins增加到49个或更大


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

下面是python测试3个maxbin的示例[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])

事实证明,我需要两样东西:一个向量索引器,其MaxCategories设置为大于最大分类特征数的值,以及DecisionTreeClassifier的maxBins设置为大于最大分类特征数的值。由于我所有的特征都是分类的,我最初指定了MAX_INT,这生成警告“DecisionTreeMetadata:DecisionTree减少maxBins…”。将这两个值都设置为数据帧中的样本数就足够了。只要您的功能都是分类的,使用VectorIndexer是安全的,但如果您的培训具有连续功能,请小心。VectorIndexer根据maxCategories参数在连续和分类之间进行选择。它可以在如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。感谢您的跟进。VectorIndexer实际上是一个错误。管道由一系列字符串索引器组成,后面是向量汇编程序,最后是带有.setMaxBins调用的DecisionTreeClassifier。正如您正确指出的那样,如果我们在混合中有一个连续的特性,我们会遇到麻烦。我想知道其他人如何处理这个问题?很容易想象有一个包含大量值的分类特性和一个包含相对较少的特征值的连续特性。我想一个热编码器就是你想要的。使用这个,你可以指定y的列你想把它当作绝对的。