Hikmah: Strategi dalam Menyampaikan Pesan/Nasihat

Kejadian yang menimpa masjid Ahmad bin Hanbal di Bogor beberapa hari lalu mengingatkan gw pada kejadian yang gw alami tepat 1 hari sebelum bulan Ramadhan tahun ini (2017).  Kejadiannya apa gw gak mau sebutin wkwk, yang jelas di dalamnya terdapat hikmah untuk gw pribadi. Intinya ialah dalam menyampaikan kebaikan/nasihat, kita perlu memperhatikan beberapa aspek. Paling engga ada 3 aspek. Aspek-aspek ini sangat penting untuk diperhatikan sehingga pesan yang kita sampaikan dapat diterima oleh penerima (receiver). Ketiga aspek tsb ialah:

#1 Isinya Benar

Hal yang paling pertama yang harus diperhatikan adalah konten/isi pesan yang ingin kita sampaikan. Ini harus benar. Karena seharusnya seseorang menerima nasihat bukan dari siapa yang menyampaikan, tapi dari isinya. Isi yang salah justru akan menjadi boomerang untuk kita. Misalnya, ketika ada seorang imam yang salah bacaannya, lalu kita ingin mengingatkan sang imam dengan bacaan yang benar, maka pastikan apa yang akan disampaikan telah sesuai dengan ilmu tajwid/qur’an. Kalo bisa tunjukkanlah referensi/rujukan dalam berpendapat. Namun, ternyata dalam menyampaikan kebaikan tidak hanya butuh isi yang benar, tetapi juga cara penyampaiannya harus benar.

#2 Cara Menyampaikannya Benar

Kalo lo makan di restoran, enak mana, antara waitress-nya menghidangkan makanan dengan ramah disertai senyum atau waitress-nya ngelempar itu makanan ke meja lo? Enak mana, dinasihatin baik-baik atau dinasihatin dengan marah-marah? Gak perlu marah-marah untuk menyampaikan nasihat. Gak perlu menyinggung sang receiver jika kita ingin sang receiver mengikuti nasihat kita.

Tapi ada satu lagi yang perlu diperhatikan.

#3 Melihat Psikologis Penerima

Aspek yang ketiga ini yang sering kali luput dalam prakteknya di lapangan. Oke, mungkin isi pesan yang ingin kita sampaikan sudah benar, cara yang digunakan sudah benar. Tapi kenapa masih gagal? Inilah yang terjadi pada pengalaman gw. Yakni bagaimana melihat kesiapan penerima, secara psikologis. Misalnya, ada orang yang gak mudah menerima pesan yang baik yang disampaikan dengan cara yang baik, jika pesan itu disampaikan sama orang asing yang belum dikenal. Atau ada yang lebih menerima pesan kalo pesan itu disampaikan ketika bercanda. Atau perlu beberapa variasi cara penyampaian. Contohnya ialah dakwah sunan kalijaga yang menggunakan wayang.

Misteri Dibalik Anehnya Ongkos Kirim Barang Jika Belanja di Bhinneka

Di zaman e-commerce gini, sudah banyak banget orang Indonesia yang belanja online, kita sudah terbiasa dengan cara tersebut. Ketika membeli suatu barang maka otomatis kita sudah mengetahui bahwa kita akan dikenakan biaya tambahan untuk pengiriman barang, biasanya disebut ongkir atau ongkos kirim. Nah biaya pengiriman ini berbeda-beda tergantung lokasi asal dan tujuan barang.

Mungkin kita juga sudah tahu berapa biaya kirim 1kg barang dari suatu tempat ke tempat lain, terutama ke lokasi tujuan kita. Misalnya kalo kirim barang dari Jakarta ke Bandung pake JNE Reguler bakal dikenai biaya Rp 10.000. Tapi selain ongkir, ada juga biaya tambahan lainnya. Kalo kita belanja di BukaLap*k atau Tok*pedia, maka ada nomor unik yang ditambahkan ke total biaya. Angkanya sangat kecil (gak nyampe seribu perak) karena memang tujuannya hanya sebagai identifier transaksi, biar gampang ditelusuri gitu lah.

Namun satu hal yang cukup berbeda jika kita belanja di Bhinneka. Coba perhatikan gambar berikut.

Coba lihat ongkos kirimnya. Gw beli barang yang gak nyampe 1 kg masa ongkir ke Jakarta Rp 11.650. Aneh kan? Kalo gw sebagai orang teknik (padahal kuliahnya bukan jurusan teknik, tapi gelarnya sarjana teknik #abaikan), gw penasaran angka itu dari mana. Emang sih, angka unik yang diberikan Bh*nneka nantinya akan negatif, artinya total belanja akan lebih kecil sedikit. Seperti dijelaskan pada halaman ini.

Pertama yang gw harus lakukan ialah mencari tahu sebenarnya biaya asli ongkir ini berapa, karena gw yakin ongkir dalam kota yang sama harusnya gak sampe ceban. Nah kalo kita klik tombol search untuk mencari kota tujuan, maka akan muncul halaman berikut.

Halaman ini digunakan untuk mencari kecamatan atau kota pengiriman.

Setelah muncul kota yang dicari, jangan klik tombol select dulu, kita lihat kode html nya dulu. Dan kita cari berapa ongkirnya. Dan ternyata ongkir awalnya Rp 9000!

Artinya ongkir yang harus gw bayar ada kelebihan Rp 2645. Nah ini yang menarik. Oleh Bh*nneka ongkirnya dinaikkan sekian ribu sementara disisi lain angka unik yang diberikan nilainya minus. Lalu dari mana nilai Rp 2645 itu berasal?

Cara Pertama: Pendekatan Matematis

Cara yang paling gampang mengetahui kelebihan itu ialah kita hitung Rp2645 itu berapa persen. Bisa persentase terhadap ongkir awal atau persentase terhadap harga barang. Kalo persentase terhadap ongkir awal maka persentasenya ialah 29,39%. Dan kalo persentasenya terhadap harga barang maka persentasenya ialah tepat 0.25%. Mana yang benar? Kita lanjutkan pencariannya…

Cara Kedua: Debugging Kode

Dengan cara yang pertama kita masih belum tau mana yang bener, 29 sekian persen atau 0.25 persen. Nah cara yang kedua ini ialah cara yang eksak, dengan melakukan debugging terhadap kode sumber. Logikanya, setiap kita ganti kota pengiriman maka ongirnya juga berubah. Karena itu kita lihat kode sumber halaman pencarian kota yang tadi. Dari gambar sebelumnya juga sudah bisa dilihat kalo tombol select di klik maka akan memanggil fungsi setPengiriman.

Di dalam fungsi setPengiriman terdapat bagian ini

Artinya setiap kali kota pengiriman berubah maka fungsi calculate() akan dijalankan. Setelah sedikit pencarian maka fungsi calculate() berada di file shopping-cart.min.js. Biar enak bacanya kita unminify dulu kode tersebut.

Cara debugging yang gw lakukan ialah pertama, gw bikin versi unminify dari shopping-cart.min.js. Terus gw copy ke localhost. Begitu juga dengan kode sumber dari halaman shopping cart. Sehingga gw punya dua file, index.html (kode sumber) dan shopping-cart.js. Nah untuk debugging, gw modif kode sumbernya sehingga yang dipake ialah shopping-cart.js punya gw, bukan lagi shopping-cart.min.js.

Setelah dicari-cari, hasilnya ialah bahwa Bhinneka memiliki rate besar tambahan ongkir tersebut yakni sebesar 0.25% dari total harga barang (yakni harga barang x jumlah barang) jika menggunakan JNE dan 0,22% jika menggunakan Tiki. Namun jika tambahan tersebut kurang dari Rp 2500 maka tambahan yang digunakan Rp 2500 (minimum tambahan).

Gw gak tau apa tujuan dari penambahan ini. Menurut gw sih mungkin saja biaya ini merupakan biaya handling atau packaging barang dan biaya buat jaga-jaga kalo ada force major dari suatu pengiriman. Bisa juga Bhinneka mencoba membuat keuntungan dengan margin sebesar Rp 2500 atau 0.25% atau 0.22% dari tiap transaksi. Tapi masa iya margin 0.25%? Wkwkwk

How to create 3D plots of surfaces on WordPress

Instead of creating 3D plots of surfaces using Matlab and then converting the result into an image, I would like to show you how to create a 3D plot of an equation or a function directly from your WordPress.

First, we need to install CSS & Javascript Toolbox (CJT). CJT is a wordpress plugin that enable us to add custom css and javascript code into specific posts, categories, or pages. We know that not all posts will contain the graphics. After that, make a new block code and insert this code to the field.

<script src="https://cdnjs.cloudflare.com/ajax/libs/vis/4.18.1/vis.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/vis/4.18.1/vis.min.css" rel="stylesheet" type="text/css" />

Yes, as you notice, there are only two lines of code involved. The first line is used to add additional javascript code to our post and the second one is used to add styling to our post. In order to display 3D graphics, we need a library that can help us doing this task, it’s Vis.js. Vis.js is a dynamic, browser based visualization library. The library is designed to be easy to use, to handle large amounts of dynamic data, and to enable manipulation of and interaction with the data. The library consists of the components DataSet, Timeline, Network, Graph2d and Graph3d.

And the last part is inserting our code to create 3D graphics using Vis.js. I’m gonna use an example from Vis.js website, the graphic has equation of $sin(\frac{x}{50})cos(\frac{y}{50})50 + 50)$. Simply, put this code to your post to render the graphic.

