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 阅读(17961) 评论(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  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: