2015-04-21 61 views
0

我想用Weka打印J48分類器的混淆矩陣。我得到的輸出是每個映射器的矩陣數。運行的映射器數量設置爲兩個。爲了得到從減速器只有一個彙總值

這個類是Weka分類器輸出的縮減器它給出了來自映射器的一串交叉驗證的數據塊,它的工作是將數據聚合成一個解決方案。

public void reduce(Text key, Iterable<AggregateableEvaluation> values, Context context) throws IOException, InterruptedException {  
     int sum = 0;      
     // loop through each of the values and "aggregate" 
     // which basically means to consolidate the values 
     for (AggregateableEvaluation val : values) { 
      System.out.println("IN THE REDUCER!"); 

      // The first time through, give aggEval a value 
      if (sum == 0) { 
       try { 
        aggEval = val; 
       } 
       catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      else { 
       // combine the values 
       aggEval.aggregate(val); 
      } 

      try { 
       // This is what is taken from the mapper to be aggregated 
       //System.out.println("This is the map result"); 
       //System.out.println(aggEval.toMatrixString()); 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      }      

      sum += 1; 
     }   
     try { 
      System.out.println("This is reduce matrix"); 
      System.out.println(aggEval.toMatrixString()); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
+1

不要得到它。什麼是問題? – Zelldon

+0

@Zelldon我想打印一個混淆矩陣,即weka輸出,但我得到很多矩陣......我不確定,但它的像reducer正在執行許多次。 – Amogh

回答

0

我不知道什麼WEKA,但與「正常」的MapReduce,您減少函數應該是這樣的形式:https://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapreduce/Reducer.html

public class IntSumReducer<Key> extends Reducer<Key,IntWritable, 
               Key,IntWritable> { 
    private IntWritable result = new IntWritable(); 

    public void reduce(Key key, Iterable<IntWritable> values, 
         Context context) throws IOException, InterruptedException { 
    int sum = 0; 
    for (IntWritable val : values) { 
     sum += val.get(); 
    } 
    result.set(sum); 
    context.write(key, result); 
    } 
} 

所以基本上,的減速方法被調用一次爲,每個您的密鑰爲。您將獲得映射到該特定鍵的所有值,您應該將這些值集中在一起,然後完成後請執行context.write(key, aggEval)以從縮小方法發出結果

+0

我試着你說的,但問題是,我需要使用AggregateableEvaluation而不是IntWritable,所以context.write不允許(key,aggEval)。它期望鍵和IntWritable類型 – Amogh

+0

Iterable <>中的類型不必與上下文中發出的類型匹配。所以要麼你必須將你的AggregateableEvaluation聚合到IntWritable中,要麼你需要改變reduce階段發出的類型。你會注意到Reducer的形式是。 V2是你正在發射的類型。 – FuriousGeorge

+0

事情是我需要輸出矩陣類型的評估類toMatrixString產生一個混淆矩陣..所以我可以不能聚合成IntWritable的權利?並在任何其他類型的發射它不會給矩陣正確的? – Amogh