Friday, July 8, 2022

Sistem rekomendasi Content-based Filtering menggunakan PHP - MySQL (part 1)

Sebelum menyimak dan mengikuti tutorial dalam membangun sistem rekomendasi berbasis konten (content-based filtering) di artikel ini, sebaiknya membaca terlebih dahulu 2 artikel yang saya tulis sebelumnya, karena hal tersebut berkaitan dan saya menggunakan case/domain yang sama seperti sebelumnya.

Berikut artikel yang berkaitan dengan posting ini:

  1. Preprocessing text Bahasa Indonesia di PHP dengan Sastrawi
  2. Menghitung TF-IDF menggunakan kode PHP
Domain item yang akan saya bahas disini adalah data hotel, seperti pada artikel-artikel sebelumnya. Tahapan dalam membangun aplikasi sistem rekomendasi ini diawali dengan melakukan preprocesisng menggunakan library Sastrawi yang ada di PHP, dilanjutkan dengan melakukan pembobotan kata menggunakan metode TF-IDF dan terakhir adalah mengukur jarak kedekatan(similarty) dari 1 item ke item lainnya.

Pada artikel ini akan saya bahas bagian terakhir, yaitu menghitung similarity antar item menggunakan metode cosine similarity dan membuat top-n rekomendasi berdasarkan item yang dipilih. Kedua tahapan sebelumnya sudah ada di artikel yang saya sertakan link diatas 👆.

Cosine similarity

Untuk memudahkan pemahaman cara kerja cosine similarity, saya akan gunakan Spreadsheet untuk perhitungan nya dengan menggunakan contoh data hotel seperti pada case di artikel sebelumnya. Pada contoh data ini terdapat 3 dokumen dan 10 terms/kata yang akan kita ujicoba untuk perhitungan dan sudah kita beri bobot untuk masing-masing terms. Selanjutnya untuk menghitung similarity 2 item kita gunakan rumus berikut:

Pertama kita akan hitung terlebih dahulu sumproduct dari item A dan B, selanutnya kita bagian dengan perkalian panjang vektor A dan B. Pada Spreadsheet kita bisa gunakan formula SUMPRODUCT() sendangkan panjang vektor kita gunakan rumus SQRT(SUMSQ()).

Hasil dari pembobotan kata pada setiap dokumen

Berikut ini contoh rumus dari file Spreadsheet diatas untuk mencari similarity dari item d1 dan d2:

=SUMPRODUCT(C17:L17,C18:L18)/(SQRT(SUMSQ(C17:L17))*SQRT(SUMSQ(C18:L18)))

Selanjutnya kita bisa buat matrix untuk menghitung setiap dokumen. Score cosine similarity mempunyai rentang dari 0 - 1, yang artinya nilai mendekati 1 bearti kedua item tersebut sangat mirip, sedangkan mendekati 0 artinya kedua item tidak mirip. Perhitungan kedua item yang sama akan menghasilkan nilai 1.

Matrix perhitungan similaity antar item

Silahkan tuliskan alamat email anda di bagian komentar jika ingin mendapatkan file Spreadsheet untuk perhitungan seperti pada gambar diatas.

Cosine similarity di PHP

Berdasarkan perhitungan dari Spreadsheet dan rumus diatas, di PHP kita dapat membuat fungsi baru untuk mencari similarity antara 2 item dan mengurutkan hasil kemiripan score dari yang paling besar.

# Fungsi menghitung similarity ke semua dokumen
# parameter input = id dari item
public function similarity($d1){
    $score = [];
    foreach($this->doc_weight as $ndw => $w){
        $score[$ndw] = $this->cosim($d1, $ndw);
    }
    
    arsort($score);
    return $score;
}

private function cosim($d1, $d2){
    $dw = $this->doc_weight;
    
    # sum square dari 2 doc
    $dw1 = $dw[$d1];
    $dw2 = $dw[$d2];
    
    $dx = 0;
    $dx1 = 0;
    $dx2 = 0;
    
    foreach($this->corpus_terms as $t => $terms){
        $dx += $dw1[$t] * $dw2[$t];
        $dx1 += $dw1[$t]*$dw1[$t];
        $dx2 += $dw2[$t]*$dw2[$t]; 
    }
    
    return round($dx / (sqrt($dx1) * sqrt($dx2)), 4);
    
}

Kedua fungsi diatas merupakan kelanjutan kode dari Tfidf.php pada artikel berikut ini: Menghitung TFIDF menggunakan kode PHP, yang perlu anda tambahkan di class Tfidf. Selanjutnya pada file index.php anda bisa menjalankan fungsi tersebut dengan menggunakan parameter index array sebagai dokumen kunci yang akan dicari kemiripannya.

$hotel = array();
$hotel[1] = "Hotel Modern yang Terjangkau";
$hotel[2] = "Akomodasi modern, nyaman, dan tenang";
$hotel[3] = "Hotel bintang 3 yang mewah namun dengan harga yang terjangkau";

foreach($hotel as $key=>$item){
    $hotel[$key] = pre_process($item);
}

$cbrs = new Tfidf();
$cbrs->create_index($hotel);
$cbrs->idf();
$w = $cbrs->weight();  
$r = $cbrs->similarity(1);

print '<pre>';
print_r($r);
print '</pre>';

Dari kode diatas akan menghasilkan score kemiripan dari dokumen kunci(index array) sesuai dengan parameter yang di inputkan pada fungsi similarity.

Array
(
    [1] => 1
    [3] => 0.2062
    [2] => 0.1203
)

Pada posting berikutnya akan saya bahas detail bagaimana menggunakan dataset yang sudah tersimpan di tabel pada database MySQL untuk menampilkan item rekomendasi dari dokumen yang kita pilih.



Friday, July 1, 2022

Menghitung TF-IDF menggunakan kode PHP


Term Frequency, Inverse Document Frequency (TFIDF), merupakan sub-area dari Natural Language Processing(NLP) yang digunakan dalam information retrievel dengan tujuan untuk ekstrasi data. Sederhananya, bagaimana menghitung kemunculan setiap kata dalam dokumen dan memberi bobot pada setiap kata, dan menghitung skor untuk dokumen tersebut.