Visit this link to see the result.

<div id="visualization"></div>
<script type="text/javascript">
  // Create and populate a data table.
  var data = new vis.DataSet();
  // create some nice looking data with sin/cos
  var counter = 0;
  var steps = 50; // number of datapoints will be steps*steps
  var axisMax = 314;
  var axisStep = axisMax / steps;
  for (var x = 0; x < axisMax; x+=axisStep) {
   for (var y = 0; y < axisMax; y+=axisStep) {
     var value = (Math.sin(x/50) * Math.cos(y/50) * 50 + 50);
     data.add({id:counter++,x:x,y:y,z:value,style:value});
   }
  }

  // specify options
  var options = {
    width: '400px',
    height: '452px',
    style: 'surface',
   showPerspective: true,
   showGrid: true,
   showShadow: false,
   keepAspectRatio: true,
   verticalRatio: 0.5
  };

  // Instantiate our graph object.
  var container = document.getElementById('visualization');
  var graph3d = new vis.Graph3d(container, data, options);
</script>

SVM: the Geometry of the Hyperplane

Pada tulisan ini gw akan membahas sekilas mengenai vector kemudian bagaimana geometri hyperplane pada SVM.

The Dot Product of Vector

Jika ada dua buah vector $x$ dan $y$ maka dot product dari kedua vector tersebut ialah:

$$x \cdot y=  \Vert x \Vert \Vert y \Vert cos(\theta) = x_1y_1+x_2y_2$$

Lalu apa maksud dari dot product itu sendiri?

Dot product merupakan perkalian antara dua vector yang menghasilkan suatu besaran skalar. Contoh penerapan dot product yang umum ialah dalam menyelesaikan masalah dinamika di fisika. Contohnya jika kita menarik sebuah benda dengan gaya $F=50N$ yang membentuk sudut $\theta=60^0$ sejauh $s=5m$ ke kanan berapa besar usaha yang kita keluarkan?

Cara yang paling mudah ialah dengan menguraikan vector gaya $F$ menjadi vector pada sumbu-x $F_x$ dan sumbu-y $F_y$.

Kemudian usaha dihitung dengan mengalikan $F_x$ dengan jarak perpindahan.

$$\text{Usaha}=F cos(\theta) s = 50 cos(60^0) 5 = 125J$$

Jika dua vector tersebut searah maka hasil dot product nya bernilai positif dan jika berlawanan arah maka negatif. Namun ketika vector tersebut saling tegak lurus, maka resultan yang dihasilkan ialah nol. Masing-masing tidak saling memberikan kontribusi.

Geometry of hyperplane

Sekarang kita akan mengenal geometri pada SVM. Misalnya kita mempunyai hyperplane sebagai berikut:

