weka介紹
參見
1)百度百科:http://baike.baidu.com/link?url=V9GKiFxiAoFkaUvPULJ7gK_xoEDnSfUNR1woed0YTmo20Wjo0wYo7uff4mq_wg3WzKhTZx4Ok0JFgtiYY19U4q
2)weka官網: http://www.cs.waikato.ac.nz/ml/weka/
簡單文本分類實現:
此處文本為已處理好的文本向量空間模型,關於文本特征提取主要是基於TF-IDF算法對已分詞文檔進行特征抽取,然后基於已提取特征將所有文檔表示為向量空間模型。
偷個小懶,就用weka自帶的*.arff格式文檔來做實現。
weka對於文本分類提供兩種方式,一種是批量式文本分類,即將所有數據一次性放入內存進行分類處理,這種情況對內存有所要求;為適應大量數據的分類實現,另一種增量式
文本分類,允許分批次導入數據至內存進行分類,這樣就避免了因數據集過大而內存不足的問題。具體實現如下:
1)采用增量式朴素貝葉斯算法進行分類
注:weka中所有增量式分類器都實現了UpdateableClassifier接口,該接口位於weka.classifiers包中。

1 /** 2 * train a classifier using trainSet,then evaluate the classifier on testSet 3 * 分類分為兩種:增量、批量 4 * 此處為增量式分類:適用於訓練集太大而內存有限的情況 5 * 加載數據集(訓練集or測試集),使用ArffLoader 6 * @param trainSet:訓練集路徑 7 * @param testSet:測試集路徑 8 * @return classifier 9 * 10 */ 11 private Classifier trainClassifierIncremental(String trainSet,String testSet){ 12 ArffLoader loader=new ArffLoader(); 13 Instances instances = null; 14 NaiveBayesUpdateable naiveBayesUpdateable=null; 15 try { 16 //load data 17 loader.setFile(new File(trainSet)); 18 instances=loader.getStructure(); 19 // instances.setClassIndex(classIndex); // 指定分類屬性索引 20 instances.setClassIndex(instances.numAttributes()-1); //默認最后一個屬性為分類屬性 21 22 // train NaiveBayes :incremental classifier 23 naiveBayesUpdateable=new NaiveBayesUpdateable(); 24 naiveBayesUpdateable.buildClassifier(instances); 25 Instance current; 26 while((current=loader.getNextInstance(instances))!=null){ 27 naiveBayesUpdateable.updateClassifier(current); 28 } 29 30 //evaluate classifier 31 Instances testInstances=new Instances(new FileReader(testSet)); 32 testInstances.setClassIndex(testInstances.numAttributes()-1); 33 Evaluation eval=new Evaluation(instances); 34 eval.evaluateModel(naiveBayesUpdateable, testInstances); 35 System.out.println(eval.toMatrixString()); 36 System.out.println(eval.toSummaryString()); 37 System.out.println(eval.toClassDetailsString()); 38 39 } catch (Exception e) { 40 e.printStackTrace(); 41 } 42 return naiveBayesUpdateable; 43 }
其中,Evaluation類,是weka提供的對分類器分類效率進行評估的模塊,通過該模塊的調用,可觀察分類器的各種性能,如召回率、准確率、F值等等。ArffLoader用來加載指
定路徑的數據集,注意該數據集應為.arff格式。
2)采用決策樹算法(J48)進行批量式分類

1 /** 2 * train a classifier using trainSet,then evaluate the classifier on testSet 3 * 分類分為兩種:增量、批量 4 * 此處為批量式分類:適用於訓練集能夠在內存中存放的情況 5 * 加載數據集(訓練集or測試集),使用ArffLoader 6 * @param trainSet:訓練集路徑 7 * @param testSet:測試集路徑 8 * @return classifier 9 * 10 */ 11 private Classifier trainClassifierBatch(String trainSet,String testSet){ 12 ArffLoader loader=new ArffLoader(); 13 Instances instances = null; 14 J48 tree=null; 15 try { 16 //load data 17 loader.setFile(new File(trainSet)); 18 // instances=loader.getStructure(); 19 instances=loader.getDataSet(); 20 // instances.setClassIndex(classIndex); // 指定分類屬性索引 21 instances.setClassIndex(instances.numAttributes()-1); //默認最后一個屬性為分類屬性 22 23 // train NaiveBayes :incremental classifier 24 tree=new J48(); 25 tree.buildClassifier(instances); 26 27 //evaluate classifier 28 Instances testInstances=new Instances(new FileReader(testSet)); 29 testInstances.setClassIndex(testInstances.numAttributes()-1); 30 Evaluation eval=new Evaluation(instances); 31 eval.evaluateModel(tree, testInstances); 32 System.out.println(eval.toMatrixString()); 33 System.out.println(eval.toSummaryString()); 34 System.out.println(eval.toClassDetailsString()); 35 36 } catch (Exception e) { 37 e.printStackTrace(); 38 } 39 return tree; 40 }
3)關於分類器的評估
weka對於分類器的評估,除了上述明確划分訓練集和測試集,然后以測試集來評估分類性能的方式,還提供了交叉驗證方式,該方式適用於數據集只有一個(即沒有明確划分出訓練集和測試集)的情況,weka在Evaluation類中提供了一個crossValidateModel方法來實現交叉驗證,該方法要求提供一個未訓練的分類器,數據集,交叉驗證折數,一個隨機化種子。

1 public void crossValidate(String dataSet){ 2 try { 3 // load data 4 Instances instances=new Instances(new FileReader(dataSet)); 5 //evaluate 6 Evaluation eval=new Evaluation(instances); 7 J48 tree=new J48(); 8 eval.crossValidateModel(tree, instances, 10, new Random(1)); 9 System.out.println(eval.toMatrixString()); 10 System.out.println(eval.toSummaryString()); 11 System.out.println(eval.toClassDetailsString()); 12 } catch (FileNotFoundException e) { 13 System.out.println("dataSet not found..."); 14 e.printStackTrace(); 15 } catch (IOException e) { 16 e.printStackTrace(); 17 } catch (Exception e) { 18 e.printStackTrace(); 19 } 20 21 }
此處實現采用10折交叉驗證,隨機化種子選取1.
4)對未分類實例進行分類

1 /** 2 * 利用已訓練的分類模型對未分類數據集進行分類 3 * @param dataSet:未分類數據集 4 * @param cls:已訓練好的分類模型 5 * @param labeledSet:分類后數據存放路徑 6 */ 7 public void classifyInstances(String dataSet,Classifier cls,String labeledSet){ 8 try { 9 // load unlabeled data and set class attribute 10 Instances unlabeled=new Instances(new FileReader(dataSet)); 11 unlabeled.setClassIndex(unlabeled.numAttributes()-1); 12 // create copy 13 Instances labeled = new Instances(unlabeled); 14 // label instances 15 for (int i = 0; i < unlabeled.numInstances(); i++) { 16 double clsLabel = cls.classifyInstance(unlabeled.instance(i)); 17 labeled.instance(i).setClassValue(clsLabel); 18 } 19 // save newly labeled data 20 DataSink.write(labeledSet, labeled); 21 22 } catch (FileNotFoundException e) { 23 System.out.println("DataSet,File Not Found..."); 24 e.printStackTrace(); 25 } catch (IOException e) { 26 e.printStackTrace(); 27 } catch (Exception e) { 28 e.printStackTrace(); 29 } 30 }
相關方法簡介:
<--instances.setClassIndex(instances.numAttributes()-1); //默認最后一個屬性為分類屬性 -->
Instances類方法:setClassIndex(int classIndex) 用於設置分類屬性索引, numAttributes()返回instance實例中屬性(特征)個數,即特征向量維度
<--eval.toMatrixString());
eval.toSummaryString();
eval.toClassDetailsString();
-->
• toMatrixString – outputs the confusion matrix.
• toClassDetailsString – outputs TP/FP rates, precision, recall, F-measure,AUC (per class).
輸出結果展示:
=== Confusion Matrix ===
a b c <-- classified as
50 0 0 | a = Iris-setosa
0 47 3 | b = Iris-versicolor
0 3 47 | c = Iris-virginica
Correctly Classified Instances 144 96 %
Incorrectly Classified Instances 6 4 %
Kappa statistic 0.94
Mean absolute error 0.035
Root mean squared error 0.1486
Relative absolute error 7.8697 %
Root relative squared error 31.5185 %
Coverage of cases (0.95 level) 98.6667 %
Mean rel. region size (0.95 level) 37.3333 %
Total Number of Instances 150
=== Detailed Accuracy By Class ===
TP Rate FP Rate Precision Recall F-Measure ROC Area Class
1 0 1 1 1 1 Iris-setosa
0.94 0.03 0.94 0.94 0.94 0.992 Iris-versicolor
0.94 0.03 0.94 0.94 0.94 0.992 Iris-virginica
Weighted Avg. 0.96 0.02 0.96 0.96 0.96 0.995