Sebelum kita bahas code di PHP, saya akan share penjelasan perhitungan manual TF-IDF menggunakan Spreadsheet atau Excel untuk memudahkan memahami cara kerjanya. Harapannya, anda bisa melakukan improvisasi code di bahasa pemrograman yang lainnya.

Pastikan sebelum mulai proses pembobotan kata dengan metode ini, text yang anda gunakan sudah melalui tahap preprocessing. Untuk preprocessing text di bahasa indonesia anda bisa menggunakan library sastrawi yang sudah saya bahas di artikel berikut ini: https://blog.ariflaksito.net/2022/04/preprocessing-text-bahasa-indonesia-di.html.

Berikut ini perhitungan di Spreadsheet menggunakan 3 dokumen seperti yang saya gunakan pada artikel preprocessing pada link artikel diatas.


Kolom token/term merupakan kata unique dari semua dokumen yang ada. Selanjutnya pada kolom tf, dibagi menjadi 3 dokumen untuk menghitung jumlah setiap kata yang ada di masing-masing dokumen. Pada kolom df akan menghitung jumlah kata yang muncul pada semua dokumen. Pada bagian ini kita hitung jumlah kemunculan, bukan jumlah total kata (digunakan rumus countif bukan sum). Kolom D/df merupakan pembagian dari jumlah dokumen (n) dan df. Jumlah dokumen yang kita gunakan untuk contoh perhitungan ini adalah 3.

Kolom IDF merupakan nilai log dari D/df, dan terkahir score tf-idf merupakan perkalian dari tf masing-masing dokumen dan token dengan nilai IDF. Hasilnya akan berupa matrix bobot dari dokumen dan term seperti pada gambar diatas.

Bisa anda tuliskan email di komentar jika menghendaki file Spreadsheet/Excel untuk contoh perhitungan  TF-IDF diatas.

Selanjutnya kita masuk pada inti pembahasan, yaitu membuat script PHP untuk perhitungan bobot kata seperti cara di Excel diatas. Pertama siapkan class dan beberapa fungsi di PHP, yaitu:

  • fungsi untuk mebuat index dari setiap kata
  • fungsi untuk menghitung idf
  • fungsi untuk menghitung weight/tf-idf

Terdapat 2 file pada code diatas, index.php dan Tfidf.php. Dimana fungsi-fungsi TF-IDF berada pada class Tfidf() di file Tfidf.php. Sedangkan file index.php digunakan sebagai input dokumen untuk menjalankan perhitungan tersebut.

Pada fungsi create_index() di class Tidf menjalankan proses untuk melakukan split setiap kata dan memberi informasi posisi dari setiap dokumen. Hasilnya bisa di lihat menggunakan fungsi show_index(). Fungsi idf() digunakan untuk menghitung menggunakan rumus log(D/df). Dan fungsi weight() untuk menghitung score/nilai dari tf-idf dari setiap kata/term di dokumen. Hasilnya berupa matrix/array dengan bobot pada setiap term di dokumen.

Berikut ini hasil dari kode tersebut, sama seperti pada perhitungan di excel diatas pastinya..

Array
(
    [1] => Array
        (
            [hotel] => 0.1761
            [modern] => 0.1761
            [jangkau] => 0.1761
            [akomodasi] => 0
            [nyaman] => 0
            [tenang] => 0
            [bintang] => 0
            [3] => 0
            [mewah] => 0
            [harga] => 0
        )

    [2] => Array
        (
            [hotel] => 0
            [modern] => 0.1761
            [jangkau] => 0
            [akomodasi] => 0.4771
            [nyaman] => 0.4771
            [tenang] => 0.4771
            [bintang] => 0
            [3] => 0
            [mewah] => 0
            [harga] => 0
        )

    [3] => Array
        (
            [hotel] => 0.1761
            [modern] => 0
            [jangkau] => 0.1761
            [akomodasi] => 0
            [nyaman] => 0
            [tenang] => 0
            [bintang] => 0.4771
            [3] => 0.4771
            [mewah] => 0.4771
            [harga] => 0.4771
        )

)

Referensi

  1. https://khozaimi.wordpress.com/2010/06/26/menghitung-tf-idf-engan-php/
  2. https://www.youtube.com/watch?v=B3UZ8DxHocQ&t=1s

Preprocessing text bahasa Indonesia di PHP dengan Sastrawi

 

the image was taken from https://www.analyticsvidhya.com

Bismillah.. setelah sekian lama belum ada artikel lagi, semoga bisa kembali produktif menulis di blog ini lagi dan terus konsisten  ✌.

Pada beberapa artikel sebelumnya terkait content-based filtering di Sistem rekomendasi, saya menggunakan salah satu library untuk preprocessing text yaitu Sastrawi di Python. Ternyata beberapa mahasiswa menanyakan penggunaan library tersebut di pemrograman PHP. Inilah salah satu alasan adanya artikel ini.

Source code dari Sastrawi bisa anda temukan disini: https://github.com/sastrawi/sastrawi. Library ini sudah ada pada beberapa bahasa pemrograman, seperti: Java, C, Python, Go, Rudy dan tentunya di PHP. Untuk menggunakan di PHP anda bisa melakukan instalasi menggunakan Composer. Apa itu composer? Silahkan beca artikel berikut ini: https://blog.ariflaksito.net/2018/08/berkenalan-dengan-composer.html

Pada terminal atau command line anda bisa menjalankan perintah berikut ini:
php composer.phar require sastrawi/sastrawi:^1

Library ini dapat digunakan untuk melakukan stemming di bahasa Indonesia, yaitu proses untuk menemukan kata dasar dari sebuat kata, dengan menghilangkan semua imbuhan termasuk dari awalan, sisipan, akhiran dan kombinasi dari awalan dan akhiran pada kata turunan.

Contohnya:

  • Menghilang = hilang
  • Terjangkau = jangkau