Lo pasti familiar dengan persamaan garis lurus $y=mx+b$. Hyperplane diatas tidak lain merupakan sebuah garis lurus yang juga memiliki persamaan $y=mx+b$, atau jika ditulis ulang akan menjadi $mx-y+b=0$. Namun persamaan ini akan menjadi lebih ribet kalo hyperplane tersebut berdimensi lebih dari 2. Untuk itu, kita gunakan notasi vector sebagai berikut:

$$\mathbf{w} \cdot \mathbf{x} + \mathbf{b} = 0$$

Dimana $\mathbf{w}$ atau weight merupakan sebuah vector normal yang tegak lurus dengan hyperplane dan $\mathbf{b}$ atau bias menunjukkan seberapa jauh weight dari titik origin $(0, 0)$. Sedangkan $\mathbf{x}$ merupakan data point yang berupa vector yang memiliki koordinat $(x, y)$ pada persamaan garis lurus. Jadi bedakan $x$ pada persamaan garis lurus dengan $\mathbf{x}$ jika menggunakan notasi vector. $\mathbf{w} \cdot \mathbf{x}$ merupakan dot product antara vector $\mathbf{w}$ dan $\mathbf{x}$.

Misalnya hyperplane tadi memiliki persamaan $y=x$ atau $x-y=0$ (Note: $\frac{1}{2}x-\frac{1}{2}y=0$ juga bisa, $\frac{35}{36}x-\frac{35}{36}y=0$ juga bisa, yang penting kemiringannya sama!). Jika kita gunanakan notasi vector maka $\mathbf{w}=(1, -1)$ atau $\mathbf{w}=(-1, 1)$ (keduanya sama-sama tegak lurus dengan hyperplane) dan $\mathbf{b}=0$ (hyperplane melewati titik $(0, 0)$).

$$\mathbf{w} \cdot \mathbf{x} + \mathbf{b} = (1, -1) \cdot (x, y) + 0 = x-y = 0$$

$$\text{atau}$$

$$\mathbf{w} \cdot \mathbf{x} + \mathbf{b} = (-1, 1) \cdot (x, y) + 0 = -x+y = x-y=0$$

Sebetulnya ada banyak kemungkinan weight, karena sepanjang vector tersebut tegak lurus dengan hyperplane. Contoh diatas gw berikan 2 saja. Lalu bagaimana jika hyperplane nya digeser sedikit seperti ini? Dimana hyperplane tidak melewati titik $(0, 0)$.

Sama saja! $\mathbf{w}$ tetap harus tegak lurus dengan hyperplane, berapapun koordinatnya. Yang membedakan ialah karena tidak melewati titik $(0, 0)$ maka nilai $\mathbf{b}$ menjadi tidak nol lagi. Pada hyperplane diatas persamaan garis lurusnya ialah $x-y+2=0$. Jika kita gunakan notasi vector maka $\mathbf{w}=(1, -1)$ dan $\mathbf{b}=2$ atau $\mathbf{w}=(-1, 1)$ dan $\mathbf{b}=-2$.

$$\mathbf{w} \cdot \mathbf{x} + \mathbf{b} = (1, -1) \cdot (x, y) + 2 = x-y+2 = 0$$

$$text{atau}$$

$$\mathbf{w} \cdot \mathbf{x} + \mathbf{b} = (-1, 1) \cdot (x, y) – 2 = -x+y-2 = x-y+2=0$$

SVM: What is Support Vector Machine?

Support Vector Machine (SVM) merupakan salah satu algoritma machine learning yang berguna untuk menyelesaikan masalah klasifikasi.

Misalnya kita punya data seperti pada gambar dibawah ini. Ada dua atribut input Tinggi dan Berat Badan dan sebuah atribut output Jenis Kelamin(Laki-laki/Perempuan). Kita ingin mengklafisikasikan data baru apakah Laki-laki/Perempuan.

Kalo ada sebuah data baru seperti ini, kira-kira output Laki-laki atau Perempuan?

Kalo ini?

Dan kalo ini?

 

Bingung kan lo yang terakhir? Kenapa bingung, karena data baru tersebut berapa pada daerah peralihan antara Laki-laki dan Perempuan. Semakin jauh suatu data baru dari daerah peralihan ini maka kita akan semakin yakin terkait klasifikasi yang kita buat, begitu pula sebaliknya. Lalu seperti apa bentuk daerah peralihan tersebut?

