Как получить ответ Spark MLlib RandomForestModel.predict в виде текстового значения ДА / НЕТ?

Привет я пытаюсь реализовать алгоритм RandomForest с использованием Apache Spark MLLib. У меня есть набор данных в формате 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());
          }
        });

Как получить прогноз на основе моего последнего поля Действие и прогноз должны быть представлены как ДА / НЕТ? Текущий метод предсказания возвращает double, не в состоянии понять, как мне его реализовать? Также я придерживаюсь правильного подхода категориальной особенности в LabledPoint пожалуйста, руководство, я новичок в машинном обучении и Spark MLlib.

2 ответа

Решение

Я более знаком с версией scala, но постараюсь помочь.

Вам необходимо отобразить целевую переменную (Action) и все категориальные функции на уровни, начинающиеся с 0, например 0,1,2,3... Например router1, router2, ... router5 на 0,1,2...4, То же самое с вашей целевой переменной, которая, я думаю, была единственной, которую вы на самом деле отобразили, да / нет до 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). Остальные считаются двойниками.

Теперь вы передаете categoryoricalFeaturesInfo при обучении классификатора вместе с другими параметрами как:

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

Теперь, когда вам нужно оценить его, функция прогнозирования вернет двойной 0,1, и вы можете использовать его для вычисления точности, точности или любой другой необходимой метрики.

Это пример (извините, scala снова), если у вас есть testData, где вы сделали те же преобразования, что и раньше:

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

Здесь ваши результаты ясны, метка 1/0 и прогнозируемое значение также 1/0, любые вычисления точности, точности и повторного вызова просты.

Я надеюсь, что это помогает!!

Вы движетесь в правильном направлении, и вам уже удалось обучить великолепную модель.

Для двоичной классификации он вернет либо 0.0, либо 1.0, и вам решать сопоставить это с вашими строковыми значениями.

Другие вопросы по тегам