我正在使用Java中的Apache Spark MlLib版本2.11。我需要将RandomForestClassifier传递给分类和数字特征(字符串和数字)。
用于此类案例的最佳API是什么?一个例子非常有用。
修改
我尝试使用VectorIndexer,但它只接受数字,我无法理解如何将OneHotEncoder集成到它。另外,我不清楚如何判断哪些特征是分类的,哪些是数字特征。我在哪里需要设置所有可能的类别?
以下是我尝试的一些代码:
StructType schema = DataTypes.createStructType(new StructField[] {
new StructField("label", DataTypes.StringType, false, Metadata.empty()),
new StructField("features", new ArrayType(DataTypes.StringType, false), false,
Metadata.empty()),
});
JavaRDD<Row> rowRDD = trainingData.map(record -> {
List<String> values = new ArrayList<>();
for (String field : fields) {
values.add(record.get(field));
}
return RowFactory.create(record.get(Constants.GROUND_TRUTH), values.toArray(new String[0]));
});
Dataset<Row> trainingDataDataframe = spark.createDataFrame(rowRDD, schema);
StringIndexerModel labelIndexer = new StringIndexer()
.setInputCol("label")
.setOutputCol("indexedLabel")
.fit(trainingDataDataframe);
OneHotEncoder encoder = new OneHotEncoder()
.setInputCol("features")
.setOutputCol("featuresVec");
Dataset<Row> encoded = encoder.transform(trainingDataDataframe);
VectorIndexerModel featureIndexer = new VectorIndexer()
.setInputCol("featuresVec")
.setOutputCol("indexedFeatures")
.setMaxCategories(maxCategories)
.fit(encoded);
StringIndexerModel featureIndexer = new StringIndexer()
.setInputCol("features")
.setOutputCol("indexedFeatures")
.fit(encoded);
RandomForestClassifier rf = new RandomForestClassifier();
.setNumTrees(numTrees);
.setFeatureSubsetStrategy(featureSubsetStrategy);
.setImpurity(impurity);
.setMaxDepth(maxDepth);
.setMaxBins(maxBins);
.setSeed(seed)
.setLabelCol("indexedLabel")
.setFeaturesCol("indexedFeatures");
IndexToString labelConverter = new IndexToString()
.setInputCol("prediction")
.setOutputCol("predictedLabel")
.setLabels(labelIndexer.labels());
Pipeline pipeline = new Pipeline()
.setStages(new PipelineStage[] {labelIndexer, featureIndexer, rf, labelConverter});
PipelineModel model = pipeline.fit(encoded);
答案 0 :(得分:1)
我找到了解决问题的方法。我将Spark MlLib的版本升级到2.3.0。在这个版本中,他们包含了一个名为OneHotEncoderEstimator的类。它具有所有分类列(双打)的输入并输出相应的向量。
然后我使用VectorAssembler类将所有特征(数字和分类)统一到一个向量中,我将其发送到RandomForestClassifier。
答案 1 :(得分:0)
随机森林,如决策树,不需要One Hot编码来管理分类功能,它是本机管理分类功能的少数技术之一(也就是说,没有转换为二进制功能,即一个热编码的目的)。
同时处理连续和分类功能的最简单方法是正确设置maxCategories
参数。当您训练森林时,每个要素的不同值将被计算,而训练数据中具有少于maxCategories
个不同值的列将被视为分类。
您可以使用toDebugString
打印树/林,检查该功能是否属于分类。如果它是分类的,您会看到if feature0 in {0,1,2}
而不是通常的<=
。