2016-05-20 5 views
1

私は、MLlibアルゴリズム(Java)に渡すためのId(ラベル)とキーワード(機能)を含むデータを準備しています。私のキーワードはコンマで区切られた文字列です。私の目標は、マルチクラス分類アルゴリズムを使ってIDを予測することです。問題は、Labeledpoint Vectorをどのように構築するのですか?JavaでApache Spark MLlibのLabeledPoint機能を構築する最善の方法

私はこの変形を試みましたが、私は低いパーケージ(30%)を得ています。私自身のKNN分類コード(plain 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()); 

これはスパースベクトルでlabeledpointするRDD行をcenvertための正しい方法ですか?キーワードを数えて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; 
    } 
} 

答えて

0

あなたMakeLabledPointRDDは正しいように思えます。しかし、TFIDFのトランスフュージョンは、行レベルで動作するローカルなようです。これは、取得している重みが、実際にアイデンティティの各インスタンスについて意味されていることを意味します。

あなたがやらなければならないことは、つまり、あなたのDF変数が一列のみのプロIDが含まれている必要があり、TFIDFベクトルを作成する前に、グループにIDによって行です。

関連する問題