apache-spark - 在 Java 中为 Apache Spark MLlib 构建 LabeledPoint of Features 的最佳方法

标签 apache-spark machine-learning apache-spark-mllib

我正在准备包含 Id(标签)和关键字(功能)的数据,以将它们传递给 Java 中的 MLlib 算法。我的关键字是用逗号分隔的字符串。我的目标是使用多类分类算法来预测 id。问题是,如何构建 Labeledpoint Vector?

我尝试了下面的这种转换,但精度很低(30%)。值得一提的是,当我使用自己的 KNN 分类代码(纯 java)时,我获得了超过 70% 的准确率。

功能转换:

        Tokenizer tokenizer = new Tokenizer().setInputCol("keywords")
                .setOutputCol("words");

        DataFrame wordsData = tokenizer.transform(df);
        wordsData.show();
        int numFeatures = 35;
        HashingTF hashingTF = new HashingTF().setInputCol("words")
                .setOutputCol("rawFeatures").setNumFeatures(numFeatures);
        DataFrame featurizedData = hashingTF.transform(wordsData);
        //featurizedData.show();
        featurizedData.cache();
        IDF idf = new IDF().setInputCol("rawFeatures").setOutputCol(
                "features");
        IDFModel idfModel = idf.fit(featurizedData);
        DataFrame rescaledData = idfModel.transform(featurizedData);
        JavaRDD<Row> rescaledRDD = rescaledData.select("features", "id")
                .toJavaRDD();
        JavaRDD<LabeledPoint> test = rescaledRDD
                .map(new MakeLabledPointRDD());

这是使用稀疏向量将 RDD 行集中到标记点的正确方法吗?我需要统计关键字并使用 CountVectorizer ?否则构建它的最佳方法是什么?

public static class MakeLabledPointRDD implements
        Function<Row, LabeledPoint> {

    @Override
    public LabeledPoint call(Row r) throws Exception {
        Vector features = r.getAs(0); //keywords in RDD
        Integer str = r.getInt(1); //id in RDD
        Double label = (double) str;
        LabeledPoint lp = new LabeledPoint(label, features);
        return lp;
    }
}

最佳答案

您的MakeLabledPointRDD似乎是正确的。然而,TFIDF 转换似乎是一种在行级别工作的本地转换。这意味着您获得的权重实际上适用于身份的每个实例。

您需要做的就是在创建 TFIDF 向量之前按 ID 对行进行分组,即您的 df 变量应仅包含一行专业人士ID

关于apache-spark - 在 Java 中为 Apache Spark MLlib 构建 LabeledPoint of Features 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37341054/

相关文章:

apache-spark - 如何使用 CrossValidator 获得精确度/召回率,以使用 Spark 训练 NaiveBayes 模型

machine-learning - 如何使用 tf.metrics.accuracy?

scala - 如何更新现有 SparkSession 实例或在 spark-shell 中创建一个新实例?

hadoop - 从 Oozie (CDH) 运行 Spark2

hadoop - 使用单台机器时发生Spark RDD联合OOM错误

Python scikit svm "ValueError: X has 62 features per sample; expecting 337"

r - 如何使用像素矩阵将多个图像定位在同一个绘图上

machine-learning - PySpark 中的 ParamGridBuilder 不适用于 LinearRegressionSGD

scala - 如何加载保存的 KMeans 模型(在 ML 管道中)?

apache-spark - 如何使用 Spark 决策树调整分类阈值