Akhir-akhir ini saya sedang bermain-main dengan Weka, baik versi GUI ataupun library untuk menggunakan fungsi-fungsi Weka (Instances, Filter, Classification, Clustering, dll). Supaya tidak lupa saya akan menuliskan satu persatu penggunaan library Weka (weka-3.7.3.jar) yang sudah pernah saya lakukan.
Weka dalam penggunaannya menggunakan file ARFF (Attribute-Relation File Format) adalah file yang digunakan Weka yang berisi 1 atau lebih instances dari atribut. Dalam file ARFF biasanya terdapat @RELATION namarelasi untuk menamakan relasi sebuah file ARFF, @ATTRIBUTE untuk penamaan setiap atribut baik numeric, nominal, string dan date. sedangkan @DATA pada setiap line untuk merepresentasikan sebuah instances. (Penjelasan lengkapnya ada disini).
Langkah pertama yang terpenting dalam Weka adalah membaca file ARFF / membuat instances sebelum akan diproses klasifikasi, kluster atau hal lainnya.
Membaca File ARFF
1
2
3
4
5
6
7
8
9
10
11
12
13
import weka.core.Instances;
import java.io.BufferedReader;
import java.io.FileReader;
// Membaca file iris.arff menggunakan BufferedReader
BufferedReader reader = new BufferedReader(new FileReader("/data/iris.arff"));
// Membuat Instances dengan data dari file iris.arff
Instances data = new Instances(reader);
reader.close();
// Set Class Index untuk memberitahu kelas dari target, yang akan digunakan klasifikasi. kelas target berada pada atribut terakhir.
data.setClassIndex(data.numAttributes() - 1);
File iris.arff dapat ditemukan pada folder Weka\data.
Membuat Instances format ARFF
Sedangkan untuk membuat sebuah instances berikut contoh untuk dataset iris :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public void makeInstance() {
// Membuat Attribute List
ArrayList<Attribute> attributeList = new ArrayList<Attribute>(5);
// Membuat 4 Attribute
Attribute sepallength= new Attribute("sepallength");
Attribute sepalwidth= new Attribute("sepalwidth");
Attribute petallength= new Attribute("petallength");
Attribute petalwidth= new Attribute("petalwidth");
// Membuat attribute kelas target
ArrayList<String> classVal = new ArrayList<String>(2);
classVal.add("Iris-setosa");
classVal.add("Iris-versicolor");
classVal.add("Iris-virginica");
// Memasukkan Attribute ke Attribute List
attributeList.add(sepallength);
attributeList.add(sepalwidth);
attributeList.add(petallength);
attributeList.add(petalwidth);
attributeList.add(new Attribute("class", classVal));
// Instances baru dengan nama relasi "iris" dengan atributList dan index 0
Instances instances = new Instances("iris", attributeList, 0);
// Set Class Index untuk memberitahu kelas dari target, yang akan digunakan klasifikasi. kelas target berada pada atribut terakhir.
instances.setClassIndex(instances.numAttributes() - 1);
// Membuat dan tambah kan Attribute ke instance
Instance inst_co = new DenseInstance(instances.numAttributes());
// Men set nilai dari Attribute:
inst_co.setValue(sepallength, 6.9);
inst_co.setValue(sepalwidth, 3.1);
inst_co.setValue(petallength, 5.1);
inst_co.setValue(petalwidth, 2.3);
//menambahkan instances dari instance inst_co
instances.add(inst_co);
System.out.println("===== Instance dataset =====");
System.out.println(instances);
}
Hasil dari instances yang dibuat manual :
1
2
3
4
5
6
7
8
9
10
@relation iris
@attribute sepallength numeric
@attribute sepalwidth numeric
@attribute petallength numeric
@attribute petalwidth numeric
@attribute class {Iris-setosa,Iris-versicolor,Iris-virginica}
@data
6.9,3.1,5.1,2.3,?
Menyimpan instance ke file arff
Anda dapat menyimpan instances yang sudah di buat ke file arff dengan menggunakan fungsi BufferedWriter di java.
1
2
3
4
BufferedWriter writer = new BufferedWriter(new FileWriter("data/iris_create.arff"));
writer.write(instances.toString());
writer.flush();
writer.close();
Sekarang cukup mudah bukan membuat sebuah instances baru melalui java. thx weka wikispaces :D
Berikut file source code dan library sudah saya upload ke github.
References :
- http://weka.wikispaces.com/ARFF+%28stable+version%29
- http://weka.wikispaces.com/Use+WEKA+in+your+Java+code#Instances-ARFF%20File