0

我在其中一个大数据分析应用程序中使用带有Hadoop的Spark Mllib。 我有41个功能和一个标签的功能集。现在,在进行培训时,我想将我的功能与功能工程师混合匹配,并为我的场景找到最适合的最小功能集。使用具有许多功能的JavaRDD中的选择性功能

为此,我想在训练时选择在训练和测试模型准确性时使用哪些特征。

我这样做

JavaRDD<LabeledPoint>[] splits = data.randomSplit(new double[] { 0.5, 0.5 }); 
JavaRDD<LabeledPoint> trainingData = splits[0]; 
JavaRDD<LabeledPoint> testData = splits[1]; 

,然后再使用这些数据训练不同的模型。

modelLR = new LogisticRegressionWithLBFGS().setNumClasses(numClasses).run(trainingData.rdd()); 
modelRF = RandomForest.trainClassifier(trainingData, numClasses, categoricalFeaturesInfo, numTrees, featureSubsetStrategy, impurity, maxDepth, maxBins, seed); 
modelNB = NaiveBayes.train(trainingData.rdd(), 1.0); 
modelGBT = GradientBoostedTrees.train(trainingData, boostingStrategy); 
modelDT = DecisionTree.trainClassifier(trainingData, numClasses, categoricalFeaturesInfo, impurity, maxDepth, maxBins); 

现在,在使用数据集训练模型之前,我希望筛选我想要使用的选择性特征的数据。有人可以建议我使用JavaRDD<LabeledPoint>吗?

如果需要更多的细节,请随时询问。

回答

0

没关系。我自己想出了答案。

对于有兴趣做这个事情的人,我做了这样的事情。

public static JavaRDD<LabeledPoint> filterData(JavaRDD<LabeledPoint> data, String filterString) { 
     return data.map(new Function<LabeledPoint, LabeledPoint>() { 
      @Override 
      public LabeledPoint call(LabeledPoint point) throws Exception { 
       double label = point.label(); 
       double[] features = point.features().toArray(); 
       String[] featuresInUse = filterString.split(","); 
       double[] filteredFeatures = new double[featuresInUse.length]; 
       for (int i = 0; i < featuresInUse.length; i++) { 
        filteredFeatures[i] = features[Integer.parseInt(VectorizationProperties.getProperty(featuresInUse[i]))]; 
       } 
       LabeledPoint newPoint = new LabeledPoint(label, Vectors.dense(filteredFeatures)); 
       System.out.println(newPoint); 
       return newPoint; 
      } 
     }); 
    } 

这将筛选每条记录并返回筛选的JavaRDD。

请随时询问需要进一步了解的任何细节。