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的新手
# 1 楼答案
我对scala版本比较熟悉,但我会尽力提供帮助
您需要将目标变量(操作)和所有分类功能映射到从0开始的级别,如0,1,2,3。。。例如router1、router2。。。路由5到0,1,2。。。4.与您的目标变量相同,我认为它是您实际映射的唯一变量,是/否为1/0(我不确定您的
tf.transform(featureList)
实际在做什么)完成此操作后,可以训练Randomforest分类器,指定分类特征的映射。基本上,它需要您知道哪些功能是分类的,它们有多少级别,这是scala版本,但您可以轻松地将其转换为java:
这基本上是说,在你的功能列表中,第三个(2)有2个级别(2,2),第四个(3)有5个级别(3,5)。其余的被认为是双打
现在,在将分类器与其他参数一起训练时,传递categoricalFeaturesInfo,如下所示:
现在,当您需要计算它时,predict函数将返回一个双精度0,1,您可以使用它来计算精度、精度或任何需要的度量
如果您有一个testData,您在其中执行了与以前相同的转换,那么下面就是一个示例(再次抱歉scala):
这里你的结果是清楚的,标签是1/0,预测值也是1/0,准确度、精密度和召回率的任何计算都很简单
我希望有帮助
# 2 楼答案
你正朝着正确的方向前进,你已经成功地训练了一个很棒的模型
对于二进制分类,它将返回0.0或1.0,由您将其映射回字符串值