Spark MLLib 2.0 管道中的分类特征

我正在尝试基于日志文件构建决策树。某些特征集很大,包含数千个唯一值。我试图在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])

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注