Sebenarnya kita bisa saja membuat sebuah garis yang membagi dua area seperti pada gambar berikut. Garis tersebut membagi dua kelas sehingga semua instance yang kelasnya Laki-laki berada pada sisi kanan dan semua instance yang kelasnya Perempuan berada pada sisi kiri. Jika ada data baru pada area sebelah kanan maka outputnya Laki-laki, dan jika pada area sebelah kiri maka outputnya Perempuan.

Tapi masalahnya, ada banyak kemungkinan untuk membuat garis  tersebut. Garis tersebut bisa digeser sedikit keatas atau kebawah, atau dirotasi, tanpa mengubah hasil klasifikasi. Lalu mana yang harus kita pilih?

Oke, kita coba satu-satu. Bagaimana jika hyperplane yang ini?

Ups, ternyata ketika ada data baru klasifikasi yang dihasilkan pada salah.

Oleh karena itu, hyperplane yang kita pilih ialah yang paling jauh dari kedua kelas, tidak condong ke salah satu kelas, baik kelas Laki-laki maupun Perempuan. Hal ini akan menghasilkan generalisasi yang lebih baik.

Maximal Margin Classifier

Dari sebuah hyperplane, kita bisa mengukur jarak antara hyperplane tersebut dengan data yang paling dekat. Nah yang disebut dengan margin merupakan dua kali jarak antara hyperplane dengan titik terdekatnya.

Semakin condong suatu hyperplane terhadap suatu titik terdekat maka semakin kecil pula marginnya. Terlihat pada gambar di bawah ini, margin hyperplane yang Dan satu catatan bahwa tidak ada instances yang terletak dalam margin.

Tujuan dari SVM ini ialah bagaimana menemukan hyperplane yang optimal, yang memiliki margin yang paling besar. Dengan margin yang besar ini diharapkan hasil generalisasi akan lebih baik sehingga dapat meningkatkan akurasi classifier. Dan titik-titik yang terdekat dengan hyperplane disebut support vector, karena perubahan yang terjadi pada titik-titik ini maka dapat pula mengubah hyperplane.

Solving Quadratic Programming Problems using Octave

In this post I’m going to show you how to solve quadratic programming problems using Octave. Octave is an alternative to Matlab, with an advantage of being free.

Suppose we want to solve a Quadratic Programming problem with standard form like this:

\begin{align} \text{minimize  } & \frac{1}{2}x^THx+f^Tx \\\\ \text{subject to  } & Bx=b \\\\ & lb \le x \le ub \\\\ &a\_lb \le Ax \le a\_ub \end{align}

This standard form provides more flexible format, it allows the usage of lower and upper bound in inequality. So you don’t need to rewrite the constraints. In Octave, this problem can be resolved by using $qp()$ function. The function can accept less or more variable as input with the output of an array of 4 variables. You can tailor the input corresponding to your QP problem.

[x, z_min, info, lambda] = qp (x0, H)
[x, z_min, info, lambda] = qp (x0, H, f)
[x, z_min, info, lambda] = qp (x0, H, f, B, b)
[x, z_min, info, lambda] = qp (x0, H, f, B, b, lb, ub)
[x, z_min, info, lambda] = qp (x0, H, f, B, b, lb, ub, a_lb, A, a_ub)
[x, z_min, info, lambda] = qp (…, options)
 $x0$  An optional initial guess for $x$. To leave it empty, use $[]$ as its value.
 $x$  Vector that minimizes objective function subject to all bounds and linear constraints. $x$ can be a local minimum for nonconvex problems. For convex problems, $x$ is a global minimum.
 $z\_min$  Value of objective function at the solution $x$ (minimum), a double
$info$  An integer indicating the status of the solution.
$0$ : The problem is feasible and convex. Global solution found.
$1$ : The problem is not convex. Local solution found.
$2$ : The problem is not convex and unbounded.
$3$ : Maximum number of iterations reached.
$6$ : The problem is infeasible.
$lambda$  Structure containing the Lagrange multipliers at the solution $x$

Example