Selain itu, Sastrawi dapat juga digunakan untuk menghilangkan kata-kata yang memiliki arti tidak penting(stop-words) dalam proses pengolahan text, seperti: dan, atau, yang, dll.

Berikut ini code di PHP berupa fungsi untuk melakukan stemming dan menghapus stop-words:

Output dari code diatas sebagai berikut:

Array
(
    [1] => hotel modern jangkau
    [2] => akomodasi modern nyaman tenang
    [3] => hotel bintang 3 mewah harga jangkau
)

Dari output tersebut terlihat bahwa beberapa kata stop-words dan tanda koma (,) berhasil di hapus dan kata "terjangkau" diubah menjadi bentuk kata dasar "jangkau". Tahapan ini berguna untuk beberapa case berikutnya seperti: text classification, sentiment analysis atau yang akan saya bahas berikutnya yaitu menghitung pembobotan kata dengan TF-IDF untuk sistem rekomendasi berbasis content (content-based filtering).

Selamat mencoba..

Referensi

  1. https://adinyahya.com/cara-penerapan-stemming-dengan-menggunakan-library-sastrawi/
  2. https://github.com/sastrawi/sastrawi

Tuesday, December 7, 2021

Bedah kode Aplikasi Storage di Android

Storage/Media penyimpanan merupakan hal yang penting pada aplikasi berbasis mobile, salah satunya di Android. Berdasarkan data penyimpanan, di Android terdapat 2 jenis yaitu: data temporary dan data persistence. Data temporary umumnya diproses melalui internal storage dalam bentuk cache, sedangkan data persistence disimpan secara permanen dalam suatu file.

Pada artikel ini akan kita bahas jenis yang kedua yaitu data persistence. Android menyediakan beberapa solusi untuk menangani data persistence, tergantung dari sifatnya apakah private atau public. Beberapa solusi yang dipilih harus sesuai dengan kebutuhan spesifiknya, seperti apakah data yang disimpan akan bersifat private atau boleh diakses secara bebas (public) serta berapa banyak space yang dibutuhkannya. Selain itu, Android juga menyediakan cara untuk membuka data private ke aplikasi lain (apabila diperlukan), melalui Content Provider (inshaAllah akan dibahas di posting lainnya).

Images are taken from flaticon

Storage data persistence ini terbagi lagi menjadi 2 yaitu: 
  • Internal storage: direktori private yang hanya diakses pada aplikasi itu sendiri.
  • External storage: direktori public dapat diakses secara lebih luas pada aplikasi itu sendiri dan aplikasi lainnya.
Karakteristik internal storage:
  • Selalu tersedia/dapat diakses.
  • Menggunakan file sistem dari device.
  • Hanya bisa diakses pada aplikasi itu sendiri, kecuali secara eksplisit diatur agar dapat dibaca/tulis.
  • Saat aplikasi di-uninstall/clear data, sistem akan menghapus data di internal strorage.
Karakteristik exsternal storage:
  • Tidak selalu tersedia/dapat dihapus.
  • Menggunakan file sistem dari device atau external seperti SdCard.
  • World-readable, semua aplikasi dapat membaca.
  • Saat aplikasi di-uninstall, sistem tidak menghapus file tersebut.

Bedah kode aplikasi MyStorage

Langkah awal dengan membuat project baru di Android Studio, disini saya menggunakan nama aplikasi MyStorage dengan nama package net.ariflaksito.mystorage, minimal SDK adalah Android 5.0. Setelah itu di kita akan membuat contoh penggunaan internal dan external storage, pada MainActivity akan saya buat dua tombol untuk menuju ke activity InStorageActivity dan ExStorageActivity menggunakan Intent.

Jika anda ingin memahami lebih detail tentang Intent bisa disimak video berikut ini:


Silahkan anda siapkan layout seperti pada tampilan dibawah ini:

Tampilan awal MainActivity

Setelah itu kita bisa membuat 2 activity baru (Empty Activity) dengan nama : InStorageActivity dan ExStorageActivity. Untuk layout kedua activity tersebut, kita siapkan 4 Button dan 1 TextView seperti pada tampilan berikut :

Tampilan layout editor file

Untuk kode dari layout tersebut seperti dibawah ini:

Pada kode xml diatas kita perlu tambahkan beberapa resource di file strings.xml karena data-data text kita simpan di file res/values/strings.xml. Jika nanti diperlukan localize resource seperti aplikasi yang support multi bahasa lebih mudah dalam me-manage string tersebut.

Kode Activity Internal Storage

Selanjutnya kita edit bagian inStorageActivity. Pertama kita tambahkan class attribut nama-file, button dan textview seperti ini:

public static final String FILENAME = "myfile.txt";
Button btnCreate, btnEdit, btnRead, btnDelete;
TextView tvRead;

Selanjutnya kita set masing-masing komponen tersebut dan kita tambahkan label untuk ActionBar pada method onCreate( ) seperti berikut:

String title = getResources().getString(R.string.title_in_storage);
getSupportActionBar().setTitle(title);

btnCreate = findViewById(R.id.btn_create_file);
btnEdit = findViewById(R.id.btn_edit_file);
btnRead = findViewById(R.id.btn_read_file);
btnDelete = findViewById(R.id.btn_del_file);
tvRead = findViewById(R.id.tv_read);

Selanjutnya kita buat 4 method baru untuk menjalankan masing-masing fungsi, yaitu: createFile( ), editFile( ), readFile( ) dan deleteFile( ). Pada model internal storage kita gunakan fungsi getFilesDir( ) untuk meng-akses path dari storage. Untuk kode method createFile( ) seperti berikut:

