Weka Part 1 Command Line

Machine Learning


这篇文章主要是weka命令行文档的阅读笔记. 用中文是觉得可能帮助到别人, 当然, 也许也没什么用, 就当废话. 命令行的好处在于, 可以用 script 来做数据分析, 一步一步进行, 多次试错, 最后再写成系统里的代码.

Install 安装

记得添加 weka.jar 的 CLASSPATH (linux,mac), 环境变量 (win). 或者命令行调用的时候记得 -cp 制定 jar 包的位置. 较大的数据集, 记得加上 -Xmx1024m.

Dataset 数据集

可以理解成 machine learning 的输入. 如下是一个例子

%
% this is a dataset about weather

@relation weather

@attribute outlook {sunny, overcast, rainy}
@attribute temperature numeric
@attribute humidity numeric
@attribute windy {TRUE, FALSE}
@attribute play {yes, no}

@data
sunny,85,85,FALSE,no
sunny,80,90,TRUE,no
overcast,83,86,FALSE,yes
rainy,70,96,FALSE,yes
rainy,68,80,FALSE,yes
rainy,65,70,TRUE,no
overcast,64,65,TRUE,yes
sunny,72,95,FALSE,no
sunny,69,70,FALSE,yes
rainy,75,80,FALSE,yes
sunny,75,70,TRUE,yes
overcast,72,90,TRUE,yes
overcast,81,75,FALSE,yes
rainy,71,91,TRUE,no

一开始的是百分号注释内容, 后面的 relation 是申明 dataset 的名字 然后 attribute 是属性, 可以有很多种类型, 比如数字,字符串,布尔值等. data 后面就是数据内容,是按照属性组成的数据条目.

java weka.core.Instances data/weather.numeric.arff 相当于一个命令行的数据集可视化工具, 如下

Relation Name:  weather
Num Instances:  14
Num Attributes: 5

     Name                      Type  Nom  Int Real     Missing      Unique  Dist
   1 outlook                    Nom 100%   0%   0%     0 /  0%     0 /  0%     3
   2 temperature                Num   0% 100%   0%     0 /  0%    10 / 71%    12
   3 humidity                   Num   0% 100%   0%     0 /  0%     7 / 50%    10
   4 windy                      Nom 100%   0%   0%     0 /  0%     0 /  0%     2
   5 play                       Nom 100%   0%   0%     0 /  0%     0 /  0%     2

weka 还提供一些数据集转换工具, 比如

java weka.core.converters.CSVLoader data.csv > data.arff 

java weka.core.converters.C45Loader c45_filestem > data.arff

Classifier 分类器

如何评估分类器

简要的说说, 首先最直观的是 accruracy.

分别试试下面两行命令

java weka.classifiers.rules.ZeroR -t data/iris.arff

java weka.classifiers.trees.J48 -t data/iris.arff

你会发现 J48(decision tree)的精确度要远高于 ZeroR. 因为 ZeroR 是一个几乎没有分类能力的分类器, 经常是用来做 baseline 比较的.

一般, 我们会把数据集分为 training set 和 test set. 这两个集合是独立的, 这种准确度估计叫做 hold-out estimate. 为了得到方差(variance), 这个过程(随机的分拆集合, 一部分拿来 training, 一部分拿来 test)会被重复很多遍.

还有一种更有说服力的评估方法, 叫做 n-fold cross-validation (rotation estimation). 其方法是把数据集随机分成 n 等份. 每一次迭代, n-1 份用来 training 而剩下的 1 份用来做 testing. 如果 n 和 数据集大小一样, 这个也可以叫做 leave-1-out. 以此类推, 也有 leave-p-out.至于 n 可以随机选择, 也可以特意选择一个值使得每一个 fold 里面的数据分布都是一样的, 后者也叫 stratified n-fold cross-validation. 更多信息请参考 Cross validation statistics Compendium of cross-validation techniques

weka.classifiers

参数

  • -t training file
  • -T test file
  • -x number of folders for crossvalidation
  • -c set class
  • -d save trained model
  • -l load prvious model
  • -p # show predictions
  • -i show preicsion/recal/true,false potivate rate
  • -o show human-readable output

一些分类器

  • tree.J48 C4.5决策树
  • bayes.NaiveBayes
  • functions.LinearRegression
  • functions.Logistic
  • functions.SMO SVM
  • lazy.KStar

More

Filters 过滤器

过滤器 是用来 添加, 修改, 删除, 重采样 数据集条目的. -i-o 可以用来申明输入和输出的数据集. 这样的目的可能是为了性能, 也可能是为了准确度. 比如 有一些方法只能处理数字, 那么可以将 string 的属性转换成对应的id 数字. 比如 true -> 1, false -> 0.

instance
可以直接理解成 row in databse table
attribute
可以直接理解成是 column in database table

所以这里有两类 filter.

weka.filters 再细分为 supervisedunsupervised.

weka.filters.supervised

-c 用来申明一个 class (label) 告知 ground true.

weka.filters.supervised.attribute

  • Discretize 将数字属性全转成名字属性 More
  • NominalToBinary 将名字属性 转成 二进制数字

weka.filters.supervised.attribute

  • Resample -Z 百分比, -B 均匀分布
  • StratifiedRemoveFolds 生成 stratified cross-validation folds -N fold 数 More

weka.filters.unsupervised

weka.filters.unsupervised.attribute

  • StringToWordVector
java weka.filters.supervised.instance.StratifiedRemoveFolds \ 
-i data/soybean.arff -o soybean-train.arff \
-c last -N 4 -F 1 -V

-F 是选择数据集的 attribute, 然后 -V 是反选的意思.

  • Obfuscate
  • Remove

weka.filters.unsupervised.instance

  • Resample, non-stratified
  • RemoveFolds
  • RemoveWithValues

More to Read