Я готовлю данные, содержащие идентификаторы (ярлыки) и ключевые слова (функции), чтобы передать их алгоритмам MLlib в Java. Мои ключевые слова - это строки, разделенные запятыми. Моя цель - использовать алгоритмы классификации многоклассов для прогнозирования id. Вопрос в том, как мне создать вектор Labeledpoint?Лучший способ создания LabeledPoint для Apache Spark MLlib в Java
Я пробовал это преобразование ниже, но я получаю низкий уровень (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());
Это правильный способ cenvert в ряд RDD к labeledpoint с редким вектором? Нужно ли подсчитывать ключевые слова и использовать CountVectorizer? Else Каков наилучший способ его создания?
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;
}
}