2016-08-04 40 views
1

我试图根据日志文件构建决策树。一些功能集很大,包含数千个唯一值。我试图在Java中使用管道和数据框架的新成语。我已经为每个分类特征列构建了一个包含多个StringIndexer流水线阶段的流水线。然后我使用VectorAssembler创建一个特征向量。在VectorAssembler阶段之后,结果数据框对我来说非常完美。我的管道看起来几乎相当于Spark MLLib 2.0管道中的分类特征

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

不过,我得到以下错误:

DecisionTree requires maxBins (= 32) to be at least as large as the number of values in each categorical feature, but categorical feature 5 has 49 values. Considering remove this and other categorical features with a large number of values, or add more training examples.

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

回答

0

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]) 
+0

原来我需要两两件事:与设置为一个值MaxCategories大于的绝对最大数量的计数一个VectorIndexer功能和DecisionTreeClassifier的maxBins设置为大于最大分类要素数的值。由于我的所有功能都是分类的,因此我最初指定了MAX_INT,它产生了一个警告“DecisionTreeMetadata:DecisionTree正在减少maxBins ...”。将这两个值都设置为DataFrame中的采样数就足够了。 – Mike

+0

只要您的功能都是绝对的,您可以使用VectorIndexer安全使用,但如果您的培训具有延续功能,请注意。 VectorIndexer使连续和分类之间的选择基于maxCategories参数。它可以将连续的特征转化为分类。如果此答案或任何其他人解决了您的问题,请将其标记为已接受。谢谢 – igorsf

+0

感谢您的跟进。 VectorIndexer实际上是一个错误。流水线由一系列字符串索引器组成,然后是矢量汇编器,最后是带有.setMaxBins调用的DecisionTreeClassifier。正如您已经正确指出的那样,如果我们有一个持续的功能,我们会遇到麻烦。我想知道别人怎么处理这个?很容易想到具有大量值的分类特征和具有相对较少数量的特征值的连续特征。 – Mike