\begin{align} \text{minimize  } & f(x)  = \frac{1}{2}x_1^2+x_2^2-x_1x_2-2x_1-6x_2 \\\\ \text{subject to  } & 1\le x_1+x_2\le 2 \\\\ & -x_1+2x_2\le 2 \\\\ & 2x_1+x_2\le 3 \\\\ & 0\le x_1 \\\\ & 0\le x_2 \end{align}

Answer:

First, we have to convert our objective and constraint function into standard format using matrix notation.

\begin{align} \text{minimize  } & f(x)=\frac{1}{2} \begin{bmatrix}x_1\\x_2\\ \end{bmatrix} \begin{bmatrix}1&-1\\-1&2\\ \end{bmatrix} \begin{bmatrix}x_1&x_2\\ \end{bmatrix}+\begin{bmatrix}-2\\-6\\ \end{bmatrix} \begin{bmatrix}x_1&x_2\\ \end{bmatrix} \\\\ \text{subject to  } & \begin{bmatrix}1\\-Inf\\-Inf\\ \end{bmatrix}\le \begin{bmatrix}1&1\\-1&2\\2&1\\ \end{bmatrix} \begin{bmatrix}x_1\\x_2\\ \end{bmatrix} \le \begin{bmatrix}2\\2\\3\\ \end{bmatrix} \\\\ & \begin{bmatrix}0\\0\\ \end{bmatrix}\le \begin{bmatrix}x_1\\x_2\\ \end{bmatrix} \end{align}


>> H = [1 -1; -1 2]
>> f = [-2; -6]
>> A = [1 1; -1 2; 2 1]
>> a_lb = [1; -Inf; -Inf]
>> a_ub = [2; 2; 3]
>> lb = [0; 0]

>>[x, z_min, info, lambda] = qp ([], H, f, [], [], lb, [], a_lb, A, a_ub)
x =
     0.66667
     1.33333

z_min = -8.2222
info =
     scalar structure containing the fields:
     solveiter = 7
     info = 0

lambda =
     0.00000
     0.00000
     0.00000
     3.11111
     0.44444
     0.00000

Decision Tree Learning: Pruning in C4.5 Algorithm

Pruning is a way to make a decision tree simpler so it makes more generalization of the data better, leading to more accurate prediction and more readable interpretation. By this way, we can avoid overfitting. There are some methods in pruning, one of them is what C4.5 algorithm does. It’s called pessimistic pruning and based on statistical correction. Moreover, it takes only training set to build the tree and doesn’t need validation set or test set to estimate errors while pruning. We can make pessimistic estimate of the error rate by using the upper confidence limit (one-tail), which calculated with this formula:

$$e=\frac{f+\frac{z^2}{2N}+z \sqrt{\frac{f}{N}-\frac{f^2}{N}+\frac{z^2}{4N^2}}}{1+\frac{z^2}{N}}$$

where $N$ is the number of samples, $f=\frac{E}{N}$, $E$ is number of errors, and $z$ is z-score for confidence interval $c$. As the default, C4.5 will use 25% confidence interval so that $z=0.67$ (you can get the z-score by looking at Z table).

I will recall a decision tree from this post to make example how pruning is conducted. DT below is the process of pruning.

First, we start from the lowest level of node, which is health plan contribution. We’re going to compare errors before and after pruning.

Node: Health Plan Contribution

Before Pruning

 Branch  $E$  $N$  $f$  $e$
 None  2  6  0.33  0.47
 Half  1  2  0.5  0.72
 Full  2  6  0.33  0.47

So instead of 33%, 50%, and 33% error rates from each branch, we will use the pessimistic estimate of 47%, 72%, 47% respectively. The final error is weighted error from three branches or leaves.

$\text{Final error}=\frac{6}{14}\times 33\text{%} + \frac{2}{14}\times 50\text{%} + \frac{6}{14}\times 33\text{%}=51%$

After Pruning

We’ll compute estimated error if this node is replaced by a majority class. This node has 9 bad examples and 5 good examples.

 Node  $E$  $N$  $f$  $e$
 Health Plan Contribution  5  14  0.36  0.46

You can see the estimated error after pruned is lower than before pruned, it means that the pruning is worth it. So this node will be replaced by majority class, which is bad.

