gpt4 book ai didi

apache-spark - Spark MlLib (Java) 中的分类和数值特征

转载 作者:行者123 更新时间:2023-12-05 04:05:53 27 4
gpt4 key购买 nike

我正在使用 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);

最佳答案

随机森林与决策树一样,不需要 One Hot 编码来管理分类特征,它是少数可以原生管理分类特征的技术之一(即,无需转换为二进制特征,即一次热编码的目的)。

同时处理连续特征和分类特征的最简单方法是设置 maxCategories参数正确。当你训练你的森林时,每个特征的不同值将被计算,并且列小于 maxCategories训练数据中的不同值将被视为分类值。

您可以通过使用 toDebugString 打印树/森林来检查该特征是否是分类特征.如果它是绝对的,你会看到类似 if feature0 in {0,1,2} 的内容而不是通常的 <= .

关于apache-spark - Spark MlLib (Java) 中的分类和数值特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50600285/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com