Как получить ответ 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, и вам решать сопоставить это с вашими строковыми значениями.