void createFile() {
String isiFile = "Hello world!";
File file = new File(getFilesDir(), FILENAME);

FileOutputStream outputStream = null;
try {
file.createNewFile();
outputStream = new FileOutputStream(file, true);
outputStream.write(isiFile.getBytes());
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}

Secara lengkap kode fungsi-fungsi yang lain dalam Activity tersebut seperti berikut:

Lokasi/path dari myfile.txt tersebut pada device berada di /data/data/(package-name)/files/myfile.txt. Kita dapat melihat melalui device file explorer di Android Studio untuk lokasi file tersebut. Sedangkan dari device file explorer akses ke path tersebut tidak bisa kecuali device anda sudah di root.

Lokasi file di internal storage

Kode Activity External Storage

Pada metode penyimpanan external, kita perlu tambahkan beberapa kode untuk melakukan cek perijinan dari Android API 23 keatas. Selain mendefinisikan nama file, kita perlu mendefinisikan code request untuk kembalian dari cek perijinan tersebut. Selanjutnya kita siapkan method baru yaitu checkPermission( ) dan onRequestPermissionsResult( ).

Pada method tersebut aplikasi akan menampilkan alert/pop-up ke pengguna apakah pengguna memberikan ijin aplikasi untuk merubah data-data di storage. Jika pengguna menekan tombol allow maka akan dilanjutkan ke proses selanjutnya, jika tidak maka akses ke storage tidak bisa dilakukan oleh aplikasi.

Alert pada device untuk perijinan akses storage

Selain itu, untuk external storage ini perlu menambahkan code permission di AndroidManifest.xml yaitu sebagai berikut:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Pada element <application> di file manifest juga perlu ditambahkan atribut berikut: 

android:requestLegacyExternalStorage="true"

Untuk akses lokasi/path dari file tersebut, disni kita menggunakan method yang berada di class Environment, yaitu: Environment.getExternalStorageDirectory(). Pada method createFile( ) dan editFile( ) juga perlu ditambahkan validasi untuk cek apakah media storage tersebut sudah di mount atau belum dengan kode berikut:

String state = Environment.getExternalStorageState();

if (!Environment.MEDIA_MOUNTED.equals(state)) {
return;
}

Layout di activity ExStorageActivity menggunakan file yang sama pada activity sebelumnya. Untuk kode lengkap nya seperti dibawah ini:

Anda bisa ujicoba aplikasi tersebut dengan membuat file baru, melihat isi datanya, kemudian cek di device explorer, apakah sudah ada nama file tersebut. Selain itu anda bisa coba edit isi file dan hapus file.

Kesimpulan

Kapan kita perlu menggunakan internal dan external storage? Internal storage paling baik digunakan jika tidak ada yang boleh mengakses file selain aplikasi itu sendiri. Sebaliknya, external storage paling baik digunakan jika file tidak memerlukan batasan akses, file dapat di share ke aplikasi lain atau user diperbolehkan akses file melalui usb atau pc.

Sunday, September 12, 2021

Mengenal Regresi linear dan perhitungannya

Disini kita akan bahas salah satu model statistik yang umum digunakan untuk Machine Learning untuk melakukan prediksi dengan cara supervised learning, yaitu regresi linear. Metode ini melibatkan 2 variabel dimana salah satunya adalah variabel independen (x) dan satu lagi adalah variabel dependen (y)

  • Independen berarti variabel ini sebagai variabel utama yang mungkin akan mempengaruhi nilai variabel kedua (dependen). 
  • Dependen berarti nilai variabel ini akan tergantung dari nilai variabel independennya, jika korelasi tinggi maka dependensi juga tinggi.

Untuk memudahkan pemahaman, kita gunakan data sample berat dan tinggi badan dari 10 orang sebagai berikut ini:

Data Tinggi Badan(cm) : 151,174,138,186,128,136,179,163,152,131
Data Berat Badan (Kg) : 63, 81, 56, 91, 47, 57, 76, 72, 62, 48

Regresi Linear adalah proses mencari garis linear yang menujukkan korelasi antara kedua variabel tersebut, garis linear itu akan didapat dengan sebuah persamaan :

y = ax + b atau y = w1x + w0

dimana: 
a atau w1 adalah slope / gradient / coefficient
b atau w0 adalah intercept / bias

Ciri dari problem regresi ini adalah kasusnya diminta menebak angka. Jenis outputnya bersifat continuous. Contoh lain dari regresi ini misalnya menebak curah hujan, harga rumah, jumlah kendaraan pemudik, dsb.

Perhitungan Manual

Untuk mendapatkan nilai coef(A) dan intercept/bias(B) digunakan rumus:


Gambar diatas menjelaskan detail perhitungan dari rumus tersebut kedalam excel. Dalam mencari nilai coef A dan intercept/bias B di excel digunakan formula pada sheet berikut:

A =((C25*C24)-(C23*C21))/((C25*C22)-(C23*C23))
B =((C21*C22)-(C23*C24))/((C25*C22)-(C23*C23))

Menggunakan Python

Perhitungan di python lebih sederhana, dimana kita bisa menggunakan library sklearn, seperti pada contoh kode dibawah ini:

Nilai coef dan intercept didapatkan dari kode baris ke-19 dan-20 diatas, sehingga akan didapatkan persamaan linear sebagai berikut:

y = 0.674 * x + (-38.455)

Sedangkan hasil dari plot data seperti pada gambar dibawah, dimana garis merah merupakan nilai prediksi dari model linear regresi dan titik-titik biru adalah 10 data training yang digunakan.

Regresi Linear Berganda

Regresi Linear Berganda adalah model regresi linear dengan melibatkan lebih dari satu variable bebas/independen dan persamaannya adalah

y = a1x1 + a2x2 + .. + anxn + b

Untuk pembahasan prediksi menggunakan regresi liner berganda kali ini akan diambil dari paper yang telah dipublish oleh mas Ervan Triyanto di jurnal Rabit, Juli 2019. Kasus ini adalah prediksi jumlah produksi padi di kabupaten Bantul dengan data yang digunakan dari tahun 2009 sampai dengan 2017. Di penelitian tersebut perhitungan nya diimplementasikan ke dalam aplikasi web menggunana PHP sebagai bahasa pemrogramannya. Di artikel ini akan digunakan python untuk perhitungannya dengan alasan kemudahannya.

Downlod pada link ini untuk mendapatkan artikelnya.  

Terdapat 1 variabel dependen yaitu jumlah produksi padi (dalam ton), sedangkan terdapat 3 variabel independen yaitu: curah hujan, luas lahan dan tingkat serangan hama. 

Berikut contoh code di Python untuk menghitung kasus produksi padi diatas:

Dari data diatas, didapatkan persamaan untuk prediksi sebagai berikut:

y = 5.929528x1 + 118.27991767x2 -175.71483753x3 + 8306.792151921123
dimana: luas lahan(x1), curah hujan(x2) dan hama(x3)

Evaluasi

Evaluasi untuk model linear regresi dapat dilakukan dengan beberapa metrik evaluasi seperti: MAE (Mean Absolute Error), MSE (Mean Squared Error) atau RMSE (Root Mean Squared Erorr).

RMSE merupakan salah satu cara untuk mengevaluasi model regresi linear dengan mengukur tingkat akurasi hasil perkiraan suatu model. RMSE dihitung dengan mengkuadratkan error (prediksi – observasi) dibagi dengan jumlah data (rata-rata), lalu diakarkan. RMSE tidak memiliki persamaan:

Pada kode python diatas, evaluasi model dituliskan pada baris kode ke-50 dengan menggunakan library metrics dari sklearn dan didapatkan score RMSE yaitu: 3.5045

Kesimpulan

Meskipun Linear regresi mudah diimplementasikan untuk melakukan prediksi pada data yang bersifat continuous, tetapi terdapat juga kekurangannya yaitu mudah terjadi overfitting dan sulit dilakukan prediksi jika relasi antara variabel dipenden dan independen tidak linear atau korelasi sangat rendah.

Jika membutuhkan dataset tersebut bisa tulis email pada komentar ya.. Bisa anda gunakan untuk penelitian dengan metode machine learning lainya dan silahkan dibandingkan nilai errornya dengan penelitian ini.

Referensi

  1. Jimy, Regresi Linier dengan R dan Python, https://medium.com/@jrendz/regresi-linier-dengan-r-dan-python-ebb80662c6da
  2. Jasme Moody,What does RMSE really mean?, https://towardsdatascience.com/what-does-rmse-really-mean-806b65f2e48e
  3. Triyanto, E., Sismoro, H., & Laksito, A. (2019). Implementasi Algoritma Regresi Linear Berganda untuk Memprediksi Produksi Padi di Kabupaten Bantul. Rabit : Jurnal Teknologi Dan Sistem Informasi Univrab, 4(2), 73-86. https://doi.org/10.36341/rabit.v4i2.666

Friday, August 20, 2021

Menghitung Similarity dan Prediksi rating pada Collaborative filtering menggunakan Python

Melanjutkan artikel sebelumnya, bagaimana menghitung similarity antara user di sistem rekomendasi collaborative filtering(CF) dengan menggunakan excel, pada artikel ini saya akan share menghitung similarity user dan prediksi rating dengan menggunakan bahasa python di jupyter notebook.

Prediksi rating

Pada eksperimen ini akan digunakan sample data yang sama seperti pada artikel sebelumnya, lebih detail bisa anda simak disini: "Memahami Collaborative filtering di Sistem rekomendasi". Untuk pembahasan notebook tersebut saya bagi kedalam 2 bagian yaitu: User-based dan Item-based.

User-based CF Notebook

Pertama diperlukan membuat sample data dari library pandas yang kemudian kita susun menjadi matrix untuk user, item, dan rating. Pada matrix tersebut, nilai Nan/kosong di ubah menjadi rating dengan nilai 0.


Matrix user-based rating

Selanjutnya kita akan buat nilai rerata dari tiap user dan membuat matrix baru dengan nilai rating diambil dari selisih rerata dan rating asli.


Untuk menghitung similarity, dapat menggunakan library dari sklearn yaitu cosine_similarity. Disini kita perlu membuat suatu fungsi dengan parameter yaitu matrix rating, user aktif (yang akan kita cari nilai rating kosongnya) dan nilai k (jumlah tetangga/neighbor).


Output dari fungsi diatas akan menghasilkan nilai similarity dari user: Arif ke user lainnya berdasar dari matrix yang kita inputkan di parameter.

(['Don', 'Bob'], [0.7071067811865476, 0.30151134457776363])
Langkah terakhir adalah kita buat fungsi predict( ) untuk menghitung prediksi nilai kosong dari matrix tersebut pada user Arif di item-4.


Output dari fungsi tersebut adalah prediksi rating pada kolom item-4 seperti berikut:

array([[4.42526623],
       [1.93594684],
       [3.42953847]])

Item-based CF Notebook

Sedikit berbeda dengan code sebelumnya, pada code item-based ini kita akan melakukan prediksi pada beberapa rating kosong. Mari kita bedah code tersebut dari awal. Dimulai dari membuat matrix rating data sample data seperti pada postingan ini: "Memahami Collaborative filtering di Sistem rekomendasi".


Matrix item-based rating

Berikutnya kita bisa buat fungsi untuk menghitung similarity antara 2 item


Sedangkan fungsi predict( ) untuk item-based ini sedikit lebih complicated, berikut langkah-langkah penjelasannya:
  1. Perulangan pertama adalah menjadikan nilai setiap item menjadi list
  2. Perulangan ke-2 kita gunakan untuk memfilter rating 0 dari tiap user
  3. Didalam perulangan ke-2, terdapat perulangan lagi untuk menghitung nilai prediksi dengan membaca per-baris dari rating item.

Setelah kita running fungsi diatas, maka akan menghasilkan output dalam bentuk list beberapa rating prediksi dari rating 0 di matrix yang kita inputkan pada parameter.

[2.4899844588770113, 3.4286096052067627, 2.0]
Sebagai informasi, pada kedua kode diatas belum ada fungsi untuk mengenerate item rekomendasi, disini hanya fokus pada bagaimana menghitung nilai similarity dan prediksi saja. Jika anda ingin mendapatkan kode lengkap di file python notebook (*.ipynb), silahkan isi pada kolom komentar dengan email anda, inshaAllah akan saya share kode lengkap tersebut.

Referensi

  1. Gambar diambil dari https://www.formstack.com/resources/blog-new-rating-field
  2. User-based collaborative filtering, https://www.geeksforgeeks.org/user-based-collaborative-filtering/
  3. Item-based collaborative filtering, https://www.geeksforgeeks.org/item-to-item-based-collaborative-filtering/

Sunday, August 8, 2021

Keep productive during the pandemic


Since the beginning of 2020, most people have spent more than two-thirds of a day at home. Firstly, it seems enjoyable, because they do not need to go to school or the office as usual. However, it becomes hard to deal with it as time goes by since we are social creatures.

I really concede that it is a big problem when it happens to my students. The online meeting could not substitute offline classes where students learn and spend time discussing anything with their friends.

I will share amazing tips for students to deal with their mood to keep productive and finish studying on time.

1. Wake up early. 

Most computer engineering students enjoy doing their work, such as writing code, testing systems, or resolving bugs at midnight. Try to change your habit as I wrote in this article, "Kapan waktu efektif coding?"

2. Doing exercise

It is easy for people who have sport hobbies like cycling, running, or swimming to do it regularly. However, others think it will be a serious difficulty to start a routine exercise. You can download an exercise video from youtube, "7 minutes workout by Lifehack". I suggested starting small and regular ( twice or a third a week, every day will be better). For me, it is a tough moment; as a basketball fan, I should await my hobby activity until safe condition.

3. Clean up your desk and computer

It is believed that a tidy and clean workspace could maintain a great feeling. As a result, time will be productive to finish work. In this technology era, a computer is a vital part of students and workers. Unnecessary files in several folders sometimes make us frustrated. Allocate time for organizing this problem, although it is a dull activity.

Clean Downloads directory

4. Make it a habit

When you make any points above regularly, it is possible to become a healthy habit. Keep on track, and you will get advantages in your study.

Keep healthy. Stay strong!

Thursday, July 8, 2021

Memahami Collaborative filtering di Sistem rekomendasi

Collaborative filtering adalah teknik dalam sistem rekomendasi yang populer digunakan saat ini. Banyak penelitian yang membahas tentang teknik ini karena beberapa keunggulannya seperti: menghasilkan serendipity(tak terduga) item,  sesuai trend market, mudah diimplementasikan dan memumgkinkan diterapkan pada beberapa domain (book, movies, music, dll). 

Pengenalan sistem rekomendasi dan teknik lainnya bisa anda temukan pada artikel berikut:

Cara kerja teknik ini adalah dengan memanfaatkan data pada komunitas dengan cara mencari kemiripan atar pengguna, yaitu mengasumsikan bahwa pengguna yang memiliki preferensi serupa di masa lalu cenderung memiliki preferensi yang sama di masa depan. Pada dasarnya kita akan lebih percaya dengan rekomendasi dari orang yang memiliki preferensi sama dengan kita, inilah dasar yang digunakan oleh collaborative filtering dalam mengenerate item rekomendasi.


Dalam menghasilkan rekomendasi, sistem perlu mengumpulkan data. Tujuan dari pengumpulan data ini adalah untuk mendapatkan ide preferensi pengguna, dimana nantinya akan dibuat suatu rekomendasi berdasarkan preferensi tersebut. Terdapat 2 cara dalam mengumpulkan data, yaitu: Implicit dan Explicit.

Explicit merupakan cara pengumpulan informasi yang membutuhkan effort dari pengguna dengan memberikan feedback terhadap sistem, seperti mengisikan rating pada item (skala 1-5 atau skala lainnya) dan memilih tombol like atau dislike. Di sisi lain, implisit tidak membutuhkan interaksi dari pengguna ke sistem. Dengan kata lain, sistem secara otomatis mempelajari behavior dari pengguna saat menggunakan sistem, seperti melakukan perekaman informasi lama waktu saat melihat item, genre/kategori apa saja yang sering dilihat dan item apa saja yang pernah dibeli. Cara explisit lebih susah diterapkan, karena tidak semua pengguna melakukan penilaian terhadap item, hal ini yang akan menyebabkan kendala pada teknik collaborative filtering karena banyaknya rating kosong.

Collaborative filtering sendiri terbagi menjadi 2 bagian, yaitu Memory-based dan Model-based. Memory-based melakukan komputasi secara real-time, sedangkan Model-based menggunakan beberapa teknik di machine learning atau matrix factorization untuk melakukan training model terlebih dahulu dan bisa dilakukan secara offline. Memory-based memiliki keunggulan dalam hal kemudahan implementasi tetapi terkendala pada ukuran matrix besar yang menyebabkan scalablity dalam perhitungan. Teknik Memory-based terbagi ke dalam 2 class, yaitu: User-based dan Item-based. Teknik lain yaitu Model-based dengan beberapa metode seperti: Matrix factorization, Neural network, Bayesian, dll akan saya bahas di artikel lain. Kali ini saya akan detail bahas untuk yang Memory-based Collaborative filtering.

Kategori collaborative filtering


User-based vs Item-based CF

Memory-based collaborative filtering sering disebut juga dengan neighborhood-based collaborative filtering algorithms. Berikut ini penjelasan detail dari kedua class dalam Memory-based:

1. User-based collaborative filtering

Merupakan teknik yang digunakan untuk memprediksi item yang mungkin disukai pengguna berdasarkan penilaian yang diberikan pada item tersebut oleh pengguna lain yang memiliki selera yang sama dengan pengguna target. Berikut ini contoh penerapan dalam excel:



Pada matrix diatas, pengguna target adalah Arif, dimana kita akan memprediksi rating pada item_5. Tahap awal yang dilakukan adalah mencari pengguna yang memiliki preferensi sama dengan Arif. Lakukan perhitungan rata-rata rating dari setiap pengguna untuk item selain item_5, dihasilkan seperti berikut:



Kolom terakhir tersebut merupakan rata-rata dari tiap pengguna, misalkan Arif = (5+4+1+4)/4 = 3.50. Jika anda gunakan excel maka akan sangat cepat melakukan hitungan tersebut. Selanjutnya kita buat matrix baru yang berisi selisih dari rating asal dengan nilai rata-rata dari tiap pengguna.


Jika anda perhatikan rating Arif - item_1 didapatkan dari rating asal dikurangkan nilai rerata pengguna, yaitu:  5 - 3.5 = 1.5, rating Arif - item_2, yaitu:  4 - 3.5 = 0.5, dan seterusnya. Tahapan berikutnya adalah kita menghitung nilai similarity antar Arif dengan pengguna lainnya. Disini akan digunaan rumus cosine similarity yaitu seperti ini:

Misalkan kita akan hitung nilai similarity Arif dan Bob, maka didapatkan hasil seperti dibawah:

Dengan bantuan excel cukup kita drag saja rumus tersebut dan hasil dari similarity dari Arif dan ketiga pengguna lainnya adalah sebagai berikut:


Dari hasil perhitungan tersebut terlihat bahwa nilai similarity paling tinggi adalah antar Arif dengan Don yaitu 0.707. Nilai cosine similarity semakin besar nilai nya (mendekati 1) maka semakin mirip kedua vektor tersebut. Selanjutnya adalah prediksi rating untuk pengguna Arif pada item_5. Untuk menentukan prediksi ini kita bisa tentukan threshold/batas nilai kemiripan dari similarity pengguna, misalkan kita asumsikan similarity di dataset ini jika nilainya lebih dari 0.3, maka yang akan kita lakukan perhitungan data dari Arif, Bob dan Don. Clark tidak masuk perhitungan karena nilai similarity dibawah 0.3 (threshold yang kita tentukan). Untuk penentuan nilai threshold ini tidak ada aturan baku, jadi jika anda melakukan eksperimen silahkan di uji coba beberapa nilai threshold yang akan digunakan.

Dari rumus diatas kita bisa melakukan perhitungan untuk prediksi rating Arif ke item_5 dengan menggunakan neighbor Bob dan Don, yaitu nilai rerata Arif dijumlahkan dengan sigma dari nilai similarity antar pengguna dikalikan selisih rating dan rerata dibagi nilai absolute dari similarity beberapa pengguna tersebut.


Hasil dari prediksi rating tersebut (Arif - item_5) adalah 4.425. Bagaimana selanjutnya untuk mengenerate item rekomendasinya? Simulasi diatas hanya prediksi satu rating saja, untuk menghasilkan item rekomendasi kita bisa gunakan data real dengan jumlah data yang besar. Misalkan pada dataset real, rating Arif masih kosong di sejumlah item, misalkan item_5, item_13, item_104, item_451, item_533, dst. Dari hasil perhitungan prediksi pada rating-rating kosong tersebut, kita bisa urutkan dari rating besar ke kecil, kemudian iem-item berdasar rating tersebut bisa kita jadikan list sebagai item rekomendasi, kita juga bisa batasi sejumlah item saja(misal 5 item atau 10 item), atau biasa disebut Top-N recommendations.

2. Item-based collaborative filtering

Item-based collaborative filtering pertama kali digunakan oleh Amazon pada tahun 1998. Teknik ini tidak mencocokan kemiripan antar pengguna, tetapi melakukan pencocokan setiap item yang dinilai/rating pengguna dengan item serupa, lalu menggabungkan item serupa tersebut ke dalam daftar rekomendasi. Secara detail proses nya sebagai berikut:



Pada contoh dataset diatas, kita akan melakukan prediksi dari 3 rating kosong, yaitu: Arif - item_2, Bob - item_3 dan Don - item_1. Rumus yang kita gunakan masih sama pada user-based collaborative filtering, yaitu cosine similarity. Tahap awal adalah kita lakukan proses similarity dari ketga item tersebut, yaitu:

similarity item_1 dan item_2
i1 = 5(B1) + 3(C1)
i2 = 2(B2) + 3(C2)
sim(i1, i2) = (5*2)+(3*3)/sqrt(5^2 + 3^2) . sqrt(2^2 + 3^2) = 0.90

Perhatikan pada perhitungan diatas, hanya rating yang tidak kosong pada kedua item diatas yang dilakukan untuk perhitungannya, yaitu rating pada item_1 dan item_2 yang dinilai oleh Bob dan Clark.


Tabel diatas adalah hasil perhitungan di excel dari similarity ketiga item tersebut. Selanjutnya adalah kita lakukan prediksi untuk rating-rating kosong diatas. Berikut ini contoh perhitungan prediksi untuk rating(Arif, item_2) 

Dari hasil perhitungan di excel dari ketiga rating kosong tersebut didapatkan hasil seperti ini


Proses berikutnya dalam menghasilkan item rekomendasi sama seperti pada proses user-based diatas, yaitu dengan menghitung similarity antar item, melakukan prediksi rating kosong, kemudian melakukan ordering untuk dijadikan item rekomendasi.

Kesimpulan

Collaborative filtering merupakan teknik/paradigma yang populer digunakan dalam sistem rekomendasi. Terdapat 2 metode yang digunakan dalam collaborative filtering yaitu: memory-based dan model-based. Memory-based memiliki keunggulan dalam kemudahan proses perhitunganya tetapi memiliki kendala dalam scalabilty, karena metode ini berjalan secara real-time dan terkendala jika matrix user-item berukuran besar. Dua cara dalam perhitungan di memory-based, yaitu: user-based dan item-based, kedua teknik tersebut sama-sama memanfaatkan rating pengguna terhadap item dalam proses perhitungannya. Pada user-based dilakukan proses perhitungan similarity/kesamaan atara pengguna, sedangkan item-based melakukan proses perhitungan similarity antar item.

Bagaimana kita melakukan siimulasi perhitungan data berukuran besar, pastinya menggunakan excel akan sangat merepotkan. InshaAllah pada artikel berikutnya saya akan bahas cara perhitungan nya menggunakan python di jupyter notebook atau google colab.

Jika anda membutuhkan file excel dari perhitungan diatas, silahkan tuliskan alamat email pada kolom komentar, segera akan saya kirimkan file excel tersebut. Semoga bermanfaat!

Referensi

  1. Recommender System, A Computer Science Comprehensive Exercise, Carleton College, https://www.cs.carleton.edu/cs_comps/0607/recommend/recommender/collaborativefiltering.html
  2. Pengantar Recommender System, Yotube: Mas Baizal, https://www.youtube.com/watch?v=gu-tf3tzMgA&t=20s
  3. F.O.Isinkaye, et al, Recommendation systems: Principles, methods and evaluation, Egyptian Informatics Journal Volume 16, Issue 3, November 2015, Pages 261-273
  4. User-based collaborative filtering, https://www.geeksforgeeks.org/user-based-collaborative-filtering/
  5. Item-to-item based collaborative filtering, https://www.geeksforgeeks.org/item-to-item-based-collaborative-filtering/
  6. Item-based collaborative filtering in Python, https://predictivehacks.com/item-based-collaborative-filtering-in-python/


Saturday, April 17, 2021

Sistem rekomendasi Non-personalized vs Personalized

Di akhir pekan bulan Ramadhan ini kembali lagi saya akan share tentang salah satu topik menarik di sistem rekomendasi yaitu tentang personalisasi. Secara umum sistem rekomendasi terbagi menjadi tipe personalized dan non-personalized.

Sedangkan menurut Kim Falk dalam bukunya "Practical Recommender System" (silahkan bisa tulis alamat email di comment jika ingin versi PDF nya 😉), menjelaskan terdapat 3 tipe level dalam personalisasi ini, yaitu sebagai berikut:

Kim Falk - Practical Recommender System

Mari kita bahas lebih mendalam satu-persatu

1. Non-personalized

Merupakan tipe personalisasi yang sederhana, dimana hasil generate dari teknik rekomendasi ini tidak membedakan antar pengguna. Semua pengguna akan mendapatkan item rekomendasi yang sama. Biasanya digunakan untuk menampilkan item favorit pada film, produk terlaris di e-commerce atau top hits music chart di sistem rekomendasi musik. 

Pada tipe ini kita tidak perlu mengetahui informasi khusus tentang preferensi pengguna. Jadi, kita tidak mengumpulkan data historis dari penilaian atau pembelian pengguna untuk menghasilkan rekomendasi. Pada e-commerce biasanya terdapat juga mode rekomendasi seperti ini "People who buy X also buy Y", misalkan, Orang yang membeli Smartphone juga membeli Phone Cover.

Rekomendasi Non-personalized pada Amazon


Umumnya teknik rekomendasi yang digunakan pada Non-pesonalized yaitu IMDb weight rating atau Content-based filtering

2. Semi/Segment-personalized

Berikutnya adalah personalisasi dengan segmentasi khusus, sebagai contoh pengguna dengan kesamaan usia, lokasi, distinct pattern seperti pengusaha atau pelajar, akan mendapatkan rekomendasi yang sama berdasarkan segment tersebut.

Contoh lainnya adalah seperti pada sistem rekomendasi music yang dijalankan pada smartphone, dimana aplikasi tersebut dapat mendeteksi apakah pengguna sedang bergerak(jogging, running, cycling atau sedang mengemudi) atau pengguna tidak beraktifitas, seperti menikmati kopi di cafe sambil mendengarkan musik, maka item rekomendasi yang dihasilkan akan berbeda dari kedua segment tersebut.

Sistem ini tidak menggunakan history dari data anda, tetapi karena anda berada pada group atau segment tertentu maka akan mendapatkan item rekomendasi yang sama pada setiap segment. Metode yang digunakan pada tipe ini masih sama seperti pada tipe sebelumnya yaitu Non-personalized, dimana dengan tambahan filter berdasarkan segment yang bisa diambil dari informasi pengguna.

3. Personalized

Personalized recommendation ini didasarkan pada data tentang pengguna yang menunjukkan bagaimana pengguna telah berinteraksi dengan sistem sebelumnya. Dengan kata lain, pada rekomendasi ini akan dihasilkan item yang khusus pada masing-masing pengguna.

Tipe rekomendasi ini paling banyak digunakan pada beberapa layanan populer seperti Amazon, Netflix, Youtube, dsb. Hal ini dirasa paling sesuai dengan filter yang dibutuhkan setiap pengguna sehingga sangat perlu di implementasikan pada layanan tersebut. Terdapat 2 cara untuk mendapatkan interaksi dari pengguna ke sistem yaitu dengan cara implisit(browsing history) dan explisit(rating).

Collaborative filtering paling banyak digunakan pada tipe ini, dimana preferensi pengguna akan di komparasi kemiripannya dengan pengguna lain kemudian prediksi rating akan diterapkan untuk mendapatkan item rekomendasi tersebut.

Personalized recommendation di Netflix

Kesimpulan

Jika kita ingin membuat personalized recommendation, maka perhatikan data-data history rating dari pengguna. Jika terdapat pengguna baru dan belum ada history ratingnya, akan menyebabkan hasil rekomendasi kurang sesuai (biasa disebut cold start problem). Sedangkan pada tipe non-personalized dan segment-personalized tidak membutuhkan data rating tersebut, karena menggunakan atribut dari setiap item product.

Sistem rekomendasi dengan tipe Non-personalized merupakan cara yang sederhana, lebih jauh lagi dalam bukunya, Francesco Ricci - Recommender System Handbook, mengatakan bahwa tipe ini efektif dalam beberapa situasi tetapi penelitian tentang Recommender system tidak ditujukan untuk tipe ini.

Tidak perlu dishare artikel ini jika dirasa tidak bermanfaat yaa.. 

Referensi

    1. Anna Makharadze, 1) Introduction to Recommendation Systems, https://medium.com/machine-learning-and-artificial-intelligence/1-introduction-to-recommendation-systems-for-beginners-b50c86f5fccf
    2. Kim Falk, Practical Recommender System
    3. Francesco Ricci, Recommender System Handbook