如何将 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 的任何计算都很简单。
希望对您有所帮助!!
您好,我正在尝试使用 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 的任何计算都很简单。
希望对您有所帮助!!