Change Dir

          先知cd——熱愛生活是一切藝術的開始

          統計

          留言簿(18)

          積分與排名

          “牛”們的博客

          各個公司技術

          我的鏈接

          淘寶技術

          閱讀排行榜

          評論排行榜

          weka的java使用(3)——特征選擇

          繼續weka的編程系列。數據挖掘的一個重要的過程就是要特征選擇,主要作用就是降維,并且降低計算的復雜性,摒棄那些可能的潛在噪聲。在我的paper中和碩士論文中都用到了CFS的特征子集選擇方法,配以最佳優先的搜索或者貪心搜索,這樣可以將維度比較高的訓練特征集降維并簡化,大概用CFS+Best first可以將我的訓練樣本中的145維特征降到40-50之間。
          具體的實現方法見下面的測試代碼(只做示范用):
           1/**
           2 * 
           3 */

           4package edu.tju.ikse.mi.util;
           5
           6import java.io.File;
           7import java.io.IOException;
           8import java.util.Random;
           9
          10import weka.attributeSelection.ASEvaluation;
          11import weka.attributeSelection.ASSearch;
          12import weka.attributeSelection.AttributeSelection;
          13import weka.attributeSelection.BestFirst;
          14import weka.attributeSelection.CfsSubsetEval;
          15import weka.core.Instances;
          16import weka.core.converters.ArffLoader;
          17
          18/**
          19 * @author Jia Yu
          20 * @date 2010-11-23
          21 */

          22public class WekaSelector {
          23
          24    private ArffLoader loader;
          25    private Instances dataSet;
          26    private File arffFile;
          27    private int sizeOfDataset;
          28    private int numOfOldAttributes;
          29    private int numOfNewAttributes;
          30    private int classIndex;
          31    private int[] selectedAttributes;
          32
          33    public WekaSelector(File file) throws IOException {
          34        loader = new ArffLoader();
          35        arffFile = file;
          36        loader.setFile(arffFile);
          37        dataSet = loader.getDataSet();
          38        sizeOfDataset = dataSet.numInstances();
          39        numOfOldAttributes = dataSet.numAttributes();
          40        classIndex = numOfOldAttributes - 1;
          41        dataSet.setClassIndex(classIndex);
          42    }

          43
          44    public void select() throws Exception {
          45        ASEvaluation evaluator = new CfsSubsetEval();
          46        ASSearch search = new BestFirst();
          47        AttributeSelection eval = null;
          48
          49        eval = new AttributeSelection();
          50        eval.setEvaluator(evaluator);
          51        eval.setSearch(search);
          52
          53        eval.SelectAttributes(dataSet);
          54        numOfNewAttributes = eval.numberAttributesSelected();
          55        selectedAttributes = eval.selectedAttributes();
          56        System.out.println("result is "+eval.toResultsString());
          57        /*
          58        Random random = new Random(seed);
          59        dataSet.randomize(random);
          60        if (dataSet.attribute(classIndex).isNominal()) {
          61            dataSet.stratify(numFolds);
          62        }
          63        for (int fold = 0; fold < numFolds; fold++) {
          64            Instances train = dataSet.trainCV(numFolds, fold, random);
          65            eval.selectAttributesCVSplit(train);
          66        }
          67        System.out.println("result is "+eval.CVResultsString());
          68        */

          69        System.out.println("old number of Attributes is "+numOfOldAttributes);
          70        System.out.println("new number of Attributes is "+numOfNewAttributes);
          71        for(int i=0;i<selectedAttributes.length;i++){
          72            System.out.println(selectedAttributes[i]);
          73        }

          74    }

          75
          76    /**
          77     * @param args
          78     */

          79    public static void main(String[] args) {
          80        // TODO Auto-generated method stub
          81        File file = new File("iris.arff");
          82        try {
          83            WekaSelector ws = new WekaSelector(file);
          84            ws.select();
          85            
          86        }
           catch (IOException e) {
          87            // TODO Auto-generated catch block
          88            e.printStackTrace();
          89        }
           catch (Exception e) {
          90            // TODO Auto-generated catch block
          91            e.printStackTrace();
          92        }

          93
          94    }

          95
          96}

          97

          其中的注釋部分是使用交叉驗證的部分。默認是十折交叉驗證,當然這個可以通過set方法設置。具體的使用或者用到reduce dimensionality的方法大家可以參看源代碼。畢竟weka開源很是方便。源代碼涉及到的類主要是查看weka.attributeSelection.AttributeSelection類就可以了。當然如何調用和選擇可以看看weka.gui.explorer.AttributeSelectionPanel類。

          上面代碼的實驗結果如下:

          result is

          === Attribute Selection on all input data ===

          Search Method:
           Best first.
           Start set: no attributes
           Search direction: forward
           Stale search after 5 node expansions
           Total number of subsets evaluated: 12
           Merit of best subset found:    0.887

          Attribute Subset Evaluator (supervised, Class (nominal): 5 class):
           CFS Subset Evaluator
           Including locally predictive attributes

          Selected attributes: 3,4 : 2
                               petallength
                               petalwidth

          old number of Attributes is 5
          new number of Attributes is 2
          2
          3
          4

          原來的iris數據集中共有4個屬性(包含一個分類類標所以一共5維),經過特征選擇后,只有第3和第4兩個維度的特征保留,所以新特征子集有兩個維度(不包含類標,有點繞,不好意思,我總是這樣)。
          最后的2,3,4是屬性數組的下標,表示經過特征選擇保留的屬性子集是第3,4,5個屬性。

          posted on 2010-11-23 10:06 changedi 閱讀(17990) 評論(19)  編輯  收藏 所屬分類: 機器學習

          評論

          # re: weka的java使用(3)——特征選擇 2010-12-11 20:20

          你好!請問你能給我講講CFS算法嗎?最終的特征子集中的特征是怎么得出來的,那個Ms函數中的n是原始特征集中的特征個數,還是選完之后的特征子集的個數?這個n變化嗎?最好有個例子,我不太明白這個算法的步驟,謝謝你啦!  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2010-12-12 10:19 changedi

          @張
          CFS的算法,可以參考這篇文章correlation-based feature selection for machine learning。numOfOldAttributes 是原始數據集中的數據維數,numOfNewAttributes 是經過select以后的特征維數。selectedAttributes是select的attribute的index。  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2010-12-12 16:41

          @changedi
          下這篇文章了,英文的,看的比較費盡,還有里面的特征之間的相關度量,特征與類之間的相關度量,用得好像是互信息的公式,那個最終的特征子集是從空集開始一個一個把特征加進去的還是怎么得出來的?還是不明白,最后那個merits函數的值,是不是得先設個閾值啊?大于這個閾值的才加入?就是這個得出來的值是不是就像算信息增益似的,這個特征的信息增益越大代表和類的相關性越大?麻煩你能給我說說這個算法的過程嗎?真的謝謝你了!  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2010-12-13 11:36

          關于CFS算法和IG算法,最近在看CFS算法,上些看不明白的,麻煩你能給解釋下嗎?
          CFS中的那個評價函數:merits中有特征與類這間的平均相關度量和特征與特征之間的平均相關度量,關于這個相關度量我看的是通過信息論中熵的公式和互信息的公式算出來的,有的也說這個互信息就是信息增益,所以對于CFS中算相關度量的信息增益 和平時說的IG算法是一回事嗎?到底是怎么用CFS算法選出那些特征的,最后算的merits的值是不是得有個閾值來判斷什么的,還是在計算那些平均相關度量是要有個閾值的問題?總而言之對于這個CFS算法的流程還不太明白,老師能幫忙給講下嗎?非常感謝!  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2010-12-13 13:55 changedi

          @張
          在郵件中回復你了  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2010-12-14 09:04

          你能告訴我這個weka怎么安裝嗎?能否把相關的安裝程序給俺發一份?我在網上搜了搜,也沒弄明白怎么安裝?得java環境下吧?沒用過,幫幫忙吧,謝謝你了!能否留下QQ?  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2010-12-14 11:04

          謝謝你的熱心解答,還有一個問題 我看網上說KDD 99中“kddcup.data_10_percent” 數據集,接近50萬條數據,做成ARFF文件后有70多M。太大了 weka恐怕沒法運行吧?在weka中如何抽樣啊?KDD 99中的數據集是CSV格式的,是不是可以在weka中直接轉化為ARFF格式啊?  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2010-12-17 16:45

          你好!還能再請教幾個問題嗎?我把weka導入進了MyEclips中,導完在console中出了三個小問題,有兩個說沒找到什么.xml文件,有影響嗎?要用weka中的算法時,怎么加入你想用的數據集啊?就像你提到的iris數據集,我想在MyEclips中看運行的結果。謝謝你能幫忙給說下嗎?  回復  更多評論   

          # weka的使用 2011-03-26 02:50 蔡科

          你好!
          我是應屆畢業生,現在正在做畢業設計。有個步驟想用weka的使用。具體是這樣的:
          我想抽取文章的關鍵詞。對文章分詞后可以抽取每一個詞語的特征比如:TF-IDF、位置特征、詞匯鏈特征等等。。那么現在問題可以轉化為一個分類問題:
          已知每個詞的特征,將詞語分成關鍵詞和非關鍵詞兩類。

          我從前沒有用過weka,在網上得到的資料也很不全。不知道從哪里下手。希望得到你的指點。如果可以,能否和你交流,我的email:caike11@sina.com
          蔡科
            回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2011-03-29 22:15 changedi

          @蔡科
          如果只是二類的分類問題,那么weka當然可以做,前提是你的訓練文件先做好。就是你要把你的詞匯的特征全部提取出來,做成arff文件~~~
          有什么細節問題可以郵件問我jysoftware@gmail.com  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2011-03-31 17:05 lijia

          老師,您好,我剛接觸到weka,我現在想用weka 做特征選擇,在java中調用weka 的特征選擇算法,可weka要求的數據格式是arff格式的,我現在不太明白一個問題,就是我把我的數據的分詞結果作為特征集,那么這些中文的分詞結果怎么轉成arff格式的啊,希望能得到老師的指點。謝謝拉  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2011-03-31 20:39 changedi

          @lijia
          老師是談不上的,不用叫老師啦~~~
          你的問題其實很簡單,weka提供了強大的機器學習能力,分類、聚類、特征選擇都非常易用。你的問題主要在如何建模你的訓練集,arff訓練集就像一個2維數據庫表一樣,每一行是一條訓練記錄,每一列分別代表一個維度的特征,有其特定意義。實踐第一位,你先把weka裝上然后使用一下,weka默認帶了很多經典訓練庫,看看別人的arff是怎么構建的~~  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2011-04-01 14:31 lijia

          呵呵,好的,我看到arff格式的數據,需要有@realation--數據集的名字,然后用@attribute--屬性信息,@data--實例數據,每個屬性值用逗號分割

          現在我描述一下我要做的內容:我的數據是一行一行待分類的中文文本,比如“我用5230手機,信號非常差,待機還行2天左右”,我現在已經將其分詞,并去除掉了停用詞,結果是這樣的:“我”“用”“手機”“信號”“非常差”“待機”“還行”“2天”“左右”我現在想把所有的這些分詞結果作為特征,然后用IG進行特征選擇,現在有一個困惑是,我把他表示成arff格式的時候@attribute--屬性信息這塊我不知道填寫什么,,@data--實例數據這塊就是每條文本的分詞結果作為實例,分詞結果用逗號相隔,我可以先把分詞結果寫入到excel表格中?然后再轉換成csv格式的文件?希望能得到您的指點  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2011-04-02 13:41 changedi

          @lijia
          attribute名字是你自己定的,只要能描述清楚該列所代表的特征就可以,屬于metadata元數據。至于你怎么確定你的特征。如果你只把分詞結果作為特征,那么可以告訴你,你的訓練庫是一個列數不確定的庫,因為一句話的分詞結果詞數是不一樣的。我的直觀思路是定義一個上限值比如一句話最多10個詞,那么你的attribute數量就是10,然后假設一句話有8個詞,那么把另兩個位置填充null即可。文本的學習我沒有研究過,怎么建模不是很清楚。建議你搜搜相關文章,有了思路后用weka很容易做實驗的  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2011-04-02 14:47 lijia

          @changedi
          你可以傳給我一份用于特征選擇的arff格式的數據嗎?我的郵箱:llj85born040@sina.com  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2013-01-25 14:45 張麗琴

          @lijia
          你可以傳給我一份用于特征選擇的arff格式的數據嗎?謝謝,我的郵箱:
          1292629198@qq.com  回復  更多評論   

          # re: weka的java使用(3)——特征選擇 2014-03-26 11:33 劉孟孟

          老師請問:CFS中的評價函數,最后運行結果里給出的merits的值是如何算出來的?這個值得含義是什么?在weka軟件中如何手動修改一個閾值來作為停止準則?CFS是如何一步一步得到最終的特征子集的,對這個算法的流程不太明白,老師可否幫忙給講解下?真的非常感謝。  回復  更多評論   

          # re: weka的java使用(3)——特征選擇[未登錄] 2015-03-06 11:38 1

          @changedi
          @changedi
          同求老師的回復,關于CFS算法,哪里可以找到一個比較由淺入深的解釋,剛剛接觸數據挖掘。  回復  更多評論   

          # re: weka的java使用(3)——特征選擇[未登錄] 2015-03-06 11:38 1

          @changedi
          @changedi
          同求老師的回復,關于CFS算法,哪里可以找到一個比較由淺入深的解釋,剛剛接觸數據挖掘 925452096@qq.com  回復  更多評論   

          主站蜘蛛池模板: 常山县| 南皮县| 巨鹿县| 开封市| 广平县| 霸州市| 宜城市| 贡觉县| 甘孜| 东光县| 通化市| 松溪县| 黄石市| 沁水县| 伊吾县| 温宿县| 罗江县| 宁德市| 丰城市| 宝坻区| 盐山县| 西畴县| 商城县| 大石桥市| 崇文区| 汉源县| 天长市| 云和县| 沈阳市| 正安县| 定州市| 绩溪县| 留坝县| 平阳县| 茌平县| 龙里县| 且末县| 页游| 通榆县| 顺义区| 阜平县|