2016-05-20 2 views
1

Я готовлю данные, содержащие идентификаторы (ярлыки) и ключевые слова (функции), чтобы передать их алгоритмам 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; 
    } 
} 

ответ

0

Ваш MakeLabledPointRDD кажется правильным. Однако трансформация TFIDF кажется локальной, которая работает на уровне строк. Это означает, что веса, которые вы получаете, на самом деле предназначены для каждого экземпляра личности.

Все, что вам нужно сделать, это сгруппировать строки по ID перед созданием TFIDF векторов, то есть ваш ДФ переменная должна содержать только одну строку про ID.

Смежные вопросы