Node: Working Hours per Week

Before Pruning

 Branch  $E$  $N$  $f$  $e$
<=36  1  2  0.5  0.72
>36  5  14  0.36  0.46

$\text{Final error}=\frac{2}{16}\times 72\text{%} + \frac{14}{16}\times 46\text{%}=50%$

After Pruning

 Node  $E$  $N$  $f$  $e$
Working Hours per Week  6  16  0.375  0.48

Since the estimated error after pruned is lower than before pruned, the node is replaced by a majority class, bad.

Note

Although this method gives better performance and quite fast, it often doesn’t prune enough. But we can improve the quality of decision tree by tuning parameter. In this case, we can change the underlying confidence interval (25%), into a more better number. This confidence interval also plays control on determining how strict our pruning would be. For example, increasing confidence interval will make z-score bigger and in turn the estimated error become more larger. As consequence, it’s harder to prune the tree (error before pruning >> error after pruning) and the decision tree will overfit. Simply put, too higher CI = overfit and too lower CI = underfit.

 

Reference:

Data Mining: Practical Machine Learning Tools and Techniques

Decision Tree Learning: Handling Numeric Attributes

Tidak semua data yang kita punya memiliki atribut kategori. Walaupun merupakan masalah klasifikasi tapi adakalanya data yang kita punya terdiri dari satu atau lebih atribut yang memiliki nilai numerik. Sejauh ini gw hanya membahas bagaimana splitting untuk data yang terdiri dari atribut kategori. Lalu bagaimana memilih node atau splitting ketika ada atribut yang nilainya numerik? Kita coba gunakan dataset berikut.

Cuaca Suhu Kelembapan Berawan Main
 Cerah  85  85  Tidak  Tidak
 Cerah  80  90  Ya  Tidak
 Mendung  83  86  Tidak  Ya
 Hujan  70  96  Tidak  Ya
 Hujan  68  80  Tidak  Ya
 Hujan  65  70  Ya  Tidak
 Mendung  64  65  Ya  Ya
 Cerah  72  95  Tidak  Tidak
 Cerah  69  70  Tidak  Ya
 Hujan  75  80  Tidak  Ya
 Cerah  75  70  Ya  Ya
 Mendung  72  90  Ya  Ya
 Mendung  81  75  Tidak  Ya
 Hujan  71  91  Ya  Tidak

Seperti yang gw tuliskan di tulisan sebelumnya, langkah pertama yang harus dilakukan ialah menghitung entropi atau information gain untuk setiap atribut. Tapi bagaimana menghitung entropi untuk atribut numerik? Caranya ialah kita urutkan dataset berdasarkan atribut tersebut kemudian kita bagi menjadi dua kategori, misalnya untuk atribut Suhu kita bagi dataset menjadi dua berdasarkan threshold, yaitu yang memiliki Suhu <= 71.5 dan Suhu > 71.5. Nilai threshold merupakan nilai tengah antara 2 data, dalam hal ini 71.5 merupakan nilai tengah antara 71 dan 72. Setelah terbentuk dua kategori ini barulah kita hitung entropinya.

 64  65  68  69  70  71  72  75  80  81  83  85
 yes  no  yes  yes  yes  no  no
yes
 yes
yes
 no  yes  yes  no

$$E(\text{Suhu})= P(\text{Suhu<=71.5}) \times E(\text{Suhu<=71.5}) + P(\text{Suhu>71.5}) \times E(\text{Suhu>71.5})$$

$$E(\text{Suhu})= \frac{6}{14} \times E(4, 2) + \frac{8}{14} \times E(5, 3)$$

$$E(\text{Suhu})=0.939$$

Lalu Gain dihitung seperti biasa. Tapi bagaimana mendapatkan threshold tersebut? Klasik, kita coba semua kemungkinan threshold lalu cari yang menghasilkan entropi paling rendah. Jadi ada $m-1$ kemungkinan, dengan $m$ merupakan jumlah nilai unik pada atribut numerik. Pada atribut suhu diatas terdapat 11 kemungkinan (64.5, 66.6, …, 84) dan kita hitung entropi berdasarkan 11 threshold tersebut.