WEKA + Android: Machine Learning di Smartphone mu
Pada kesempatan kali ini, kita akan membuat sebuah aplikasi untuk mengklasifikasi jenis bunga iris berdasarkan panjang sepal, lebar sepal, panjang petal, dan lebar petal...

Pada kesempatan kali ini, kita akan membuat sebuah aplikasi untuk mengklasifikasi jenis bunga iris berdasarkan panjang sepal, lebar sepal, panjang petal, dan lebar petal bunga yang akan diprediksi. Proses learning dilakukan di Weka (posting sebelumnya).
Secara umum, tahapan yang akan kita lakukan pada tutorial ini adalah:
- Buat Project baru
- Buat UI
- Import Weka.jar
- Copy trained model ke folder assets
- Load trained model sebagai classifier
Untuk itu mari kita mulai tutorialnya.
Sebelumnya saya ingin sedikit membahas use-case dari aplikasi yang akan kita buat. Bayangkan kita sedang mengikuti sebuah ekspedisi dimana kita harus mengumpulkan sejumlah bunga jenis tertentu, tetapi kita terpisah dari ahli yang bisa membedakan jenis bunga tersebut. Demi menghindari kebingungan tersebut, sebelum keberangkatan ekspedisi kita membuat aplikasi pembeda bunga tersebut. (agak lebay ya :p)
User Interface (UI)
Pertama-tama, buat project baru pada Android Studio. Kemudian buka file xml layout untuk membuat User Interface (UI). UI yang kita buat berisi input features, button, dan textview untuk menampilkan hasil. Untuk input, kita buat 4 jenis fitur sesuai atribut pada dataset training data kita pada tutorial sebelumnya yaitu:
- Sepal Length
- Sepal Width
- Petal Length
- Petal Width
Untuk masing-masing fitur tersebut, tambahkan TextView sebagai label dan EditText untuk input form-nya.
Kemudian tambahkan button. Tambahkan parameter :onClick=”classify” pada button tersebut. Classify merupakan nama method yang dipanggil ketika kita menekan button tersebut nanti. Jangan lupa juga tambahkan TextView untuk menampilkan hasil prediksi yang dibuat. Tambahkan parameter :id=”@+id/resultView” pada TextView tersebut.
Import Weka.jar
Kemudian copy file weka.jar yang ada di folder instalasi weka, ke folder libs pada project android. Setelah itu klik kanan file weka.jar tersebut di android studio, dan klik ‘Add As Library’.
Jika terjadi Error seperti pada gambar di bawah, buka file build.gradle, ganti minSdkVersion menjadi versi 26.
Copy Trained Model
Setelah weka berhasil di-import sebagai library, langkah selanjutnya adalah dengan menambahkan file classifier model ke android project. Untuk itu buat folder baru dengan klik kanan pada folder main, kemudian klik New -> Folder -> Assets Folder. Setelah itu copy file classifier model yang telah dibuat di Weka sebelumnya ke folder assets tersebut.
Load_ Trained Model_ sebagai Classifier
Load trained model dengan menggunakan fungsi read() weka.core.SerializationHelper. InputStream sebagai masukan dari fungsi read() tersebut didapat dari assetManager.open([nama file]). Jangan lupa menyimpan fungsi tersebut pada blok try/catch.
1
2
3
4
5
6
7
// Load classifer model
wekaClassifier = (Classifier) weka.core.SerializationHelper.read(assetManager.open("iris__SMO-no_norm_no_stand.model"));
// Tampilkan peringatan jika gagal
if (wekaClassifier==null){
Toast.makeText(this, "Model not loaded!", Toast.LENGTH_SHORT).show();
}
Kemudian selanjutnya adalah membuat atribut untuk instance classifier kita. Buat 4 atribut fitur + 1 atribut kelas sesuai atribut pada dataset. Setelah itu buat instance, set atribut tadi kedalam instance, dan set nilainya sesuai nilai yang diisi pada form UI. Setelah itu untuk membuat prediksi, instance tersebut diklasifikasi oleh model yang kita load sebelumnya.
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
// 4 Atribut fitur + 1 kelas
final Attribute atrSepalLength = new Attribute("sepallength");
final Attribute atrSepalWidth = new Attribute("sepalwidth");
final Attribute atrPetalLength = new Attribute("petallength");
final Attribute atrPetalWidth = new Attribute("petalwidth");
final List<String> classes = new ArrayList<String>() {
{
add("Iris-setosa"); // cls nr 1
add("Iris-versicolor"); // cls nr 2
add("Iris-virginica"); // cls nr 3
}
};
// Tambahkan kedalam list
ArrayList<Attribute> attributeList = new ArrayList<Attribute>(2){
{
add(atrSepalLength);
add(atrSepalWidth);
add(atrPetalLength);
add(atrPetalWidth);
Attribute atrClass = new Attribute("@@class@@", classes);
add(atrClass);
}
};
// Buat instance
Instances trainingSet = new Instances("Rel", attributeList, 1);
trainingSet.setClassIndex(4);
DenseInstance instance = new DenseInstance(5);
// Masukkan value dari form ke instance
instance.setValue(atrSepalLength, sLength);
instance.setValue(atrSepalWidth, sWidth);
instance.setValue(atrPetalLength, pLength);
instance.setValue(atrPetalWidth, pWidth);
instance.setDataset(trainingSet);
// Buat prediksi
double prediction = wekaClassifier.classifyInstance(instance);
// Tampilkan prediksi
classificationResult = "Result : " + classes.get(new Double(prediction).intValue()) + " - " + prediction;
Hasil
Run program untuk mengetes classifier kita. Aplikasi akan memberikan prediksi sesuai nilai-nilai yang kita masukkan untuk setiap atribut/fitur. Tampilan aplikasi classifier ini bisa dilihat pada gambar di bawah ini.
Full code untuk project ini bisa dilihat di github. Untuk yang masih agak bingung tentang fungsi machine learning, apa fungsi aplikasi pada tutorial ini, mengapa tidak dibuat dengan percabangan if-else saja, Insya Allah pertanyaan-pertanyaan tersebut akan dibahas pada artikel berikutnya.