如何将 Spark MLlib RandomForestModel.predict 响应作为文本值 YES/NO?

How to get Spark MLlib RandomForestModel.predict response as text value YES/NO?

您好,我正在尝试使用 Apache Spark MLLib 实现 RandomForest 算法。我有 csv 格式的数据集,具有以下特征

DayOfWeek(int),AlertType(String),Application(String),Router(String),Symptom(String),Action(String)
0,Network1,App1,Router1,Not reachable,YES
0,Network1,App2,Router5,Not reachable,NO

我想使用 RandomForest MLlib 并对最后一个字段 Action 进行预测,我希望响应为 YES/NO。

我正在按照 github 中的代码创建 RandomForest 模型。由于我拥有除一个 int 特征之外的所有分类特征,我使用以下代码将它们转换为 JavaRDD<LabeledPoint> 请让我知道,以防它错了

// Load and parse the data file.
        JavaRDD<String> data = jsc.textFile("/tmp/xyz/data/training-dataset.csv");

       // I have 14 features so giving 14 as arg to the following
        final HashingTF tf = new HashingTF(14);

        // Create LabeledPoint datasets for Actionable and nonactionable
        JavaRDD<LabeledPoint> labledData = data.map(new Function<String, LabeledPoint>() {
            @Override public LabeledPoint call(String alert) {
                List<String> featureList = Arrays.asList(alert.trim().split(","));
                String actionType = featureList.get(featureList.size() - 1).toLowerCase();
                return new LabeledPoint(actionType.equals("YES")? 1 : 0, tf.transform(featureList));
            }
        });

与上面类似,我创建了测试数据并在以下代码中使用它来进行预测

JavaPairRDD<Double, Double> predictionAndLabel =
        testData.mapToPair(new PairFunction<LabeledPoint, Double, Double>() {
          @Override
          public Tuple2<Double, Double> call(LabeledPoint p) {
            return new Tuple2<Double, Double>(model.predict(p.features()), p.label());
          }
        });

如何根据我的最后一个字段进行预测 操作和预测应该是 YES/NO?当前预测方法 returns double 无法理解我该如何实现它?另外,我是否按照分类特征的正确方法进入 LabledPoint 请指导我是机器学习和 Spark MLlib 的新手。

您正朝着正确的方向前进,并且您已经成功地训练了一个很棒的模型。

对于二进制分类,它将 return 0.0 或 1.0,由您将其映射回您的字符串值。

我对 scala 版本比较熟悉,但我会尽力提供帮助。

您需要将目标变量 (Action) 和所有分类特征映射到从 0 开始的级别,例如 0,1,2,3... 例如 router1, router2, ... router5 到 0,1, 2...4。与您的目标变量相同,我认为这是您实际映射的唯一变量,yes/no 到 1/0(我不确定您的 tf.transform(featureList) 实际在做什么)。

完成此操作后,您可以训练您的 Randomforest 分类器,指定分类特征的地图。基本上它需要你告诉哪些功能是分类的以及它们有多少级别,这是 Scala 版本,但你可以轻松地将其转换为 java:

val categoricalFeaturesInfo = Map[Int, Int]((2,2),(3,5))

这基本上是说在您的功能列表中,第 3 个 (2) 有 2 个级别 (2,2),第 4 个 (3) 有 5 个级别 (3,5)。其余的被认为是双打。

现在您在训练分类器时将 categoricalFeaturesInfo 与其他参数一起传递为:

val modelRF = RandomForest.trainClassifier(trainingData, numClasses, categoricalFeaturesInfo,numTrees, featureSubsetStrategy, impurity, maxDepth, maxBins)

现在,当您需要对其进行评估时,预测函数将 return 双精度 0,1,您可以使用它来计算准确度、精确度或任何所需的指标。

如果您有一个 testData,您在其中进行了与之前相同的转换,这就是示例(再次抱歉 scala):

val predictionAndLabels = testData.map { point =>
  val prediction = modelRF.predict(point.features)
  (point.label, prediction)
} 

这里你的结果很清楚,标签为 1/0,预测值也是 1/0,Accuracy、Precision 和 Recall 的任何计算都很简单。

希望对您有所帮助!!