Spark:setNumClasses() 用于 Multiclass LogisticRegressionModel 的标签子集

Spark : setNumClasses() for a subset of labels for Multiclass LogisticRegressionModel

我有一个 ID(标签)范围从 1 到 1040 的数据库。我正在使用多类逻辑回归来预测 ID。现在,如果我只想训练标签的一个子集,比如说从 800 到 810。当我设置 setNumClasses(11) - for 11 类 时出现错误。我必须始终将此方法设置为 类 的最大值,即 1040。这样训练模型将针对从 0 到 1040 的所有标签进行训练,这非常昂贵并且会占用大量资源。

我理解的对吗?如何通过给定 setNumClasses(count_of_classes).

仅针对一部分标签训练我的模型
final LogisticRegressionModel model = new LogisticRegressionWithLBFGS()
            .setNumClasses(811).run(train.rdd());

你不能这样做,你正在提供一组训练数据,它可能在 Spark 的梯度下降法中的某个地方失败了(不确定,因为你没有提供错误消息)。

此外,Spark 应该如何确定应该针对哪 800 个标签训练模型?

您应该做的是只过滤掉 RDD 中带有您要为其训练模型的标签的行。例如,假设您的标签是 0 到 1040 之间的值,而您只想训练 0 到 800 之间的标签,您可以这样做:

val actualTrainingRDD = train.filter( _.label < 801 )
final LogisticRegressionModel model = new LogisticRegressionWithLBFGS()
        .setNumClasses(801).run(train.rdd());

@Edit:是的,当然可以选择一组不同的标签,这只是一个例子,只需将过滤方法更改为:

train.filter( row => (row.label >= 790 && row.label < 801) )

这是 Scala,Java 闭包使用 ->,对吧?

根据预览答案的评论,我发现倒数第二条评论是主要问题。如果设置 setNumClasses(23) 意味着:在火车集中所有 类 应该在(0 到 22)的范围内。检查 (docs)。写成:

:: Experimental :: Set the number of possible outcomes for k classes classification problem in Multinomial Logistic Regression. By default, it is binary logistic regression so k will be set to 2.

这意味着,对于二元逻辑回归,二元 values/classes 是(0 和 1),因此 setNumClasses(2) 是默认值。

在训练集中,如果你有其他 类,比如 2,3,4,对于二元分类,它将不起作用。

建议的解决方案:如果您的训练集或子集包含 790 - 801 和 900 - 910 类,则将数据标准化或转换为(0 到 22)并将 23 作为 setNumClasses(23)。