有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何获取Spark MLlib模型。将响应预测为文本值是/否?

嗨,我正在尝试使用ApacheSarkMLLIB实现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并对最后一次野外行动进行预测,我希望响应为是/否

我遵循来自github的代码来创建随机森林模型。由于我有所有的分类功能,除了一个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));
            }
        });

类似地,上面我创建了testdata,并在下面的代码中使用它来进行预测

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());
          }
        });

我如何根据上一次现场行动进行预测,预测结果应为是/否?当前的predict方法返回double无法理解如何实现它?另外,我是否遵循分类特征进入LabledPoint的正确方法请指导我是机器学习和Spark MLlib的新手


共 (2) 个答案

  1. # 1 楼答案

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

    您需要将目标变量(操作)和所有分类功能映射到从0开始的级别,如0,1,2,3。。。例如router1、router2。。。路由5到0,1,2。。。4.与您的目标变量相同,我认为它是您实际映射的唯一变量,是/否为1/0(我不确定您的tf.transform(featureList)实际在做什么)

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

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

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

    现在,在将分类器与其他参数一起训练时,传递categoricalFeaturesInfo,如下所示:

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

    现在,当您需要计算它时,predict函数将返回一个双精度0,1,您可以使用它来计算精度、精度或任何需要的度量

    如果您有一个testData,您在其中执行了与以前相同的转换,那么下面就是一个示例(再次抱歉scala):

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

    这里你的结果是清楚的,标签是1/0,预测值也是1/0,准确度、精密度和召回率的任何计算都很简单

    我希望有帮助

  2. # 2 楼答案

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

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