使用Weka进行数据挖掘(Weka教程五)Weka数据预处理之Filter使用

加载完毕数据集后,还是不能直接进行数据挖掘模型的训练和学习,必须要进行数据预处理,数据预处理一般指的是以下四个方面:数据清理,数据集成,数据变换,数据归约等。

  • 什么是数据预处理

①数据清理
数据清理例程通过填写缺失的值、光滑噪声数据、识别或删除离群点并解决不一致性来“清理”数据。主要是达到如下目标:格式标准化,异常数据清除,错误纠正,重复数据的清除。
②数据集成
数据集成例程将多个数据源中的数据结合起来并统一存储,建立数据仓库的过程实际上就是数据集成。
③数据变换
通过平滑聚集,数据概化,规范化等方式将数据转换成适用于数据挖掘的形式。
④数据归约
数据挖掘时往往数据量非常大,在少量数据上进行挖掘分析需要很长的时间,数据归约技术可以用来得到数据集的归约表示,它小得多,但仍然接近于保持原数据的完整性,并结果与归约前结果相同或几乎相同。
这些预处理都可以使用Weka的Filter来实现。Weka的Filter作用是将一个Instances输入后,通过特定的数据清洗过程,将清洗好的Instances输出,也就是说,Filter处理的维度是在Instances层面上进行的。你也可以通过Filter的组合来实现复杂的数据处理。

  • Filter提供的功能

FIlter功能还是比较强大的,但是Filter分为非监督学习和监督学习两种过滤器,分别属于weka.filters.unsupervised.attribute和weka.filters.unsupervised.attribute,至于监督学习和非监督学习,简单理解就是看输入数据是否有标签(label)。输入数据有标签,则为有监督学习,没标签则为无监督学习。这两种方式下的过滤器是不一样的,使用时一定要注意。
非监督学习包下的方法比较多,先讲解一下weka.filters.unsupervised.attribute主要方法的含义:
1.Add
为数据库添加一个新的属性,新的属性将会包含所有缺失值。
2.AddExpression
新增一个属性,该属性由现有属性通过设定的表达式计算得出。支持+, -, *, /, ^, log, abs, cos, exp, sqrt, floor, ceil, rint, tan, sin。现有属性由a+索引值构成。
3.AddNoise
只对名义属性有效,依照一定比例修改值。
4.Center
将数值化属性的平均化为0。
5.ChangeDateFormat
修改数据格式
6.Discretize
简单划分的离散化处理。参数:
7.MathExpression
功能和AddExpression类似,不过支持的运算更多,特别是MAX和MIN的支持特别有用。所有支持运算符如下:+, -, *, /, pow, log,abs, cos, exp, sqrt, tan, sin, ceil, floor, rint, (, ),A,MEAN, MAX, MIN, SD, COUNT, SUM, SUMSQUARED, ifelse
8.Reorder
重新排列属性,输入2-last,1可以让第一项排到最后,如果输入1,3,5的话…其他项就没有了
9.Standardize
这个和Center功能大致相同,多了一个标准化单位变异数
10.StringToNominal
将String型转化为Nominal型

然后再讲一下weka.filters.unsupervised.instance包下的主要方法和含义:
1.NonSparseToSparse
将所有输入转为稀疏格式
2.Normalize
规范化整个实例集
3.RemoveFolds
交叉验证,不支持分层,如果需要的话使用监督学习中的方法
4.RemoveRange
移除制定范围的实例,化为NaN
5.Resample
随机抽样,从现有样本产生新的小样本
6.SubsetByExpression
根据规则进行过滤,支持逻辑运算,向上取值,取绝对值等等

监督学习下虽然方法比较少,但是思路有所不同,主要是在有标签的情况下,很多方法诸如抽样就必须考虑不同数据分类的比例,因此会更加复杂一些,常用方法下次博客介绍。

  • 如何使用Filter

下面讲解下如何使用Filter来进行数据预处理:
为了更加清楚,选一个比较简单的方法:规范化数据normalize作为例子,代码如下:

//假设已经有一个数据集tempData
Normalize normalize = new Normalize();
String[] normalOptions = new String[]{"-S","2.0","-T","-1.0"};
normalize.setOptions(normalOptions);
normalize.setInputFormat(tempData);
newData = Filter.useFilter(tempData,normalize);

从以上代码可以看出,要使用Filter,必须要指定使用哪种Filter,然后要实例化Filter对象,在这之后要为这个特定的Filter指定好参数,参数在API里可以找到。具体参数不在赘述。然后调用Filter的useFilter()方法就可以返回处理好的Instances。
特别需要注意的是,一定要为Filter指定输入数据格式,setInputFormat(tempData),否则会报错。

Filter功能很强大,你可以通过继承和实现Filter父类对象来实现自己的专属过滤器,通过重载方法,你可以做出你想要的功能。

你可能感兴趣的:(Weka+Java数据挖掘)