<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Teknologi dan Pemikiran : Berpetualang di dunia Computer Vision, Machine Learning, dan Filsafat]]></title><description><![CDATA[Blog ini adalah tempat Anda untuk menjelajahi dunia computer vision, machine learning, dan deep learning. Serta merenungkan pemikiran di dalam buku dan filsafat.]]></description><link>https://emhaihsan.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Fri, 13 Nov 2026 16:44:05 GMT</lastBuildDate><atom:link href="https://emhaihsan.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Selayang Pandang Aplikasi Terdesentralisasi]]></title><description><![CDATA[Sedikit mengulas artikel sebelumnya, blockchain bisa dibayangkan sekilas sebagai database terdesentralisasi. Blockchain tidak bergantung pada satu server…]]></description><link>https://emhaihsan.hashnode.dev/selayang-pandang-aplikasi-terdesentralisasi</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/selayang-pandang-aplikasi-terdesentralisasi</guid><category><![CDATA[Blockchain]]></category><category><![CDATA[dapps]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Thu, 25 Sep 2025 14:42:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/IlUq1ruyv0Q/upload/5f4ac97529bb50b43592377f2db597cf.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sedikit mengulas <a target="_blank" href="https://emhaihsan.hashnode.dev/sekilas-tentang-blockchain">artikel sebelumnya</a>, blockchain bisa dibayangkan sekilas sebagai <strong>database terdesentralisasi</strong>. Blockchain tidak bergantung pada satu server sebagaimana sistem tradisional berjalan, namun dijalankan bersama oleh banyak node. Dengan adanya banyak node, maka kalau satu node mati, jaringan blockchain akan tetap berjalan karena data masih tersimpan di node lain.</p>
<p>Ethereum, yang merupakan jaringan terbesar kedua setelah Bitcoin, saat ini merupakan ekosistem paling populer untuk membangun aplikasi blockchain. Maka dari itu, belajar Ethereum ibarat memegang kunci masuk ke berbagai blockchain lain yang kompatibel dengannya, khususnya yang menggunakan runtime EVM.</p>
<h2 id="heading-transaksi-di-ethereum">Transaksi di Ethereum</h2>
<p>Jika kita bedah lebih dalam. Pada dasarnya suatu transaksi di dalam blockchain ethereum melalui tahapan berikut:</p>
<ol>
<li><p>Pembuatan transaksi.</p>
</li>
<li><p>Penandatanganan transaksi (signature membuktikan otoritas).</p>
</li>
<li><p>Transaksi disiarkan ke jaringan.</p>
</li>
<li><p>Transaksi masuk ke mempool (antrian).</p>
</li>
<li><p>Pengecekan oleh validator (apakah signature valid dan saldo cukup).</p>
</li>
<li><p>Transaksi masuk ke blok (block inclusion).</p>
</li>
</ol>
<p>Setiap transaksi di Ethereum memerlukan biaya yang disebut dengan <strong>gas</strong>. Besaran gas ini dikalikan dengan harga gas (ditentukan pasar berdasarkan supply dan demand) untuk menghasilkan biaya transaksi.</p>
<h2 id="heading-smart-contract">Smart Contract</h2>
<p>Kemudian ada <strong>smart contract</strong>, yaitu suatu program yang berjalan di jaringan blockchain. Karakteristik dari smart contract antara lain:</p>
<ul>
<li><p><strong>Self-executing</strong>: bisa berjalan sendiri ketika triggernya dipenuhi.</p>
</li>
<li><p><strong>Immutable</strong>: setelah di-deploy ke dalam jaringan, datanya tidak bisa diubah sama sekali.</p>
</li>
<li><p><strong>Deterministic</strong>: input yang sama akan menghasilkan output yang sama di semua node.</p>
</li>
<li><p><strong>Transparent</strong>: bisa dicek oleh siapa saja.</p>
</li>
</ul>
<p>Inilah yang menghilangkan peran middleman. Meskipun juga di sisi lain menimbulkan tantangan baru. Misalnya kalau ada bug ditemukan, tidak ada cara mudah untuk memperbaikinya. Oleh karena itu, sangat penting agar sebelum di deploy, smart contract perlu melalui rangkaian tes ketat agar bisa dipastikan keamanannya. Dari sini juga lahirlah kebutuhan akan profesi seperti <strong>smart contract auditor</strong>.</p>
<h2 id="heading-aplikasi-terdesentralisasi-decentralized-application-dapp">Aplikasi Terdesentralisasi (Decentralized Application / dApp)</h2>
<p><img src="https://miro.medium.com/v2/resize:fit:1400/format:webp/0*tfaR1_2Cvay0ErA6" alt class="image--center mx-auto" /></p>
<p>Sumber Gambar: <a target="_blank" href="https://commons.wikimedia.org/wiki/File:AppsVSdApps.jpg"><strong>wikimed</strong></a><a target="_blank" href="https://commons.wikimedia.org/wiki/File:AppsVSdApps.jpg"><strong>ia</strong></a></p>
<p>Istilah lain yang akan familiar ketika kita mulai belajar blockchain adalah Aplikasi Terdesentralisasi (Decentralized Application / dApp). Kalau dianalogikan vending machine, smart contract ibarat mesin di dalamnynya, dan dApp ibarat fisik mesin yang berinteraksi dengan pembeli.</p>
<p>Pada dasarnya, dApp adalah aplikasi frontend yang sama seperti aplikasi web pada umumnya. Akan tetapi ada unsur backend yang digantikan dengan smart contract on-chain. Keberadaan dApp lah yang menjadi jembatan interaksi blockchain dengan pengguna casual.</p>
<p>Manfaat integrasi blockchain yang terdapat pada dApp adalah transparansi yang lebih baik karena state-state penting tersimpan dengan baik di blockchain dan bisa dilihat siapa saja. Pada umumnya, suatu dApp setidaknya memiliki komponen berikut:</p>
<ul>
<li><p><strong>Frontend</strong>: UI/UX seperti biasa (misalnya React/Vue). Tugasnya memanggil fungsi smart contract dan menampilkan data on-chain.</p>
</li>
<li><p><strong>Wallet</strong> (MetaMask, RabbyWallet, Phantom dll): bertugas menandatangani transaksi/permintaan (signature), memastikan user benar-benar menyetujui aksi yang dilakukan.</p>
</li>
<li><p><strong>Provider / RPC node</strong>: Provider ini adalah layanan yang menerima RPC JSON calls dari frontend dan meneruskannya ke jaringan. Contoh providernya antara lain Infura, Alchemy, QuickNode.</p>
</li>
<li><p><strong>Smart contract</strong>: kode otomatis yang mengeksekusi kode-kode on-chain (transfer token, update state, dsb)</p>
</li>
</ul>
<h2 id="heading-tantangan-dapp">Tantangan dApp</h2>
<p>Karena terkoneksi dengan blockchain, maka otomatis juga dApp akan berkutat dengan tantangan-tantangan yang ada di teknologi blockchain pada umumnya. Misalnya dari masalah gas, otomatis user harus paham konsekuensi bahwa ada biaya dari aktivitas mereka. Kemudian untuk terkoneksi juga perlu memiliki wallet beserta addressnya. Lalu ada juga masalah latensi yang mungkin bisa terjadi ketika jaringan blockchain sedang padat-padatnya.</p>
<p>Blockchain pada dApp memang sebagian berfungsi sebagai penyimpanan data. Tapi bagaimana kalau datanya besar seperti gambar dan video?</p>
<p>Untuk kasus seperti ini, penyimpanan on chain tidak cocok karena akan memakan biaya yang sangat mahal. Sehingga praktik yang umum adalah menyimpan file di ipfs dan yang dicatat di blockchain hanyalah Content Identifier (CID) saja.</p>
<p>Selain itu, jika sebuah dApp hanya mengandalkan provider tertentu (misalnya Infura), maka ada risiko sentralisasi. Solusi bagi developer adalah menyediakan fallback provider, atau bahkan menjalankan node sendiri, meski hal ini akan butuh biaya dan tenaga lebih.</p>
<h2 id="heading-penutup">Penutup</h2>
<p>Jika dari sudut pandang awam. Mungkin banyak orang mengira bahwa teknologi blockchain hanya berkaitan dengan membuat koin baru. Padahal, saat ini yang menjadi inti pengembangan Web3 adalah <strong>dApp</strong>.</p>
<p>Blockchain adalah fondasi teknologinya.<br />Smart contract adalah mesinnya.<br />Dan dApp adalah wajah yang berinteraksi langsung dengan kita.</p>
<hr />
<blockquote>
<p><strong><em>Artikel ini berdasarkan catatan pembelajaran dari sesi kedua blockchain developer bootcamp di</em></strong> <a target="_blank" href="http://pelitabangsa.co.id/"><strong><em>Pelita Bangsa Academy</em></strong></a><strong><em>.</em></strong></p>
</blockquote>
<p>English Version: <a target="_blank" href="https://medium.com/p/994f340352ee"><strong>https://medium.com/p/994f340352ee</strong></a></p>
]]></content:encoded></item><item><title><![CDATA[Sekilas Tentang Blockchain]]></title><description><![CDATA[Kata “blockchain” mungkin sudah tidak asing lagi bagi masyarakat sekarang. Kalau mendengar kata blockchain, kebanyakan orang akan spontan terpikirkan…]]></description><link>https://emhaihsan.hashnode.dev/sekilas-tentang-blockchain</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/sekilas-tentang-blockchain</guid><category><![CDATA[Blockchain]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[Ethereum]]></category><category><![CDATA[Cryptography]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Tue, 23 Sep 2025 05:05:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/-GZJ-5EhMQo/upload/3f809f4c8dd29a0d1c5f5ab378d67208.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Kata “blockchain” mungkin sudah tidak asing lagi bagi masyarakat sekarang. Kalau mendengar kata blockchain, kebanyakan orang akan spontan terpikirkan tentang Bitcoin, trading atau NFT. Tapi sebenarnya, blockchain lebih dari itu. Blockchain lebih daripada sekadar “uang versi digital” / “uang internet”.</p>
<p>Agar bisa paham perlahan, mari kita kembali dari pertanyaan dasar.</p>
<p><strong>Kenapa blockchain perlu ada?</strong></p>
<p>Kita coba melihat ke dalam hal-hal yang ada sekarang di sekitar kita. Bank dengan segala transaksinya, lembaga pemerintah yang menyimpan dokumen negara, sampai rumah sakit yang memiliki rekam medis pasien, mereka semua menyimpan data ke dalam suatu server.</p>
<p>Nah, masalahnya adalah, misalnya server ini rusak atau diretas oleh orang jahat, panjang lah urusannya. Permasalahan inilah yang coba dipecahkan oleh blockchain, yaitu membuat sistem pencatatan digital yang <strong>tidak bergantung pada satu pihak</strong> dan <strong>tidak gampang diubah-ubah.</strong></p>
<h2 id="heading-kriptografi">Kriptografi</h2>
<p><img src="https://cdn-images-1.medium.com/max/1600/1*BRq4-EXPgiUK6R3Lhbo09w.png" alt="Image Source: emrecicek.net" class="image--center mx-auto" /></p>
<p>Sumber Gambar: <a target="_blank" href="https://emrecicek.net/en/symmetric-and-asymmetric-encryption-cryptography/"><em>emrecicek.net</em></a></p>
<p>Lalu bagaimana caranya agar catatan-catatan itu bisa dipercaya tanpa perlu tergantung sebagai lembaga sentral? Di sinilah kriptografi berperan.</p>
<blockquote>
<p>“Kriptografi adalah <strong><em>praktik melindungi informasi melalui penggunaan algoritme kode, hash, dan tanda tangan</em></strong>.”</p>
</blockquote>
<p>Pertama-tama, diperlukan semacam “sidik jari digital”. Hal ini bisa diperoleh dengan menggunakan <strong>hashing.</strong> Hashing sendiri adalah proses satu arah menggunakan suatu algoritma yang mengubah data input dengan ukuran berapa pun menjadi string karakter dengan ukuran tetap. Begitu suatu data di-hash, akan selalu didapat hasil yang unik. Ketika mengubah satu huruf saja, kodenya bisa berubah total.</p>
<p>Lalu bagaimana agar bisa terkirim dan diterima secara aman? Di sini ada tahapan enkripsi dan dekripsi terhadap pesan yang dikirim. Terdapat dua metode di sini, yang pertama enkripsi simetris di mana hanya ada satu kunci untuk mengunci dan membuka kunci dan enkripsi asimetris di mana terdapat sepasang kunci, yaitu kunci publik dan privat.</p>
<p>Model asimetris inilah yang menjadi dasar dari crypto address, kita memiliki private key yang hanya untuk pribadi dan public key yang bisa dilihat oleh semua orang. Kalau kita pernah membuat wallet, mungkin kita akan familiar dengan istilah “seed phrase“, nah di situ umumnya menjadi dasar dari provider-provider wallet untuk menghasilkan pasangan key yang bisa digunakan untuk berinteraksi dengan jaringan blockchain.</p>
<h2 id="heading-ethereum">Ethereum</h2>
<p><img src="https://cdn-images-1.medium.com/max/1600/0*Rz1WUIhnfwmu7ny_" alt class="image--center mx-auto" /></p>
<p>Sumber Gambar: <a target="_blank" href="https://unsplash.com/@kanchanara?utm_source=medium&amp;utm_medium=referral">Kanchanara</a> <a target="_blank" href="https://unsplash.com/@kanchanara?utm_source=medium&amp;utm_medium=referral">on Unspla</a><a target="_blank" href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">sh</a></p>
<p>Oke dengan kriptografi, hashing dkk data kita aman. Tapi bukankah implementasi blokchain di hari ini bukan sekadar tempat menyimpan data transaksi? Bagaimana kalau kita ingin menjalankan program di dalam blockchain?</p>
<p><strong>Ethereum</strong> kemudian muncul sebagai jawaban. Diperkenalkan oleh Vitalik Buterin pada 2013 dan diluncurkan resmi pada tahun 2015, Ethereum memperluas use case blokchain dengan <strong>smart contract.</strong> Suatu konsep yang diperkenalkan oleh Nick Szabo pada tahun 90-an. Pada konteks ethereum, smart contract adalah program yang berjalan otomatis di blockchain, tanpa perlu adanya perantara.</p>
<p>Sama seperti Bitcoin, Ethereum juga pada awalnya menggunakan mekanisme <strong>Proof of Work (PoW)</strong>. Di mana di baliknya ada ribuan komputer yang berlomba memecahkan fungsi matematis untuk membuat blok baru dan mendapatkan hadiah koin, proses perlombaan inilah yang biasa disebut dengan mining.</p>
<p>Namun pada saat ini, Ethereum menggunakan mekanisme <strong>Proof Of Stake (PoS)</strong>. Artinya, saat ini pembuatan blok baru ditentukan dengan “jaminan” ETH yang disetorkan oleh suatu node. Implikasinya adalah resource yang digunakan oleh ethereum saat ini lebih rendah dibandingkan saat masih menggunakan mekanisme <strong>PoW.</strong></p>
<h2 id="heading-tantangan-skalabilitas-pada-ethereum">Tantangan Skalabilitas pada Ethereum</h2>
<p><img src="https://cdn-images-1.medium.com/max/1600/0*zeXe9p-XepYB-5Yn.jpg" alt class="image--center mx-auto" /></p>
<p>Sumber Gambar: <a target="_blank" href="https://blog.pintu.co.id/wp-content/uploads/2024/05/layer2-ethereum.jpg">Pintu.co.id</a></p>
<p>Kemudian muncul masalah baru, semakin banyak yang menggunakan Ethereum, semakin padat jaringannya, ibarat jalan protokol di dalamnya sudah macet. Akibatnya, biaya transaksi di jaringan ethereum menjadi mahal.</p>
<p>Sebagai solusi, muncul istilah <strong>Layer 2.</strong> Sederhananya, Layer 2 ini mengumpulkan transaksi dalam satu bundel baru memasukkan ke dalam jaringan ethereum. Setidaknya ada dua jenis yang populer saat in:</p>
<ul>
<li><p><strong>Optimistic Rollup →</strong> Mengasumsikan transaksi sebagai valid, kecuali ada yang menggugat validitasnya.</p>
</li>
<li><p><strong>ZK-Rollup →</strong> Menggunakan metode kriptografi (Zero-Knowledge Proof) untuk membuktikan validitas transaksi.</p>
</li>
</ul>
<p>Dengan hadirnya Layer 2, transaksi bisa lebih mudah dan cepat, tapi tetap mendapatkan benefit keamanan dari ethereum.</p>
<h2 id="heading-akun-wallet-dan-gas">Akun, Wallet, dan Gas</h2>
<p>Lalu bagaimana caranya kita bisa nyambung ke blockchain?</p>
<p>Kalau kita bicara ethereum, ada dua jenis akun:</p>
<ul>
<li><p><strong>EOA (Externally Owned Account) →</strong> akun yang diakses oleh private key</p>
</li>
<li><p><strong>Contract Account →</strong> alamat dari smart contract yang berjalan sesuai dengan kodenya.</p>
</li>
</ul>
<p>Misalnya kita melakukan interaksi dengan smart contract menggunakan Metamask. Pada dasarnya EOA kita yang berinteraksi dengan menandatangani transaksi tersebut. Kemudian Blockchain mencatat dan menjalankan kontrak tersebut.</p>
<p>Nah, agar transaksi itu bisa diproses, kita perlu yang namanya <strong>gas.</strong> Seperti namanya, dia ibarat bensin untuk mobil. Tanpa adanya gas, transaksi tidak bisa berjalan. Besaran biayanya dipengaruhi oleh kompleksitas kode yang ada di dalanya (apakah sekadar kirim mengirim atau ada fungsi yang rumit) dan kondisi dari jaringannya (sedang sepi atau sedang padat).</p>
<p>Kemana larinya biaya gas yang kita bayarkan? Sebagian akan diberikan sebagai insentif kepada node validator yang memproses, sebagian akan dibakar. Tujuannya agar perputaran ekonomi di jaringan ethereum lebih sehat dan harganya stabil untuk jangka panjang.</p>
<h2 id="heading-penutup">Penutup</h2>
<p>Kalau kita tarik benang merah sejak awal. Teknologi ini masih terus berkembang, bahkan bisa ditarik benang merahnya sejak tahun 90-an saat Nick Szabo merumuskan konsep smart contract. Kemudian diimplementasikan oleh ethereum puluhan tahun kemudian. Lalu ada layer 2 dan semacamnya.</p>
<p>Maka dari itu, semakin mendalaminya, semakin kita bisa merasa bahwa teknologi ini bukan hanya sekadar hype. Tapi menjadi infrastruktur masa depan yang mungkin saja akan mengubah cara kita bertransaksi, berorganisasi, dan belajar.</p>
<hr />
<blockquote>
<p>Artikel ini berdasarkan catatan pembelajaran dari sesi pertama blockchain developer bootcamp di <a target="_blank" href="http://pelitabangsa.co.id">Pelita Bangsa Academy</a>.</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[Merenungkan Arah Tulisan Manusia di Tengah Gempuran Tulisan AI]]></title><description><![CDATA[Sebagai seseorang yang mempelajari AI secara formal di bangku kuliah, perkembangan AI yang sedemikian cepat seperti saat ini cukup mengejutkan saya. Saya…]]></description><link>https://emhaihsan.hashnode.dev/merenungkan-arah-tulisan-manusia-di-tengah-gempuran-tulisan-ai</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/merenungkan-arah-tulisan-manusia-di-tengah-gempuran-tulisan-ai</guid><category><![CDATA[AI]]></category><category><![CDATA[reflection]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Wed, 04 Jun 2025 03:19:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/y02jEX_B0O0/upload/405b0e55047d30d1f213810d8ba022e4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sebagai seseorang yang mempelajari AI secara formal di bangku kuliah, perkembangan AI yang sedemikian cepat seperti saat ini cukup mengejutkan saya. Saya masih ingat bagaimana rumitnya di awal membuat model klasifikasi gambar dasar menggunakan neural network ataupun membuat sentimen analisis dari 2 label yang berbeda.</p>
<p>Sekarang, perkembangan AI bisa dibilang cukup diluar nalar. Jika kita ingat saat GPT 3.5 pertama diperkenalkan secara luas di akhir 2022, model ini masih kesulitan melakukan banyak tugas terkait pemrograman. Tapi coba kita tengok sekarang (setidaknya tahun 2025 saat saya menulis ini), kita bisa melihat AI bisa membuat aplikasi full hanya dengan beberapa kali klik. GPT 3.5 yang sangat kuat di tahun 2022 mungkin tidak berkutik dengam model Open Source keluaran terbaru tahun 2025. Meskipun model GPT 3.5 sendiri jauh lebih kuat jika dibandingkan dengan pendahulunya termasuk model-model dasar yang banyak dipelajari sewaktu kuliah.</p>
<p>Layaknya pisau bermata dua, perkembangan AI juga menimbulkan kekhawatiran tersendiri. Dari sisi penulisan misalnya, semakin banyak tulisan-tulisan yang terindikasi dibuat oleh AI. Konten-konten ini membanjiri banyak platform seperti medium bahkan sampai jurnal ilmiah. Hal yang perlu direnungkan, bagaimana arah tulisan manusia nantinya?</p>
<h3 id="heading-apa-yang-bisa-diberikan-ai"><strong>Apa yang Bisa Diberikan AI?</strong></h3>
<p>Secara umum, AI bekerja dengan mempelajari pola yang ada pada data. Dia dilatih sedemikian rupa dengan data yang besar sehingga bisa menjawab masalah dalam banyak topik. Maka dari itu, kita mungkin bisa mendapatkan jawaban yang baik dari AI pada hal-hal yang sudah baku atau terdokumentasi dengan baik.</p>
<p>Sebagai seseorang yang juga pernah membuat konten menggunakan AI. Saya mengakui bahwa dalam banyak hal, AI bisa membuat tulisan yang lebih baik dari saya sendiri. Anda mungkin bisa melihat di sebagian konten-konten awal saya di medium.</p>
<p>Jika kita yang sering menggunakan AI, mungkin kita akan bisa mengenali pola tulisan yang dibuat oleh AI dibandingkan dengan manusia. Saya sendiri masih belum sepeka itu, tapi setidaknya menurut saya, hal yang menjadi kelebihan dari tulisan manusia adalah “ketidaksempurnaannya“.</p>
<hr />
<h3 id="heading-tulisan-bukan-hanya-soal-hasil-tapi-proses"><strong>Tulisan Bukan Hanya Soal Hasil, Tapi Proses</strong></h3>
<p>Bagi banyak orang, menulis bukan hanya sekadar untuk berbagi kepada orang lain, tapi juga refleksi untuk diri sendiri. Lewat tulisan, kita bisa melihat sekilas cara seseorang berfikir dan bercerita. Bagaimana seseorang bisa merefleksikan isi kepalanya ke dalam media tulisan.</p>
<p>Hal inilah yang membedakan manusia dengan AI. Sebagai program komputer, memang dia bisa membuat tulisan, tapi mungkin tidak memiliki “jiwa“ tersendiri seperti tulisan manusia. Tulisan AI cenderung teratur beserta dan memiliki style yang flat, hal ini disesuaikan dengan prompt yang ditentukan oleh user.</p>
<p>Keteraturan ini mungkin akan membuat kita sulit menemukan ikatan emosional antara pembaca dengan tulisan AI. Karena pada sebagian orang, menulis adalah proses eksistensial yang didalamnya juga menampung emosi dan perasaan penulisnya. Di sinilah tulisan manusia saya rasa akan tetap memiliki pangsa pasarnya tersendiri.</p>
<hr />
<h3 id="heading-berkolaborasi-atau-berkompetisi"><strong>Berkolaborasi atau Berkompetisi?</strong></h3>
<p>Di satu sisi, AI juga bisa membantu seseorang menulis tanpa harus bergantung 100% ataupun menghilangkan style penulisannya sendiri. Seorang penulis bisa saja menggunakan AI sebagai teman diskusi untuk tulisan-tulisannya. Ini tidak ada bedanya seperti peralihan penerimaan informasi dari yang dulu terpusat di buku kepada zaman internet.</p>
<p>Bisa dikatakan, saat ini kita berada di masa transisi pengumpulan informasi awal dari browsing ke prompting.</p>
<p>Tulisan-tulisan full AI memang bisa memberikan penjelasan yang lebih baik saat menjelaskan suatu dokumentasi kode misalnya dibandingkan manusia. Tapi, bagaimana pada topik yang berkaitan dengan pengalaman-pengalaman pribadi manusia? Tentu hal ini tidak bisa digantikan dengan AI.</p>
<p>Pilihan akhirnya kembali kepada kita, entah pesimis dan hanya meratapi dunia kita dipenuhi tulisan oleh AI atau tetap percaya bahwa akan selalu ada tempat untuk konten tulisan yang dibuat oleh manusia?</p>
<hr />
<h3 id="heading-belajar-dari-dunia-catur"><strong>Belajar dari Dunia Catur</strong></h3>
<p>Kita perlu sedikit menengok ke ranah yang pertama kali “dianggap kalah“ oleh komputer, dunia catur. Pada tahun 1997 (Jauh sebelum GPT 3.5 pada 2022), juara dunia catur Gary Kasparov kalah dalam pertandingan catur klasik melawan komputer Deep Blue. Lalu pertanyaannya, apakah dunia catur setelah itu? Kenyataannya tidak, dunia catur justru tetap bertumbuh.</p>
<p>Meskipun saat ini mungkin bisa dikatakan mustahil pemain manusia bisa mengalahkan mesin catur terbaik. Cabang olahraga catur yang dimainkan manusia tetap menjadi primadona tersendiri karena adanya sentuhan kreativitas manusia yang ditunggu-tunggu setiap pertandingannya. Adanya AI justru menjadi rekan latihan yang baik bagi para grandmaster untuk mengembangkan permainannya.</p>
<p>Begitu juga dengan tulisan, bisa saja bombardir tulisan AI yang membanjiri linimasa kita menjadi tonggak awal dari “gaya baru“ menulis manusia di era ini. Mungkin kita melihat bahwa tulisan hasil AI lebih baik pada sebagian topik. Tapi tetap saja, akan ada sisi di mana tulisan asli manusia akan lebih bersinar.</p>
<hr />
<h3 id="heading-penutup"><strong>Penutup</strong></h3>
<p>AI memang bisa menulis dengan baik, ia bisa membuat tulisan dengan analogi, penjelasan deskriptif dan hal-hal teknis lainnya.</p>
<p>Meskipun demikian, di tengah gempuran tulisan yang dibuat oleh mesin. Tulisan asli manusia tetap akan hidup dan akan selalu memiliki pasarnya tersendiri.</p>
<p>Terlebih lagi, menulis bukan hanya membagikan pemikiran kita kepada orang lain. Tetapi juga sebagai refleksi dari apa yang kita baca dan apa saja yang kita alami.</p>
]]></content:encoded></item><item><title><![CDATA[Mengenal Tipe Data Dasar dalam Solidity]]></title><description><![CDATA[Teknologi blockchain sudah mengubah paradigma cara berfikir generasi saat ini terkait dengan sistem yang terdesentralisasi, transparan dan dapat dipercaya…]]></description><link>https://emhaihsan.hashnode.dev/mengenal-tipe-data-dasar-dalam-solidity</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/mengenal-tipe-data-dasar-dalam-solidity</guid><category><![CDATA[Solidity]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[data types]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Thu, 23 Jan 2025 07:56:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/FquLC11A1AI/upload/258a30336657f743e4533cee1bb40f28.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Teknologi blockchain sudah mengubah paradigma cara berfikir generasi saat ini terkait dengan sistem yang terdesentralisasi, transparan dan dapat dipercaya. Di antara bagian penting meningkatnya adaptasi teknologi ini setelah fenomena kemunculan bitcoin adalah diperkenalkannya smart contract.</p>
<p>Smart contract sendiri merupakan program yang dapat berjalan sendiri dan berjalan dalam jaringan blockchain blockchain. Yang mana tiap transaksi ketika selesai akan bisa dilacak dan tidak dapat dibatalkan.</p>
<p>Jika kita mulai terjun ke dunia blockchain, belajar bahasa pemrograman Solidity yang digunakan untuk membuat smart contract di jaringan ethereum bisa dikatakan menjadi suatu keharusan. Karena meskipun banyak jaringan blockchain yang memiliki bahasa pemrograman tersendiri dalam pembuat smart contract, ethereum merupakan jaringan blockhain dengan kapitalisasi pasar terbesar kedua setelah bitcoin.</p>
<p>Pada artikel ini, kita akan mulai belajar dari sejumlah tipe nilai dasar bahasa pemrograman solidity yaitu <strong>boolean, unsigned integers, signed integers, string ,</strong> dan <strong>enums.</strong></p>
<h2 id="heading-unsigned-integers-uint">Unsigned Integers (<code>uint</code>)</h2>
<p><strong>Unsigned Integer</strong> merupakan jenis angka yang hanya bisa berisikan nilai positif. Tipe data ini ideal untuk digunakan pada kondisi-kondisi ketika kita tidak memerlukan angka negatif seperti membuat hitungan, id pengguna, dan lain-lain. Contoh:</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">UnsignedIntegerExample</span> </span>{
  <span class="hljs-keyword">uint8</span> <span class="hljs-keyword">public</span> a <span class="hljs-operator">=</span> <span class="hljs-number">100</span>; <span class="hljs-comment">// 0 -&gt; 255</span>
  <span class="hljs-keyword">uint16</span> <span class="hljs-keyword">public</span> b <span class="hljs-operator">=</span> <span class="hljs-number">10000</span>; <span class="hljs-comment">// 0 -&gt; 65535</span>

  <span class="hljs-comment">// uint is an alias for uint256</span>
  <span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> c <span class="hljs-operator">=</span> <span class="hljs-number">1000000000000</span>;
  <span class="hljs-keyword">uint256</span>  <span class="hljs-keyword">public</span> d <span class="hljs-operator">=</span> <span class="hljs-number">1000000000000</span>;
}
</code></pre>
<p>Di sini kita melihat beberapa tipe data unsigned integer yaitu <code>uint8</code>, <code>uint16</code>, <code>uint</code>, <code>uint256</code>. Lalu apa perbedaannya?</p>
<ul>
<li><p><code>uint8</code> mendeklarasikan unsigned integer 8-bit yang bisa menampung nilai dari 0 sampai 255.</p>
</li>
<li><p><code>uint16</code> mendeklarasikan unsigned integer 16-bit yang bisa menampung nilai dari 0 sampai 65535</p>
</li>
<li><p><code>uint</code> dan <code>uint256</code> sama-sama mendeklarasikan unsigned integer 256-bit, yang mana nilainya cukup besar yaitu <code>2^256 - 1</code> atau</p>
</li>
</ul>
<p>Tipe-tipe unsigned integer sendiri bervariasi tergantung pada maksimal bit data yang bisa ditampungya. Bervariasi di kelipatan delapan dari <code>uint8</code> sampai <code>uint256</code>.</p>
<h2 id="heading-signed-integers-int"><strong>Signed Integers (</strong><code>int</code>)</h2>
<p><strong>Signed Integer</strong> merupakan jenis angka yang bisa berisikan positif dan negatif. Tipe ini cocok digunakan untuk nilai-nilai yang memerlukan bilangan negatif seperti temperatur, perbedaan, ataupun skor. Contoh:</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">SignedIntegerExample</span> </span>{
  <span class="hljs-keyword">int8</span> <span class="hljs-keyword">public</span> a <span class="hljs-operator">=</span> <span class="hljs-number">10</span>; 
  <span class="hljs-keyword">int16</span> <span class="hljs-keyword">public</span> b <span class="hljs-operator">=</span> <span class="hljs-number">50</span>; 

  <span class="hljs-keyword">int256</span> <span class="hljs-keyword">public</span> c <span class="hljs-operator">=</span> a <span class="hljs-operator">-</span> b; <span class="hljs-comment">// result: -40</span>
}
</code></pre>
<p>Meskipun memiliki jumlah bit yang sama dengan unsigned integers. Rentang nilai yang direpresentasikan sedikit berbeda, karena signed integer bisa merepresentasikan angka negatif. Contohnya pada <code>uint8</code> rentang nilai ada dari 0 sampai 255, sedangkan pada <code>int8</code> rentang nilai ada dari <code>-128</code> sampai <code>127</code>.</p>
<p>Sama seperti unsigned integers, signed integers bisa dideklarasikan setiap 8 step yang mana setiap angka merepresentasikan jumlah bit yang dimiliki. Contoh <code>int8</code>,<code>int16</code>,<code>int32</code>,<code>int40</code> dan seterusnya sampai <code>int256</code>.</p>
<h2 id="heading-boolean-bool">Boolean (<code>bool</code>)</h2>
<p>Boolean merupakan tipe data yang hanya bisa berisikan dua nilai, <code>true</code> atau <code>false</code>. Umumnya boolean digunakan untuk pengkondisian ataupun state management.</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">BooleanExample</span> </span>{
  <span class="hljs-keyword">bool</span> <span class="hljs-keyword">public</span> isActive <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>; 
}
</code></pre>
<p>Kode <code>bool public isActive = true;</code> mendeklarasikan suatu state variable <code>isActive</code>, dan diinisialisasikan nilai <code>true</code>. Boolean akan banyak digunakan nantinya ketika kita ingin mengontrol suatu fitur di dalam kontrak terutama pada hal-hal yang berkaitan dengan pengkondisian.</p>
<h2 id="heading-string-string">String (<code>string</code>)</h2>
<p>String merupakan rangkaian karakter yang digunakan untuk menyimpan data teks. Contoh penggunaan string yang banyak digunakan adalah seperti menyimpan nama, deskripsi, ataupun suatu pesan di dalam smart contract.</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">StringExample</span> </span>{
  <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> greeting <span class="hljs-operator">=</span> <span class="hljs-string">"Hello, World!"</span>;
}
</code></pre>
<p>Kode <code>string public greeting = "Hello, World!";</code> menunjukkan pendeklarasian variabel <code>greeting</code> dan inisialisasi nilainya ke <code>"Hello, World!"</code>.</p>
<h2 id="heading-enums-enum">Enums (<code>enum</code>)</h2>
<p>Enum merupakan singkatan dari enumeration. Enum merupakan tipe data yang didefinisikan oleh user dan berisikan himpunan nama-nama opsi. Adanya enum akan membuat kode yang lebih mudah dibaca karena penamaannya yang sesuai dengan keinginnan pengguna.</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">EnumExample</span> </span>{
  <span class="hljs-keyword">enum</span> <span class="hljs-title">Choice</span> { Up, Down, Left, Right } <span class="hljs-comment">// Define an enum</span>
  Choice <span class="hljs-keyword">public</span> choice <span class="hljs-operator">=</span> Choice.Up; <span class="hljs-comment">// Declare an enum state variable</span>
}
</code></pre>
<p>Pada kode <code>enum Choice { Up, Down, Left, Right }</code>, kita mendefinisikan suatu enum yang kita beri nama <code>Choice</code>, di dalamnya terdapat empat pilihan yaitu <code>Up</code>, <code>Down</code>, <code>Left</code>, dan <code>Right</code>.</p>
<p>Kemudian pada <code>Choice public choice = Choice.Up;</code> dideklarasikan variabel <code>choice</code> lalu diinisalisasikan dengan <code>Up</code>. Penggunaan <code>enum</code> biasanya untuk merepresentasikan suatu state ataupun opsi-opsi pada smart contract seperti status pemesanan ataupun pilihan pada suatu mekanisme voting.</p>
<h2 id="heading-penutup">Penutup</h2>
<p>Pepatah lama mengatakan perjalanan 1000 mil dimulai dengan satu langkah dasar. Belajar tipe nilai seperti <strong>boolean, unsigned integers, signed integers, string,</strong> dan <strong>enums</strong> akan berguna sebagai pondasi awal smart contract yang akan kita buat.</p>
<p>Dengan memahami dasar, kita bisa memiliki pengetahuan untuk memilih jenis dan alur data yang akan kita gunakan saat membuat smart contract yang lebih kompleks nantinya.</p>
<p>Terimakasih sudah membaca artikel ini, sampai jumpa di artikel-artikel lainnya.</p>
<hr />
<p>Source Code : <a target="_blank" href="https://github.com/emhaihsan/blog-post-code/tree/main/2025/solidity-value-types">Github</a></p>
]]></content:encoded></item><item><title><![CDATA[Solidity Intro]]></title><description><![CDATA[Salah satu tonggak yang memicu perkembangan pesat dari block chain adalah adanya smart contract. Sistem ini memungkinkan orang untuk membuat aplikasi…]]></description><link>https://emhaihsan.hashnode.dev/solidity-intro</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/solidity-intro</guid><category><![CDATA[Solidity]]></category><category><![CDATA[Smart Contracts]]></category><category><![CDATA[Blockchain]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Mon, 21 Oct 2024 11:14:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/L2QB-rG5NM0/upload/9cf5c10ea511e81a6ac14b4f9a617da8.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Salah satu tonggak yang memicu perkembangan pesat dari block chain adalah adanya smart contract. Sistem ini memungkinkan orang untuk membuat aplikasi terdesentralisasi yang bisa dieksekusi pada jaringan blockchain tanpa perantara. Pada jaringan ethereum, bahasa pemrograman yang digunakan untuk membuat smart contract adalah ethereum.</p>
<p>Pada artikel ini, kita akan membahas sekilas dasar dari pemrograman solidity beserta contoh praktik membuat smart contract sederhana untuk ilustrasi penjualan rumah.</p>
<h2 id="heading-variabel">Variabel</h2>
<p>Variabel digunakan untuk menyimpan data di dalam smart contract. Terdapat dua jenis variabel pada solidity:</p>
<ul>
<li><p><strong>State Variable :</strong> Data tersimpan di dalam blockchain secara permanen dan hanya bisa diubah nilainya melalui fungsi.</p>
</li>
<li><p><strong>Local Variable :</strong> Data tidak disimpan di dalam blockchain dan hanya tersedia selama fungsi berjalan.</p>
</li>
</ul>
<pre><code class="lang-solidity"><span class="hljs-comment">// State variable</span>
<span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> totalSupply;

<span class="hljs-comment">// Local variable</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">incrementSupply</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> _amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
    <span class="hljs-keyword">uint</span> newSupply <span class="hljs-operator">=</span> totalSupply <span class="hljs-operator">+</span> _amount; 
    totalSupply <span class="hljs-operator">=</span> newSupply; 
}
</code></pre>
<p>Pada contoh ini <code>totalSupply</code> merupakan state variable dan <code>newSupply</code> merupakan local variable.</p>
<h2 id="heading-tipe-data">Tipe Data</h2>
<p>Solidity memiliki sejumlah tipe data yang bisa digunakan, di antaranya:</p>
<ul>
<li><p><strong>Integer :</strong> Menyimpan data bilangan bulat positif.</p>
<p>  <strong>Contoh:</strong></p>
<pre><code class="lang-solidity">  <span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> number <span class="hljs-operator">=</span> <span class="hljs-number">100</span>;
</code></pre>
</li>
<li><p><strong>Boolean</strong> : Menyimpan nilai <code>true</code> dan <code>false</code>.<br />  <strong>Contoh:</strong></p>
<pre><code class="lang-solidity">  <span class="hljs-keyword">bool</span> <span class="hljs-keyword">public</span> isNumber <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>;
</code></pre>
</li>
<li><p><strong>Address :</strong> Menyimpan alamat Ethereum.<br />  <strong>Contoh:</strong></p>
<pre><code class="lang-solidity">  <span class="hljs-keyword">address</span> <span class="hljs-keyword">public</span> owner <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>;
</code></pre>
</li>
<li><p><strong>String :</strong> Menyimpan data teks.<br />  <strong>Contoh:</strong></p>
<pre><code class="lang-solidity">  <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> name <span class="hljs-operator">=</span> <span class="hljs-string">"This is solidity"</span>;
</code></pre>
</li>
</ul>
<h2 id="heading-fungsi">Fungsi</h2>
<p>Fungsi merupakan blok kode yang digunakan untuk melakukan operasi dalam smart contract. Fungsi bisa digunakan untuk mengakses dan memodifikasi data. Struktur fungsi di dalam solidity terdiri dari nama, parameter, dan kode yang dieksekusi.</p>
<p>Fungsi juga memiliki visibilitas seperti <code>public</code>, <code>private</code>, <code>internal</code>, dan <code>external</code>.</p>
<p><strong>Contoh:</strong></p>
<pre><code class="lang-solidity"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addNumbers</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> a, <span class="hljs-keyword">uint</span> b</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint</span></span>) </span>{
    <span class="hljs-keyword">return</span> a <span class="hljs-operator">+</span> b;
}
</code></pre>
<p>Fungsi <code>addNumbers</code> menerima parameter integer berupa a dan b, kemudian mengembalikan hasil penjumlahan keduanya.</p>
<h2 id="heading-pure-view">Pure View</h2>
<p>Pada contoh fungsi sebelumnya, kita melihat ada term <code>pure</code>. Dalam solidity, keberadaan <code>pure</code> menandakan bahwa fungsi tersebut tidak membaca ataupun mengubah state dari smart contract. Selain <code>pure</code> terdapat juga modifier <code>view</code>, yang bisa digunakan untuk mengambil data dari state smart contract, namun tidak mengubahnya.</p>
<p><strong>Contoh:</strong></p>
<pre><code class="lang-solidity"><span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> totalSupply <span class="hljs-operator">=</span> <span class="hljs-number">100</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getTotalSupply</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint</span></span>) </span>{
    <span class="hljs-keyword">return</span> totalSupply;
}
</code></pre>
<p>Jika suatu fungsi tidak menggunakan modifier <code>pure</code> dan <code>view</code> maka ia merupakan fungsi standar yang bisa membaca dan mengubah state.</p>
<h2 id="heading-event-amp-emit">Event &amp; Emit</h2>
<p>Ketika kita membuat smart contract, kita ingin memberi informasi terkait sesuatu yang terjadi di dalamnya ke luar (aplikasi frontend). Pada kasus ini, kita menggunakan <strong>event</strong> dan <strong>emit.</strong></p>
<ul>
<li><p><strong>Event :</strong> Mendefinisikan log yang bisa dipantau oleh aplikasi eksternal.</p>
</li>
<li><p><strong>Emit :</strong> Memicu event dan menulis log ke dalam blockchain.</p>
</li>
</ul>
<p><strong>Contoh:</strong></p>
<pre><code class="lang-solidity"><span class="hljs-function"><span class="hljs-keyword">event</span> <span class="hljs-title">Transfer</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> <span class="hljs-keyword">indexed</span> <span class="hljs-keyword">from</span>, <span class="hljs-keyword">address</span> <span class="hljs-keyword">indexed</span> to, <span class="hljs-keyword">uint</span> amount</span>)</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">transfer</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> _to, <span class="hljs-keyword">uint</span> _amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
    <span class="hljs-keyword">emit</span> Transfer(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, _to, _amount); 
}
</code></pre>
<p>Pada hal ini, <code>emit</code> digunakan untuk memicu <code>transfer</code>, yang kemudian bisa ditangkap oleh aplikasi eksternal.</p>
<h2 id="heading-require">Require</h2>
<p>Fungsi <code>require</code> digunakan untuk memberikan validasi syarat sebelum eksekusi lanjut. Jika syarat yang diberikan tidak terpenuhi, maka eksekusi smart contract akan dihentikan.</p>
<p><strong>Contoh:</strong></p>
<pre><code class="lang-solidity"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">withdraw</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> _amount</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
    <span class="hljs-built_in">require</span>(_amount <span class="hljs-operator">&lt;</span><span class="hljs-operator">=</span> <span class="hljs-keyword">address</span>(<span class="hljs-built_in">this</span>).<span class="hljs-built_in">balance</span>, <span class="hljs-string">"Insufficient funds"</span>);
    <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>.<span class="hljs-built_in">transfer</span>(_amount); 
}
</code></pre>
<p>Pada fungsi <code>withdraw</code> di atas, <code>require</code> melakukan validasi apakah jumlah yang ingin ditarik lebih kecil atau sama dengan saldo yang tersedia di kontrak.</p>
<h2 id="heading-mapping">Mapping</h2>
<p>Konsep <code>mapping</code> mirip dengan hash atau dictionary pada bahasa pemrograman lain. Kegunaannya untuk memetakan nilai dari key yang unik pada nilai tertentu.</p>
<p><strong>Contoh:</strong></p>
<pre><code class="lang-solidity"><span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">uint</span>) <span class="hljs-keyword">public</span> balance;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">deposit</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
    balance[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">+</span><span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>;
}
</code></pre>
<p>Pada fungsi <code>deposit</code>, mapping <code>balance</code> menyimpan saldo ether pengguna berdasarkan alamat mereka. Ketika kita ingin menerima ether, fungsi harus menggunakan modifier <code>payable</code>. Jika tidak ada <code>payable</code>, fungsi tidak akan bisa menerima transaksi ether.</p>
<h2 id="heading-msg">Msg</h2>
<p>Untuk menyimpan informasi tentang transaksi yang sedang dijalankan, Solidity menyediakan variabel global bernama <code>msg</code>. Di antara property yang sering di gunakan pada <code>msg</code> adalah <code>msg.sender</code> yang memuat alamat pengirim transaksi dan <code>msg.value</code> yang memuat jumlah ether yang dikirim bersama transaksi.</p>
<p><strong>Contoh:</strong></p>
<pre><code class="lang-solidity"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">buyToken</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
    <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span> <span class="hljs-operator">&gt;</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span> <span class="hljs-literal">ether</span>, <span class="hljs-string">"Not enough ether sent"</span>);
}
</code></pre>
<p>Pada fungsi <code>buyToken</code>, <code>msg.value</code> digunakan untuk memeriksa apakah jumlah ether yang dikirim mencukupi.</p>
<h1 id="heading-contoh-smart-contract-penjualan-rumah">Contoh Smart Contract : Penjualan Rumah</h1>
<p>Sekarang mari kita praktekkan pembuatan smart contract. Di sini kita akan membuat smart contract sederhana untuk penjualan dan pembelian rumah. Berikut kode lengkap smart contract yang akan kita buat:</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.18;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Houses</span></span>{
    <span class="hljs-keyword">struct</span> <span class="hljs-title">House</span>{
        <span class="hljs-keyword">uint</span> id;
        <span class="hljs-keyword">string</span> houseAddress;
        <span class="hljs-keyword">uint</span> price;
        <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span> owner;
        <span class="hljs-keyword">bool</span> availability;
    }

    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">uint</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> House) <span class="hljs-keyword">public</span> housesList;

    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">uint</span>) <span class="hljs-keyword">public</span> sellerBalance;

    <span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> housesCount;

    <span class="hljs-function"><span class="hljs-keyword">event</span> <span class="hljs-title">HouseAdded</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> id, <span class="hljs-keyword">string</span> homeAddress, <span class="hljs-keyword">uint</span> price, <span class="hljs-keyword">address</span> owner</span>)</span>;

    <span class="hljs-function"><span class="hljs-keyword">event</span> <span class="hljs-title">HouseTransaction</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> id, <span class="hljs-keyword">address</span> buyer, <span class="hljs-keyword">uint</span> price</span>)</span>;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addHouse</span>(<span class="hljs-params"> <span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _houseAddress, <span class="hljs-keyword">uint</span> _price</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-built_in">require</span>(_price <span class="hljs-operator">&gt;</span> <span class="hljs-number">0</span>, <span class="hljs-string">"Price must be above 0"</span>);

        housesCount<span class="hljs-operator">+</span><span class="hljs-operator">+</span>;

        housesList[housesCount] <span class="hljs-operator">=</span> House(
            housesCount,
            _houseAddress,
            _price,
            <span class="hljs-keyword">payable</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>),
            <span class="hljs-literal">true</span>
        );

        <span class="hljs-keyword">emit</span> HouseAdded(housesCount, _houseAddress, _price, <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>);
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">buyHouse</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> _id</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
        House <span class="hljs-keyword">memory</span> house <span class="hljs-operator">=</span> housesList[_id];

        <span class="hljs-built_in">require</span>(house.availability, <span class="hljs-string">"House not available"</span>);
        <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span> <span class="hljs-operator">=</span><span class="hljs-operator">=</span> house.price, <span class="hljs-string">"The ether entered does not match the price of the item"</span>);
        <span class="hljs-built_in">require</span>(house.owner <span class="hljs-operator">!</span><span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, <span class="hljs-string">"The owner"</span>);

        house.owner.<span class="hljs-built_in">transfer</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>); 
        sellerBalance[house.owner]<span class="hljs-operator">+</span><span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>; 

        house.owner <span class="hljs-operator">=</span> <span class="hljs-keyword">payable</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>);
        house.availability <span class="hljs-operator">=</span> <span class="hljs-literal">false</span>; 

        housesList[_id] <span class="hljs-operator">=</span> house;

        <span class="hljs-keyword">emit</span> HouseTransaction(_id, <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, house.price);
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">withdraw</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-keyword">uint</span> balance <span class="hljs-operator">=</span> sellerBalance[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>];
        <span class="hljs-built_in">require</span>(balance <span class="hljs-operator">&gt;</span> <span class="hljs-number">0</span>, <span class="hljs-string">"There is no balance to withdraw"</span>);

        sellerBalance[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;
        <span class="hljs-keyword">payable</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>).<span class="hljs-built_in">transfer</span>(balance); 
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">checkBalance</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint</span></span>)</span>{
        <span class="hljs-keyword">return</span> sellerBalance[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>];
    }

}
</code></pre>
<h2 id="heading-penjelasan-kode"><strong>Penjelasan Kode:</strong></h2>
<h3 id="heading-inisialisasi-kontrak-dan-variabel">Inisialisasi Kontrak dan Variabel</h3>
<p>Untuk memulai smart contract, kita menentukan lisensi source kode dan versi solidity yang digunakan. <code>// SPDX-License-Identifier: MIT</code> menunjukkan bahwa kode ini memiliki lisensi MIT, <code>pragma solidity ^0.8.18;</code> menuntukan bahwa versi Solidity yang digunakan versi 0.8.18 atau lebih tinggi.</p>
<p>Selanjutnya pada <code>contract Houses{</code>, kita mendeklarasikan kontrak bernama <code>Houses</code>. Kode-kode berikutnya akan berada dalam ruang lingkup kontrak <code>Houses</code> ini.</p>
<pre><code class="lang-solidity">    <span class="hljs-keyword">struct</span> <span class="hljs-title">House</span>{
        <span class="hljs-keyword">uint</span> id;
        <span class="hljs-keyword">string</span> houseAddress;
        <span class="hljs-keyword">uint</span> price;
        <span class="hljs-keyword">address</span> <span class="hljs-keyword">payable</span> owner;
        <span class="hljs-keyword">bool</span> availability;
    }
</code></pre>
<p>Pada blok ini kita mendefinisikan tipe data struct bernama <code>House</code>, yang nantinya akan digunakan untuk merepresentasikan rumah yang terdiri dari atribut bernama <code>id</code>, <code>houseAddress</code>, <code>price</code>, <code>owner</code>, dan <code>availability</code>.</p>
<p>Kode <code>mapping(uint =&gt; House) public housesList;</code> berfungsi untuk menyimpan rumah berdasarkan ID. Dan setiap ID akan dipetakan ke dalam struct <code>House</code> dan disimpan ke dalam variabel bernama <code>housesList</code>. Modifier <code>public</code> menunjukkan bahwa variabel ini bisa diakses baik dari dalam maupun luar kontrak.</p>
<p>Begitu juga dengan <code>mapping(address =&gt; uint) public sellerBalance;</code> yang memetakan saldo ether setiap penjual berdasarkan alamat mereka.</p>
<p>Lalu ada variabel <code>houseCount</code> yang didefinisikan sebagai integer dengan <code>uint public housesCount;</code> .</p>
<p>Selanjutnya adalah membuat event untuk mencatat peristiwa yang terjadi pada blockchain. <code>event HouseAdded(uint id, string homeAddress, uint price, address owner);</code> mencatat peristiwa ketika rumah baru ditambah ke marketplace. Yang dicatat berupa ID rumah, alamat, harga, dan pemilik rumah. Kemudian <code>event HouseTransaction(uint id, address buyer, uint price);</code> dicatat ketika terjadi transaksi pembelian rumah. Yang dicatat berupa ID, alamat pembeli, dan harga.</p>
<h3 id="heading-fungsi-addhouse">Fungsi <code>addHouse</code></h3>
<pre><code class="lang-solidity"> <span class="hljs-comment">// function to add house into marketplace</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addHouse</span>(<span class="hljs-params"> <span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _houseAddress, <span class="hljs-keyword">uint</span> _price</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-built_in">require</span>(_price <span class="hljs-operator">&gt;</span> <span class="hljs-number">0</span>, <span class="hljs-string">"Price must be above 0"</span>);
</code></pre>
<p>Kita membuat fungsi publik <code>function addHouse(string memory _houseAddress, uint _price) public</code> untuk menambahkan rumah baru. Parameter yang dimasukkan adalah alamat rumah (<code>_houseAddress</code>) dan harga rumah (<code>_price</code>). Kemudian memverifikasi bahwa harga rumah lebih besar dari 0 dengan <code>require(_price &gt; 0, "Price must be above 0");</code>.</p>
<pre><code class="lang-solidity">        housesCount<span class="hljs-operator">+</span><span class="hljs-operator">+</span>;

        <span class="hljs-comment">// add house into mapping</span>
        housesList[housesCount] <span class="hljs-operator">=</span> House(
            housesCount,
            _houseAddress,
            _price,
            <span class="hljs-keyword">payable</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>),
            <span class="hljs-literal">true</span>
        );
</code></pre>
<p>Setiap kali ada rumah baru yang ditambahkan, variabel <code>houseCount</code> ditambah ke <code>housesCount++;</code>. Rumah yang baru ditambahkan dimasukkan ke dalam variabel mapping <code>houseList</code> menggunakan ID baru (<code>houseCount</code>). Fungsi ini pada akhirnya memicu event <code>HouseAdded</code> untuk mencatat bahwa rumah telah berhasil ditambahkan ke marketplace.</p>
<h3 id="heading-fungsi-buyhouse">Fungsi <code>buyHouse</code></h3>
<pre><code class="lang-solidity">     <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">buyHouse</span>(<span class="hljs-params"><span class="hljs-keyword">uint</span> _id</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
        House <span class="hljs-keyword">memory</span> house <span class="hljs-operator">=</span> housesList[_id];
</code></pre>
<p>Fungsi <code>buyHouse</code> merupakan fungsi publik untuk membeli rumah berdasarkan ID-nya (<code>_id</code>). Fungsi ini menggunakan modifier <code>payable</code> sehingga bisa menerima ether.</p>
<p>Pertama-tama , <code>House memory house = housesList[_id];</code> mengambil data berdasarkan ID lalu menyimpannya ke dalam variabel <code>house</code> yang bertipe <code>memory</code>.</p>
<pre><code class="lang-solidity">        <span class="hljs-built_in">require</span>(house.availability, <span class="hljs-string">"House not available"</span>);
        <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span> <span class="hljs-operator">=</span><span class="hljs-operator">=</span> house.price, <span class="hljs-string">"The ether entered does not match the price of the item"</span>);
        <span class="hljs-built_in">require</span>(house.owner <span class="hljs-operator">!</span><span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, <span class="hljs-string">"The owner"</span>);
</code></pre>
<p>Selanjutnya kita melakukan pengecekan dengan tiga buah fungsi <code>require</code>. Pertama <code>require(house.availability, "House not available");</code> untuk menmeriksa apakah rumah tersedia untuk dijual. Kedua <code>require(msg.value == house.price, "The ether entered does not match the price of the item");</code> untuk memeriksa apakah jumlah ether yang dikirim oleh pembeli sama dengan harga rumah. Ketiga <code>require(house.owner != msg.sender, "The owner");</code> untuk memastikan pemilik rumah tidak membeli rumahnya sendiri.</p>
<pre><code class="lang-solidity">        house.owner.<span class="hljs-built_in">transfer</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>); <span class="hljs-comment">// transfer ether to seller</span>
        sellerBalance[house.owner]<span class="hljs-operator">+</span><span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>; <span class="hljs-comment">// add seller balance</span>
</code></pre>
<p>Kode <code>house.owner.transfer(msg.value);</code> berfungsi untuk mengirim ether dari pembeli ke penjual. Lalu menambahkan saldo penjual yang tercatat di <code>sellerBalance</code>.</p>
<pre><code class="lang-solidity">        house.owner <span class="hljs-operator">=</span> <span class="hljs-keyword">payable</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>);
        house.availability <span class="hljs-operator">=</span> <span class="hljs-literal">false</span>;
</code></pre>
<p>Setelah dana dipindahkan, kepemilikan diubah dengan <code>house.owner = payable(msg.sender);</code> beserta dengan status ketersediannya <code>house.availability = false;</code> yang menandakan bahwa rumah tersebut sudah terjual. Lalu pada <code>housesList[_id] = house;</code> mapping <code>housesList</code> diperbarui dengan detail terbaru setelah transaksi berlangsung.</p>
<pre><code class="lang-solidity">        <span class="hljs-keyword">emit</span> HouseTransaction(_id, <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>, house.price);
    }
</code></pre>
<p>Terakhir, fungsi ini memicu event <code>HouseTransaction</code> untuk mencatat transaksi penjualan rumah beserta ID rumah, pembeli, dan harga.</p>
<h3 id="heading-fungsi-withdraw">Fungsi <code>withdraw</code></h3>
<pre><code class="lang-solidity"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">withdraw</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-keyword">uint</span> balance <span class="hljs-operator">=</span> sellerBalance[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>];
        <span class="hljs-built_in">require</span>(balance <span class="hljs-operator">&gt;</span> <span class="hljs-number">0</span>, <span class="hljs-string">"There is no balance to withdraw"</span>);
</code></pre>
<p>Fungsi <code>withdraw</code> merupakan fungsi publik yang berfungsi agar penjual menarik saldo mereka. Pertama-tama, saldo penjual didapatkan dari <code>sellerBalance</code>. Selanjutnya kita pastikan dengan <code>require(balance &gt; 0, "There is no balance to withdraw");</code> kita pastikan bahwa saldo penjual lebih besar dari 0.</p>
<pre><code class="lang-solidity">        sellerBalance[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;
        <span class="hljs-keyword">payable</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>).<span class="hljs-built_in">transfer</span>(balance); <span class="hljs-comment">// transfer balance to seller</span>
    }
</code></pre>
<p>Setelah terjadi penarikan, saldo penjual diubah menjadi 0 dan saldo tersebut ditransfer ke address penjual yang memanggil fungsi.</p>
<h3 id="heading-fungsi-checkbalance">Fungsi <code>checkBalance</code></h3>
<pre><code class="lang-solidity">  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">checkBalance</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint</span></span>)</span>{
        <span class="hljs-keyword">return</span> sellerBalance[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>];
    }
}
</code></pre>
<p>Fungsi terakhis adalah <code>checkBalance</code> yang merupakan publik dengan modifier <code>view</code>. Kegunaannya adalah untuk melihat saldo penjual yang disimpan di mapping <code>sellerBalance</code>.</p>
<h1 id="heading-penutup">Penutup</h1>
<p>Pada artikel ini, kita sudah membahas dasar-dasar dari Solidity yang merupakan bahasa pemrograman untuk membuat smart contract pada jaringan ethereum. Selanjutnya, kita juga mempraktekkan pembuatan smart contract sederhana untuk penjualan rumah.</p>
<p>Implementasi smart contract seperti ini nantinya bisa dikembangkan lebih lanjut untuk banyak aplikasi, dari yang skalanya sederhana sampai kompleks. Terima kasih sudah membaca artikel ini, selamat belajar dan semoga bermanfaat!.</p>
]]></content:encoded></item><item><title><![CDATA[Pengenalan Blockchain]]></title><description><![CDATA[Setiap generasi memiliki outlier asset, dan outlier asset generasi sekarang adalah Cryptocurrency. Setidaknya ungkapan seperti ini sering diucapkan oleh…]]></description><link>https://emhaihsan.hashnode.dev/pengenalan-blockchain</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/pengenalan-blockchain</guid><category><![CDATA[Blockchain]]></category><category><![CDATA[decentralized]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Tue, 01 Oct 2024 14:40:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/kM6QNrgo0YE/upload/4c8fad63db98ded67ef3d26cde96197e.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>Setiap generasi memiliki outlier asset, dan outlier asset generasi sekarang adalah Cryptocurrency.</p>
</blockquote>
<p>Setidaknya ungkapan seperti ini sering diucapkan oleh para influencer-influencer yang terjun ke dunia cryptocurrency. Semakin digandrunginya crypto pada saat ini tidak terlepas dari suatu teknologi bernama blockchain.</p>
<p>Pada artikel ini, kita akan membahas pengenalan singkat tentang Blockchain, teknologi, serta kelebihan-kelebihan yang ada di dalamnya.</p>
<h2 id="heading-apa-itu-blockchain">Apa itu Blockchain</h2>
<p>Menurut kamus oxford, blockchain didefinisikan sebagai:</p>
<blockquote>
<p>a system in which a record of transactions, especially those made in a cryptocurrency, is maintained across computers that are linked in a peer-to-peer network.</p>
</blockquote>
<p>Blockchain juga sering diibaratkan seperti buku besar yang di dalamnya terdapat blok-blok dan pencatatannya tersebar di seluruh jaringan.</p>
<p><img src alt class="image--center mx-auto" /></p>
<p>Blok sendiri bisa dianalogikan seperti satu halaman di dalam buku besar tersebut. Di mana blok tersebut berisikan data, kode hash untuk blok tersebut dan blok sebelumnya.</p>
<p>Keberadaan kode hash ini lah yang seakan membuat suatu rantai yang menghubungkan antar blok di dalam satu jaringan blockchain.</p>
<p>Konsep-konsep ini menjadi asal dari fitur-fitur kunci dalam blockchain seperti desentralisasi, imutabilitas, transparansi, dan keamanan.</p>
<h2 id="heading-fitur-utama-di-dalam-blockchain">Fitur Utama di dalam Blockchain</h2>
<p>Mari kita bahas fitur-fitur utama di dalam blockchain itu sendiri:</p>
<p><strong>Terdesentralisasi</strong>, Jika kita melihat pada sistem yang ada sekarang, terdapat satu entitas seperti server yang memiliki kendali penuh di dalam sistem. Pada sistem blockchain, kendali ada pada banyak entitas yang disebut node, sehingga tidak ada pemegang kendali mutlak di dalamnya.</p>
<p><strong>Imutablitas,</strong> ketika suatu data masuk ke dalam blok, data tersebut tidak akan bisa diubah tanpa mengubah data-data yang ada setelahnya, oleh karena itu membuat perubahan di dalam blockchain sangat sulit bahkan hampir mustahil karena ia memerlukan persetujuan dari semua node yang ada.</p>
<p><strong>Transparansi</strong>, akuntabilitas dan transparansi sangat terjaga di dalam blockchain karena seluruh peserta yang ada di jaringan blockchain bisa melihat semua transaksi yang terjadi.</p>
<p><strong>Keamanan</strong>, blockchain memanfaatkan teknik hash dari kriptografi untuk mengamankan seluruh transaksi dan data di dalam jaringannya. Sehingga segala sesuatu yang terjadi di dalam blockhain sulit untuk dimanipulasi dan diretas.</p>
<h2 id="heading-bagaimana-blockchain-bekerja">Bagaimana Blockchain bekerja?</h2>
<p>Sebagaimana sudah disebutkan sebelumnya, setiap blok berisikan kumpulan transaksi yang terjadi.</p>
<p>Blok pertama di dalam jaringan dikenal dengan <strong>Genesis Block.</strong> Blok merupakan dasar dari seluruh jaringan, karena semua blok lainnya terhubung ke dalam blok ini.</p>
<p>Sebagai penghubung, tiap blok memiliki tanda pengenal unik yang disebut dengan hash, nilainya dihasilkan berdasarkan data yang ada di dalam blok. Hash ini ibaratkan cap unik atau tanda sidik jari dari blok dan memastikan setiap blok di dalamnya unik.</p>
<p>Sebelum ditambahkan, transaksi-transaksi yang ada di dalam jaringan blockchain harus disepakati oleh seluruh nodes yang ada di dalamnya. Konsep ini dikenal juga dengan mekanisme konsensus.</p>
<p>Mekanisme ini memastikan keberadaan versi tunggal yang valid di dalam jaringan. Sehingga bisa mengantisipasi pihak-pihak yang mencoba mengubah transaksi di dalam. Karena jika hal ini terjadi, misalnya ada perubahan di salah satu node, anggota lain di dalam jaringan bisa mengeluarkan node tersebut karena isinya yang menyalahi konsensus yang ada.</p>
<h2 id="heading-manfaat-blockchain">Manfaat Blockchain</h2>
<p>Dari konsep dan fitur di dalamnya, penerapan blockchain memiliki potensi manfaat yang tinggi.</p>
<p>Prinsipnya yang terdesentralisasi bisa memecahkan masalah efisiensi yang banyak terjadi di dunia saat ini. Karena blockchain menghilangkan keperluan akan perantara, misalnya bank dalam konteks keuangan, maka transaksi yang terjadi bisa lebih cepat dan lebih murah.</p>
<p>Sifatnya yang transparan juga memberikan kemudahan dalam penelusuran, karena setiap transaksi yang ada tersedia dan tercatat secara lengkap dan akurat.</p>
<h2 id="heading-penutup">Penutup</h2>
<p>Blockchain merupakan teknologi revolusioner yang dimanfaatkan dengan baik, blockchain akan mampu memberikan suatu sistem yang lebih transparan, aman, dan efisien dibandingkan sistem tradisional.</p>
<p>Perkembangannya juga sangat pesat mengingat semakin populernya pasar kripto. Oleh karena itu, meskipun mungkin tidak bersentuhan secara langsung. Mempelajari konsep dari blockchain seperti menjadi keniscayaan yang perlu dilakukan oleh orang-orang di masa sekarang.</p>
]]></content:encoded></item><item><title><![CDATA[Membuat Social Media Post Generator dengan OpenAI API]]></title><description><![CDATA[Otomasi postingan anda dengan AI]]></description><link>https://emhaihsan.hashnode.dev/membuat-social-media-post-generator-dengan-openai-api</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/membuat-social-media-post-generator-dengan-openai-api</guid><category><![CDATA[AI]]></category><category><![CDATA[chatgpt]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[generative ai]]></category><category><![CDATA[natural language processing]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Mon, 26 Aug 2024 06:19:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/yN5DVnKunmo/upload/9943c81ed821fcc2918a52d9241725a3.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Kehadiran AI saat ini bagaikan pisang bermata dua, di satu sisi banyak yang mewaspadai penggunaannya yang tidak etis. Namun di sisi lain, AI bisa memberikan banyak manfaat dan membantu banyak orang dalam mempercepat pekerjaannya.</p>
<p>Pada postingan kali ini, kita akan membuat contoh studi kasus penggunaan AI dengan membuat generator post di media sosial. Tujuan dari adanya generator ini adalah untuk membantu perorangan ataupun bisnis untuk memberikan inspirasi postingan yang bisa dilakukan untuk membantu bisnis ataupun personal branding perseorangan.</p>
<h3 id="heading-mempersiapkan-folder-dan-requirements">Mempersiapkan Folder dan Requirements</h3>
<p>Library yang akan kita gunakan pada project ini adalah <code>openai</code> dan <code>streamlit</code>, jika belum terinstall kita bisa mengunduhnya di package manager <code>pip</code> ataupun <code>conda</code>.</p>
<p>Struktur folder proyek yang akan kita buat adalah sebagai berikut</p>
<pre><code class="lang-bash">- postgenerator
|--app.py
|--gpt.py
</code></pre>
<p>Agar lebih mudah di maintenance, di sini kita akan memisahkan file ke dalam <code>app.py</code> dan <code>gpt.py</code>, file <code>app.py</code> berisikan UI untuk aplikasi streamlit kita dan <code>gpt.py</code> berisikan logic dari aplikasi yang akan kita buat.</p>
<h3 id="heading-membuat-gptpy">Membuat <code>gpt.py</code></h3>
<p>Kode di dalam <code>app.py</code> adalah sebagai berikut:</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> openai

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">generate_post</span>(<span class="hljs-params">api_key, platform, topic, temperature, length, use_hashtags, use_emojis</span>):</span>
    <span class="hljs-keyword">try</span>:
        client = openai.OpenAI(api_key=api_key)
        prompt = <span class="hljs-string">f"Generate a <span class="hljs-subst">{length}</span> social media post for <span class="hljs-subst">{topic}</span> in <span class="hljs-subst">{platform}</span>."</span>

        <span class="hljs-keyword">if</span> use_hashtags:
            prompt += <span class="hljs-string">" Include relevant hashtags."</span>
        <span class="hljs-keyword">else</span>:
            prompt += <span class="hljs-string">" Do not include hashtags."</span>
        <span class="hljs-keyword">if</span> use_emojis:
            prompt += <span class="hljs-string">" Include appropriate emojis."</span>
        <span class="hljs-keyword">else</span>:
            prompt += <span class="hljs-string">" Do not include emojis."</span>
        response = client.chat.completions.create(
            model=<span class="hljs-string">"gpt-4o-mini"</span>,
            messages=[
                {<span class="hljs-string">"role"</span>: <span class="hljs-string">"system"</span>, <span class="hljs-string">"content"</span>: <span class="hljs-string">"You are a social media expert with 20 years experience on Cupywriting"</span>},
                {<span class="hljs-string">"role"</span>: <span class="hljs-string">"user"</span>, <span class="hljs-string">"content"</span>: prompt}
            ],
            max_tokens=<span class="hljs-number">1000</span>,
            temperature=temperature  
        )
        post = response.choices[<span class="hljs-number">0</span>].message.content
        <span class="hljs-keyword">return</span> post
    <span class="hljs-keyword">except</span> openai.AuthenticationError:
        <span class="hljs-keyword">return</span> <span class="hljs-string">"Invalid API key"</span>
    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:
        <span class="hljs-keyword">return</span> str(e)
</code></pre>
<p>Pada file ini, kita akan membuat fungsi yang kita beri nama <code>generate_post</code>. Fungsi ini akan menerima tujuh parameter yaitu <code>api_key</code>, <code>platform</code>, <code>topic</code>, <code>temperature</code>, <code>length</code>, <code>use_hashtags</code>, <code>use_emojis</code>.</p>
<p>Karena kita akan melakukan request ke OpenAI API, maka kita membungkus kode kita dengan error handling <code>try-except</code>. Tujuannya agar ketika ada error, diharapkan aplikasi kita tidak crash.</p>
<p>Selanjutnya kita membuat objek <code>client</code> dari openai.OpenAI, di sini <code>api_key</code> yang kita masukkan divalidasi. Lalu membuat variabel <code>prompt</code> yang berisikan template dari perintah yang akan kita berikan.</p>
<p>Parameter <code>use_hashtag</code> dan <code>use_emojis</code> bekerja dengan cara memberikan prompt tambahan yang menentukan apakah hashtag dan emoji akan dimasukkan ke dalam post yang akan kita buat.</p>
<p>Kemudian kita menampung <code>response</code> dari method <code>client.chat.completions.create</code>, di sini kita memasukkan parameter berupa <code>model</code>, <code>messages</code>, <code>max_tokens</code>, dan <code>temperature</code>. Untuk model yang digunakan adalah <code>gpt-4o-mini</code>, versi kecil dari model terbaik openai saat ini.</p>
<p>Parameter <code>messages</code> memberikan petunjuk terhadap model terkait role yang diberikan kepadanya dan prompt yang dimasukkan oleh user. Di sini kita memberikan <code>system prompt</code> kepada model bahwa ia adalah seorang social media expert yang juga berpengalaman di bidang copywriting.</p>
<p>Parameter <code>max_tokens</code> mengatur jumlah maksimal token yang akan di generate. Di sini kita memasukkan 1000 karena kita akan mengatur panjang dari post yang dibuat bisa ke dalam tiga kategori.</p>
<p>Selanjutnya parameter <code>temperature</code> yang mengatur kreativitas dari response model, semakin tinggi maka akan semakin kreatif, begitu pula sebaliknya.</p>
<p>Keseluruhan fungsi <code>generate_post</code> akan mengembalikan <code>post</code> yang merupakan respon dari model terhadap prompt yang diberikan user.</p>
<h3 id="heading-membuat-apppy">Membuat <code>app.py</code></h3>
<p>Setelah logic pada <code>gpt.py</code> telah selesai dibuat, kita lanjut membuat tampilan menggunakan streamlit. Keseluruhan kode <code>app.py</code> adalah sebagai berikut:</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> streamlit <span class="hljs-keyword">as</span> st
<span class="hljs-keyword">from</span> gpt <span class="hljs-keyword">import</span> generate_post

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span>():</span>
    st.title(<span class="hljs-string">"Social Media Post Generator"</span>)

    st.sidebar.title(<span class="hljs-string">"Configuration"</span>)
    api_key = st.sidebar.text_input(<span class="hljs-string">"Enter your OpenAI API key:"</span>, type=<span class="hljs-string">"password"</span>)

    <span class="hljs-keyword">if</span> api_key:
        topic = st.text_input(<span class="hljs-string">"What is your post for?"</span>)

        platform = st.selectbox(<span class="hljs-string">"Platform:"</span>, [<span class="hljs-string">"Facebook"</span>, <span class="hljs-string">"Instagram"</span>, <span class="hljs-string">"Twitter"</span>, <span class="hljs-string">"LinkedIn"</span>])

        temperature = st.slider(<span class="hljs-string">"Creativity Level (temperature):"</span>, min_value=<span class="hljs-number">0.0</span>, max_value=<span class="hljs-number">1.0</span>, value=<span class="hljs-number">0.5</span>, step=<span class="hljs-number">0.05</span>)

        length = st.selectbox(<span class="hljs-string">"Choose the length:"</span>, [<span class="hljs-string">"Short"</span>, <span class="hljs-string">"Medium"</span>, <span class="hljs-string">"Long"</span>])

        use_hashtags = st.radio(<span class="hljs-string">"Include hashtags?"</span>, (<span class="hljs-string">"Yes"</span>, <span class="hljs-string">"No"</span>))
        use_emojis = st.radio(<span class="hljs-string">"Include emojis?"</span>, (<span class="hljs-string">"Yes"</span>, <span class="hljs-string">"No"</span>))

        use_hashtags = use_hashtags == <span class="hljs-string">"Yes"</span>
        use_emojis = use_emojis == <span class="hljs-string">"Yes"</span>

        <span class="hljs-comment"># Generate Post Button</span>
        <span class="hljs-keyword">if</span> st.button(<span class="hljs-string">"Generate Post"</span>):
            <span class="hljs-keyword">if</span> topic:
                post = generate_post(api_key, platform, topic, temperature, length, use_hashtags, use_emojis)
                <span class="hljs-keyword">if</span> post == <span class="hljs-string">"Invalid API key"</span>:
                    st.error(<span class="hljs-string">"Invalid API key. Please check and try again."</span>)
                <span class="hljs-keyword">elif</span> <span class="hljs-string">"error"</span> <span class="hljs-keyword">in</span> post.lower():
                    st.error(<span class="hljs-string">f"An error occurred: <span class="hljs-subst">{post}</span>"</span>)
                <span class="hljs-keyword">else</span>:
                    st.success(<span class="hljs-string">"Generated Post:"</span>)
                    st.write(post)
            <span class="hljs-keyword">else</span>:
                st.warning(<span class="hljs-string">"What is your post for?"</span>)
    <span class="hljs-keyword">else</span>:
        st.warning(<span class="hljs-string">"Please enter your OpenAI API key in the sidebar to generate a post."</span>)

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    main()
</code></pre>
<p>Secara keseluruhan, tampilan UI yang kita buat terdiri dari tampilan utama dan sidebar. Agar bisa menggunakan aplikasi ini, terlebih dahulu pengguna harus memasukkan openAI masing-masing. Sidebar berfungsi untuk menampung api key yang digunakan oleh pengguna.</p>
<p>Input yang bisa dimasukkan oleh pengguna adalah <code>topic</code>, <code>platform</code>, <code>temperature</code>, <code>length</code>, <code>use_hashtag</code>, dan <code>use_emojis</code>.</p>
<p>Topic berupa text input dan berisikan tujuan dari post yang akan kita generate. Selanjutnya input <code>platform</code> dan <code>length</code> berupa select box yang berisikan pilihan nilai. Untuk platform, kita bisa memilih antara facebook, linkedin, twitter, ataupun linkedin. Sedangkan length kita bisa memilih antara pendek, sedang, dan panjang.</p>
<p>Parameter <code>temperature</code> berupa slider dengan rentang antara 0 dan 1. Dan terakhir <code>use_hashtag</code> dan <code>use_emojis</code> berupa radio button.</p>
<p>Terakhir adalah button <code>Generate Post</code> yang akan memanggil fungsi <code>generate_post</code> yang sudah kita buat sebelumnya pada file <code>gpt.py</code>, parameter yang diteruskan disesuaikan dengan input pengguna yang sudah dimasukkan pada streamlit UI.</p>
<h3 id="heading-menjalankan-aplikasi">Menjalankan Aplikasi</h3>
<p>Untuk menjalankan aplikasi, kita bisa menjalankan perintah <code>streamlit run app.py</code> di terminal. Berikut adalah tampilan aplikasi ketika dijalankan.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724646820545/88c5c6ca-481d-47ed-9ccc-b2ce8a9c3197.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724646830739/4b4b1ac1-87a5-4dc9-a002-75317aa6fefb.png" alt class="image--center mx-auto" /></p>
<p>Untuk percobaan, saya akan meminta untuk dibuatkan post untuk</p>
<blockquote>
<p>an Arabic food restaurant in Jakarta city called "Kebulimu"</p>
</blockquote>
<p>Selanjutnya dicoba tiga buah kombinasi parameter:</p>
<ul>
<li><p>Length: short, Hashtag: no, Emojis: no</p>
</li>
<li><p>Length: medium, Hashtag: yes, Emojis: no</p>
</li>
<li><p>Lenght: long, Hashtag: yes, Emojis: no</p>
</li>
</ul>
<p>Untuk temperature kita set ke 0.75 dan platform tujuan adalah instagram. Berikut hasilnya:</p>
<ol>
<li>Hasil Kombinasi parameter pertama:</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724647351279/3457749a-0fe5-46d5-8139-81c70d7ffd4c.png" alt class="image--center mx-auto" /></p>
<ol start="2">
<li>Hasil Kombinasi parameter kedua:</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724647359949/c5f2d56d-6fa7-41d2-8939-1e2e42594c75.png" alt class="image--center mx-auto" /></p>
<ol start="3">
<li>Hasil Kombinasi parameter ketiga:</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724647372856/ed51c2d5-5b30-45a2-afef-aea13779d1f3.png" alt class="image--center mx-auto" /></p>
<p>Bisa dilihat bahwa hasil yang diberikan sesuai dengan parameter yang kita tentukan.</p>
<h3 id="heading-penutup">Penutup</h3>
<p>Dari projek sederhana ini, kita bisa belajar tentang bagaimana pengaruh suatu prompt yang diberikan terhadap output yang dihasilkan. Untuk saat ini, kita masih mengandalkan knowledge dari model yang sudah ada, pengembangan selanjutnya bisa dilakukan dengan menambahkan knowledge dari file kita sendiri menggunakan teknik seperti retrieval augmented generation (RAG).</p>
<p>Terima kasih sudah membaca artikel ini, semoga bermanfaat dan jangan lelah untuk terus belajar!.</p>
<hr />
<p>Kode Sumber : <a target="_blank" href="https://github.com/emhaihsan/blog-post-code/tree/main/postgenerator">Github</a></p>
]]></content:encoded></item><item><title><![CDATA[Membuat Aplikasi Analisis Sentimen dengan ChatGPT]]></title><description><![CDATA[Sentimen Analisis sudah menjadi seperti "hello world" ketika kita mulai mendalami dunia Natural Language Processing (NLP). Pada blog ini juga sebelumnya…]]></description><link>https://emhaihsan.hashnode.dev/membuat-aplikasi-analisis-sentimen-dengan-chatgpt</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/membuat-aplikasi-analisis-sentimen-dengan-chatgpt</guid><category><![CDATA[chatgpt]]></category><category><![CDATA[Sentiment analysis]]></category><category><![CDATA[streamlit]]></category><category><![CDATA[llm]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Sun, 18 Aug 2024 15:46:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/0JARfuyhWwA/upload/d1df020b89edb1fa7478512c05c5eaef.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sentimen Analisis sudah menjadi seperti "hello world" ketika kita mulai mendalami dunia Natural Language Processing (NLP). Pada blog ini juga sebelumnya kita sudah pernah membuat aplikasi sederhana untuk sentiment analysis.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://emhaihsan.hashnode.dev/sentiment-analysis-data-twitter-menggunakan-machine-learning">https://emhaihsan.hashnode.dev/sentiment-analysis-data-twitter-menggunakan-machine-learning</a></div>
<p> </p>
<p>Dilanjutkan juga dengan membuat web app sederhana menggunakan streamlit.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://emhaihsan.hashnode.dev/membuat-aplikasi-sentiment-analysis-sederhana-dengan-streamlit">https://emhaihsan.hashnode.dev/membuat-aplikasi-sentiment-analysis-sederhana-dengan-streamlit</a></div>
<p> </p>
<p>Pada blog post kali ini, kita kembali akan melakukan analisis sentimen dan menggunakan streamlit untuk membuat tampilan web sederhana. Perbedaannya adalah, alih-alih menggunakan traditional machine learning, kali ini kita akan menggunakan LLM dalam hal ini model GPT dari OpenAI.</p>
<h2 id="heading-membuat-sentiment-analyzer-dan-ui">Membuat Sentiment Analyzer dan UI</h2>
<p>Hasil akhir dari project yang kita buat bisa dicoba pada link berikut:</p>
<blockquote>
<p><a target="_blank" href="https://sentimentgpt.streamlit.app/">https://sentimentgpt.streamlit.app/</a></p>
</blockquote>
<p>Untuk ini, kita akan membuat dua buah file yaitu <code>gpt.py</code> untuk melakukan request ke model Open AI dan <code>app.py</code> untuk membuat tampilan UI untuk berinteraksi dengan user. Adapun requirement library yang digunakan adalah:</p>
<pre><code class="lang-python">openai==<span class="hljs-number">1.41</span><span class="hljs-number">.0</span>
streamlit==<span class="hljs-number">1.32</span><span class="hljs-number">.0</span>
</code></pre>
<h3 id="heading-membuat-file-logic-gptpy">Membuat file logic <code>gpt.py</code></h3>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> openai

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_sentiment</span>(<span class="hljs-params">text, user_api_key</span>):</span>
    <span class="hljs-keyword">try</span>:
        client = openai.OpenAI(api_key=user_api_key)
        prompt = <span class="hljs-string">f"Analyze the sentiment of the following text, and classify it as positive, negative, or neutral:\n\n<span class="hljs-subst">{text}</span>"</span>
        response = client.chat.completions.create(
            model=<span class="hljs-string">"gpt-4o-mini"</span>,
            messages=[
                {<span class="hljs-string">"role"</span>: <span class="hljs-string">"system"</span>, <span class="hljs-string">"content"</span>: <span class="hljs-string">"You are a sentiment analyzer, your must answer with only positive, negative, or neutral"</span>},
                {<span class="hljs-string">"role"</span>: <span class="hljs-string">"user"</span>, <span class="hljs-string">"content"</span>: prompt}
            ],
            max_tokens=<span class="hljs-number">140</span>,
            temperature=<span class="hljs-number">0.7</span>,
        )
        sentiment = response.choices[<span class="hljs-number">0</span>].message.content
        <span class="hljs-keyword">return</span> sentiment
    <span class="hljs-keyword">except</span> openai.AuthenticationError:
        <span class="hljs-keyword">return</span> <span class="hljs-string">"Invalid API key"</span>
    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:
        <span class="hljs-keyword">return</span> str(e)
</code></pre>
<p>Kode di atas berisikan logic untuk berinteraksi ke OpenAI API dan melakukan analisis sentimen. Pertama-tama kita import library <code>openai</code>, di sini kita lalu membuat fungsi <code>get_sentiment</code> yang menerima input dua buah parameter yaitu <code>text</code> yang merupakan input dari pengguna dan <code>user_api_key</code> yang merupakan api key dari pengguna.</p>
<p>Kita membungkus fungsi dengan <code>try</code>-<code>except</code> karena request ke API sangat rawan terkena error sehingga penggunaan error handler bisa dikatakan sebagai sesuatu yang layak dilakukan.</p>
<p>Selanjutnya adalah membuat instance <code>client</code> dengan memanggil <code>openai</code> dan memasukkan api key yang dimiliki oleh masing-masing pengguna.</p>
<p>Kita lalu memanggil method <code>client.chat.completions.create</code> yang bertujuan untuk mengirimkan prompt ke model untuk diproses, method ini berisikan parameter:</p>
<ul>
<li><p><code>model</code>: model yang digunakan untuk melakukan analisis sentimen, di sini kita menggunakan <code>gpt-4o-mini</code>.</p>
</li>
<li><p><code>messages</code>: parameter ini mendefinisikan konteks dalam percakapan yang akan dilakukan, isinya berupa dictionary berupa:</p>
<ul>
<li><p><code>{"role": "system", "content": ...}</code> : membuat <code>system message</code>, bertujuan untuk memberitahu model tugasnya sebagai sentiment analyzer yang hanya akan merespon sesuai dengan yang diminta, dalam hal ini <code>positive</code>, <code>negative</code>, atau <code>neutral</code>.</p>
</li>
<li><p><code>{"role": "user", "content": prompt}</code>: membuat <code>user message</code> yang berisikan prompt berupa teks yang akan dianalisis.</p>
</li>
</ul>
</li>
<li><p><code>max_tokens</code>: maksimal jumlah token yang ada di dalam respon model.</p>
</li>
<li><p><code>temperature</code>: parameter ini digunakan untuk mengontrol kreativitas model.</p>
</li>
</ul>
<p>Respon yang dikembalikan berupa objek yang berisikan detail chat itu sendiri. Oleh karena itu, kita perlu mengekstraknya dengan memanggil <code>response.choices[0].message.content</code> dan menyimpannya ke variabel <code>sentiment</code> agar output dari fungsi yang kita buat bisa dipahami oleh pengguna.</p>
<h3 id="heading-membuat-ui-streamlit-apppy">Membuat UI Streamlit <code>app.py</code></h3>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> streamlit <span class="hljs-keyword">as</span> st
<span class="hljs-keyword">from</span> gpt <span class="hljs-keyword">import</span> get_sentiment

<span class="hljs-comment"># Streamlit UI</span>
st.sidebar.title(<span class="hljs-string">"Configuration 🔧"</span>)
api_key = st.sidebar.text_input(<span class="hljs-string">"Enter your OpenAI API key 🔑:"</span>, type=<span class="hljs-string">"password"</span>)

st.title(<span class="hljs-string">"Sentiment Analysis with LLM"</span>)

text_input = st.text_area(<span class="hljs-string">"Enter text to analyze:"</span>)

<span class="hljs-keyword">if</span> st.button(<span class="hljs-string">"Analyze Sentiment"</span>):
    <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> api_key:
        st.error(<span class="hljs-string">"Please enter your OpenAI API key in the sidebar."</span>)
    <span class="hljs-keyword">elif</span> text_input:
        sentiment = get_sentiment(text_input, api_key).lower()

        <span class="hljs-keyword">if</span> sentiment == <span class="hljs-string">"invalid api key"</span>:
            st.error(<span class="hljs-string">"Invalid API key. Please check and try again."</span>)
        <span class="hljs-keyword">elif</span> <span class="hljs-string">"error"</span> <span class="hljs-keyword">in</span> sentiment.lower():
            st.error(<span class="hljs-string">f"An error occurred: <span class="hljs-subst">{sentiment}</span>"</span>)
        <span class="hljs-keyword">else</span>:
            <span class="hljs-keyword">if</span> <span class="hljs-string">"positive"</span> <span class="hljs-keyword">in</span> sentiment:
                st.success(<span class="hljs-string">f"Sentiment: <span class="hljs-subst">{sentiment.capitalize()}</span>"</span>, icon=<span class="hljs-string">"✅"</span>)
            <span class="hljs-keyword">elif</span> <span class="hljs-string">"negative"</span> <span class="hljs-keyword">in</span> sentiment:
                st.error(<span class="hljs-string">f"Sentiment: <span class="hljs-subst">{sentiment.capitalize()}</span>"</span>, icon=<span class="hljs-string">"🚫"</span>)
            <span class="hljs-keyword">elif</span> <span class="hljs-string">"neutral"</span> <span class="hljs-keyword">in</span> sentiment:
                st.warning(<span class="hljs-string">f"Sentiment: <span class="hljs-subst">{sentiment.capitalize()}</span>"</span>, icon=<span class="hljs-string">"⚖️"</span>)
            <span class="hljs-keyword">else</span>:
                st.info(<span class="hljs-string">f"Sentiment: <span class="hljs-subst">{sentiment.capitalize()}</span>"</span>)
    <span class="hljs-keyword">else</span>:
        st.warning(<span class="hljs-string">"Please enter some text to analyze."</span>)
</code></pre>
<p>Di sini kita membuat UI sederhana menggunakan streamlit agar pengguna bisa berinteraksi dengan sentiment analyzer yang sudah kita buat sebelumnya.</p>
<p>Pertama kita membuat sidebar yang berisikan kolom input agar pengguna bisa memasukkan api keynya masing-masing.</p>
<p>Selanjutnya untuk konten utama, hanya ada 3 komponen yaitu judul, text area dan tombol untuk melakukan analisis sentimen. Setelah tombol ditekan, proses analisis sentimen akan dilakukan.</p>
<p>Ketika ada kesalahan seperti text area yang masih kosong, api key yang salah ataupun api key yang belum terisi, program akan memberikan pemberitahuan seperti error yang didapatkan.</p>
<h2 id="heading-menjalankan-aplikasi">Menjalankan Aplikasi</h2>
<p>Untuk menjalankan aplikasi pastikan struktur folder aplikasi sebagai berikut:</p>
<pre><code class="lang-markdown">.
├── app.py                 # The Streamlit UI code
├── gpt.py                 # The sentiment analysis logic using OpenAI API
├── requirements.txt       # (Optional) Required Python packages
└── README.md              # (Optional) Project documentation (this file)
</code></pre>
<p>Setelah kode dan struktur sesuai, kita bisa mencoba aplikasi kita dengan menjalankan:</p>
<pre><code class="lang-python">streamlit run app.py
</code></pre>
<p>Berikut tampillan dari aplikasi yang telah kita buat</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723995241995/0ffbab59-aa5a-4ca9-a36e-4dc38d9c3378.png" alt class="image--center mx-auto" /></p>
<p>Tampilan awal aplikasi,</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723995260099/f9232fb7-d327-49b9-852a-f23115d58d3d.png" alt class="image--center mx-auto" /></p>
<p>Tampilan ketika kita lupa memasukkan api key,</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723995274639/3739f282-91e6-4683-9da4-3ff873062c4a.png" alt class="image--center mx-auto" /></p>
<p>Tampilan ketika api key yang dimasukkan salah,</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723995286592/0b37333a-73ad-46e0-9d8c-c23414ff4141.png" alt class="image--center mx-auto" /></p>
<p>Tampilan ketika teks yang dimasukkan memiliki sentimen positif,</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723995295284/9e5c069d-21c0-4517-8c57-bd08af2d3cd3.png" alt class="image--center mx-auto" /></p>
<p>Tampilan ketika teks yang dimasukkan memiliki sentimen negatif,</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723995303611/2c3377f2-b51a-4bb4-81ac-bf0fffbe064d.png" alt class="image--center mx-auto" /></p>
<p>Tampilan ketika teks yang dimasukkan memiliki sentimen netral,</p>
<h2 id="heading-penutup">Penutup</h2>
<p>Selamat, kita telah berhasil menggunakan model Large Language Model (LLM) dalam hal ini GPT untuk melakukan analisis sentimen. Mungkin akan ada pertanyaan, bukankah akan lebih murah jika kita menggunakan traditional machine learning untuk keperluan sederhana seperti analisis sentimen?</p>
<p>Jawabannya adalah iya, namun penggunaan LLM untuk melakukan analisis sentimen setidaknya patut dipertimbangkan pada kondisi seperti ketika belum ada data yang memadai. Saat tidak adanya data yang memungkinkan kita untuk melakukan training pada model buatan sendiri, kita bisa membuat model sementara menggunakan llm sambil kemudian hasil darinya kita cek agar kemudian kita bisa membuat dataset tersendiri yang bisa digunakan untuk melakukan mentraining model sentiment analyzer menggunakan metode traditional machine learning.</p>
<p>Demikian, semoga tulisan ini bermanfaat, terima kasih, dan selamat belajar.</p>
<p>Kode Sumber: <a target="_blank" href="https://github.com/emhaihsan/blog-post-code/tree/main/llmsentiment">Github</a></p>
]]></content:encoded></item><item><title><![CDATA[Deteksi Objek dengan Faster RCNN]]></title><description><![CDATA[Salah satu contoh studi kasus dalam bidang computer vision adalah untuk memberikan solusi agar bagaimana suatu sistem dapat "melihat" dan "memahami"…]]></description><link>https://emhaihsan.hashnode.dev/deteksi-objek-dengan-faster-rcnn</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/deteksi-objek-dengan-faster-rcnn</guid><category><![CDATA[faster rcnn]]></category><category><![CDATA[object detection ]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Tue, 13 Aug 2024 09:13:56 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1723532970085/89e8c87f-54e1-43d8-9d6d-37474094db94.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Salah satu contoh studi kasus dalam bidang computer vision adalah untuk memberikan solusi agar bagaimana suatu sistem dapat "melihat" dan "memahami" objek-objek yang ada di dalam gambar sebagaimana bisa dilakukan oleh manusia. Task ini kemudian dikenal dengan <strong>deteksi objek (Object Detection)</strong>. Jika kita lihat pada kasus klasifikasi, model melakukan identifikasi terhadap jenis objek yang ada di dalam gambar (misalnya, apakah ini adalah gambar kucing atau gambar anjing). Pada deteksi objek, penerapannya diperluan sampai pada tahap untuk menentukan lokasi objek tersebut di dalam gambar dengan cara menggambar kotak pembatas (bounding box) di sekitar objek.</p>
<p>Deteksi objek bisa memiliki peranan penting dalam kehidupan sehari-hari, mulai dari aspek keamanan, untuk pengendalian lalu lintas, sampai hingga teknologi kendaraan otonom. Kompleksitas tugas ini terletak pada dua aspek utama: pertama, bagaimana mendeteksi objek dengan berbagai ukuran, bentuk, dan orientasi di dalam gambar; kedua, bagaimana melakukan deteksi ini dengan cepat dan akurat, bahkan dalam kondisi dunia nyata yang sering kali penuh dengan kebisingan dan latar belakang yang rumit.</p>
<h3 id="heading-mengenal-sekilas-faster-r-cnn">Mengenal Sekilas Faster R-CNN</h3>
<p>Salah satu metode yang paling populer untuk deteksi objek adalah <strong>Faster R-CNN (Region-based Convolutional Neural Network)</strong>. Faster R-CNN merupakan pengembangan dari metode R-CNN dan Fast R-CNN yang sudah dikembangkan sebelumnya, kelebihan dari Faster R-CNN adalah peningkatan signifikan dalam hal kecepatan dan akurasi deteksi objek. Meskipun untuk saat ini, sudah banyak metode lain yang lebih baru dan cepat dibandingkan Faster R-CNN. Mengetahui dan mencoba metode ini tetap layak dilakukan sebagai pengenalan terhadap metode-metode untuk object detection</p>
<p>Faster R-CNN memperkenalkan pendekatan melakukan integrasi <strong>Region Proposal Network (RPN)</strong> ke dalam arsitektur deteksi objek. Dengan adanya RPN, Faster R-CNN bisa menghasilkan proposal region (wilayah yang kemungkinan mengandung objek) secara lebih efisien dan dari fitur yang diekstraksi oleh jaringan konvolusi. Sehingga dimungkinkan proses deteksi objek secara end-to-end dalam satu jaringan, menghilangkan bottleneck yang ada pada metode sebelumnya yang mengandalkan proses eksternal seperti selective search. Penjelasan lebih lanjut tentang bagaimana Faster RCNN bekerja bisa dilihat lebih lanjut pada <a target="_blank" href="https://arxiv.org/pdf/1506.01497">paper ini.</a></p>
<h2 id="heading-implementasi-faster-rcnn-untuk-deteksi-objek">Implementasi Faster RCNN untuk Deteksi Objek</h2>
<p>Di sini kita tidak melakukan pelatihan model dari awal, melainkan menggunakan pretrained model yang ada di torchvision. Sedangkan untuk gambar-gambar pada artikel ini bisa didapatkan di <a target="_blank" href="https://www.kaggle.com/datasets/emhaihsan/sample-images-for-object-detection/data">Kaggle</a>. Pertama-tama kita perlu mengimpor beberapa library untuk projek ini:</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> cv2
<span class="hljs-keyword">import</span> torch
<span class="hljs-keyword">import</span> requests
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">import</span> torchvision
<span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image
<span class="hljs-keyword">from</span> torch <span class="hljs-keyword">import</span> no_grad
<span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt
<span class="hljs-keyword">from</span> torchvision <span class="hljs-keyword">import</span> transforms
</code></pre>
<p>Library yang kita impor merupakan library yang berhubungan dengan computer vision. Seperti OpenCV <code>cv2</code> untuk pemrosesan gambar, kemudian numpy <code>np</code> untuk keperluan komputasi, PIL untuk memuat gambar, matplotlib <code>plt</code> untuk visualisasi dan Request untuk mengunduh gambar dari web.</p>
<h3 id="heading-membuat-helper-function">Membuat Helper Function</h3>
<pre><code class="lang-python"><span class="hljs-comment"># Function to get predictions with optional filtering by object and threshold</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_predictions</span>(<span class="hljs-params">pred, threshold=<span class="hljs-number">0.8</span>, objects=None</span>):</span>
    <span class="hljs-string">"""
    Assign a string name to predicted classes and filter out predictions below a given threshold.

    Args:
        pred: List containing tuples with class labels, probabilities, and bounding boxes.
        threshold: Minimum probability required to consider a prediction valid.
        objects: Optional list of object names to filter predictions.

    Returns:
        List of tuples containing class name, probability, and bounding box for each valid prediction.
    """</span>
    predicted_classes = [(COCO_INSTANCE_CATEGORY_NAMES[i], p, [(box[<span class="hljs-number">0</span>], box[<span class="hljs-number">1</span>]), (box[<span class="hljs-number">2</span>], box[<span class="hljs-number">3</span>])])
                         <span class="hljs-keyword">for</span> i, p, box <span class="hljs-keyword">in</span> zip(list(pred[<span class="hljs-number">0</span>][<span class="hljs-string">'labels'</span>].numpy()),
                                              pred[<span class="hljs-number">0</span>][<span class="hljs-string">'scores'</span>].detach().numpy(),
                                              list(pred[<span class="hljs-number">0</span>][<span class="hljs-string">'boxes'</span>].detach().numpy()))]
    predicted_classes = [stuff <span class="hljs-keyword">for</span> stuff <span class="hljs-keyword">in</span> predicted_classes <span class="hljs-keyword">if</span> stuff[<span class="hljs-number">1</span>] &gt; threshold]

    <span class="hljs-keyword">if</span> objects <span class="hljs-keyword">and</span> predicted_classes:
        predicted_classes = [(name, p, box) <span class="hljs-keyword">for</span> name, p, box <span class="hljs-keyword">in</span> predicted_classes <span class="hljs-keyword">if</span> name <span class="hljs-keyword">in</span> objects]

    <span class="hljs-keyword">return</span> predicted_classes
</code></pre>
<p>Fungsi <code>get_predictions</code> dibuat untuk memproses dan menyaring prediksi yang dibuat oleh model deteksi objek. Fungsi ini menerima tiga parameter: <code>pred</code> sebagai output mentah dari model, <code>threshold</code> untuk menyaring hasil prediksi yang memiliki tingkat confidence rendah, dan <code>objects</code> dalam bentuk list yang sifatnya opsional berfungsi berdasarkan kelas tertentu. Pertama, fungsi ini mengubah prediksi mentah menjadi format yang lebih mudah dibaca dengan membuat daftar tuple yang berisi nama kelas, probabilitas deteksi, dan koordinat kotak pembatas. Kemudian, fungsi menyaring prediksi yang tidak memenuhi ambang batas probabilitas dan, jika parameter <em>objects</em> diberikan, hanya menyisakan prediksi yang sesuai dengan nama objek yang ditentukan. Hasil akhirnya adalah daftar tuple yang sudah difilter, yang siap digunakan untuk analisis atau visualisasi lebih lanjut.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Function to draw bounding boxes around detected objects</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">draw_box</span>(<span class="hljs-params">predicted_classes, image, rect_th=<span class="hljs-number">1</span>, text_size=<span class="hljs-number">1</span>, text_th=<span class="hljs-number">1</span></span>):</span>
    <span class="hljs-string">"""
    Draw bounding boxes and labels around detected objects in an image.

    Args:
        predicted_classes: List of tuples containing class name, probability, and bounding box.
        image: Image tensor on which boxes and labels will be drawn.
        rect_th: Thickness of the rectangle.
        text_size: Font size of the label text.
        text_th: Thickness of the label text.
    """</span>
    img = (np.clip(cv2.cvtColor(np.clip(image.numpy().transpose((<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">0</span>)), <span class="hljs-number">0</span>, <span class="hljs-number">1</span>), cv2.COLOR_RGB2BGR), <span class="hljs-number">0</span>, <span class="hljs-number">1</span>) * <span class="hljs-number">255</span>).astype(np.uint8).copy()
    <span class="hljs-keyword">for</span> predicted_class <span class="hljs-keyword">in</span> predicted_classes:
        label, probability, box = predicted_class
        t, l = box[<span class="hljs-number">0</span>]
        r, b = box[<span class="hljs-number">1</span>]
        t, l, r, b = [round(item) <span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> [t, l, r, b]]
        cv2.rectangle(img, (t, l), (r, b), (<span class="hljs-number">0</span>, <span class="hljs-number">255</span>, <span class="hljs-number">0</span>), rect_th)  <span class="hljs-comment"># Draw Rectangle</span>
        cv2.putText(img, <span class="hljs-string">f"<span class="hljs-subst">{label}</span>: <span class="hljs-subst">{str(round(probability, <span class="hljs-number">2</span>))}</span>"</span>, (t, l), cv2.FONT_HERSHEY_SIMPLEX, text_size, (<span class="hljs-number">0</span>, <span class="hljs-number">255</span>, <span class="hljs-number">0</span>), thickness=text_th)
    plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    plt.show()
</code></pre>
<p>Fungsi <strong>draw_box</strong> dibuat untuk memvisualisasikan hasil model deteksi objek dengan menggambar bounding box dan label di sekitar objek yang terdeteksi. Fungsi ini juga menerima parameter berupa daftar kelas yang diprediksi, gambar yang akan diolah, ketebalan kotak pembatas, serta ukuran dan ketebalan teks label. Fungsi ini mengubah gambar dari format tensor ke array NumPy. Selanjutnya, fungsi ini mengiterasi daftar kelas yang diprediksi, mengekstrak informasi kelas, probabilitas, dan koordinat kotak pembatas untuk digambar di atas gambar menggunakan OpenCV. Setelah itu, label yang berisi nama kelas dan probabilitas ditambahkan di sudut kiri atas bounding box. Akhirnya, gambar dikonversi kembali ke format RGB (dan ditampilkan menggunakan Matplotlib, sehingga kita bisa melihat objek yang terdeteksi beserta bounding box dan labelnya.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Function to clear GPU memory and delete images to free up RAM</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">save_RAM</span>(<span class="hljs-params">image_=False</span>):</span>
    <span class="hljs-string">"""
    Clear GPU memory and delete image variables to free up RAM.

    Args:
        image_: Boolean flag to indicate if the image object should be deleted.
    """</span>
    torch.cuda.empty_cache()
    <span class="hljs-keyword">global</span> image, img, pred
    <span class="hljs-keyword">del</span> img, pred
    <span class="hljs-keyword">if</span> image_:
        image.close()
        <span class="hljs-keyword">del</span> image
</code></pre>
<p>Fungsi <strong>save_RAM</strong> berfungsi untuk mengelola dan membebaskan memori, terutama dalam lingkungan di mana memori GPU terbatas dan perlu dikelola dengan hati-hati, seperti saat melakukan inferensi model deep learning. Fungsi ini berfokus pada pembersihan memori GPU dan secara opsional menghapus variabel gambar dari RAM. Caranya adalah dengan memanggil <code>torch.cuda.empty_cache()</code> untuk membersihkan cache memori GPU yang tidak terpakai, menggunakan <code>del</code> untuk menghapus variabel <code>img</code> dan <code>pred</code> dari memori, serta secara opsional menghapus variabel <code>image</code> jika parameter <code>image_</code> diatur ke <code>True</code>.</p>
<h3 id="heading-persiapan-model">Persiapan Model</h3>
<pre><code class="lang-python"><span class="hljs-comment"># Load Pre-Trained Faster RCNN Model</span>
model_ = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=<span class="hljs-literal">True</span>)
model_.eval()  <span class="hljs-comment"># Set the model to evaluation mode</span>

<span class="hljs-comment"># Disable gradient computation for all parameters</span>
<span class="hljs-keyword">for</span> name, param <span class="hljs-keyword">in</span> model_.named_parameters():
    param.requires_grad = <span class="hljs-literal">False</span>

print(<span class="hljs-string">"Model loaded successfully."</span>)
</code></pre>
<p>Selanjutnya adalah memuat model Faster R-CNN (Region-based Convolutional Neural Network) dengan backbone ResNet-50 dan Feature Pyramid Network (FPN) yang sudah dilatih sebelumnya untuk tugas deteksi objek. Model dimuat menggunakan fungsi <code>torchvision.models.detection.fasterrcnn_resnet50_fpn()</code> dengan argumen <code>pretrained=True</code>, yang berarti bobot model diinisialisasi dengan versi yang sudah dilatih sebelumnya. Kemudan model diatur ke mode evaluasi dengan <code>model_.eval()</code> untuk memastikan lapisan-lapisan yang ada berfungsi secara deterministik selama inferensi. Kode kemudian membekukan bobot model dengan mengatur <code>requires_grad = False</code> untuk setiap parameter, mencegah pembaruan selama inferensi.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Function to get predictions from the model</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">model</span>(<span class="hljs-params">x</span>):</span>
    <span class="hljs-keyword">with</span> no_grad():
        yhat = model_(x)
    <span class="hljs-keyword">return</span> yhat
</code></pre>
<p>Fungsi <code>model</code> di atas digunakan menghasilkan prediksi dari model deteksi objek yang sudah dilatih sebelumnya.</p>
<pre><code class="lang-python"><span class="hljs-comment"># COCO class names</span>
COCO_INSTANCE_CATEGORY_NAMES = [
    <span class="hljs-string">'__background__'</span>, <span class="hljs-string">'person'</span>, <span class="hljs-string">'bicycle'</span>, <span class="hljs-string">'car'</span>, <span class="hljs-string">'motorcycle'</span>, <span class="hljs-string">'airplane'</span>, <span class="hljs-string">'bus'</span>, <span class="hljs-string">'train'</span>, <span class="hljs-string">'truck'</span>, <span class="hljs-string">'boat'</span>,
    <span class="hljs-string">'traffic light'</span>, <span class="hljs-string">'fire hydrant'</span>, <span class="hljs-string">'N/A'</span>, <span class="hljs-string">'stop sign'</span>, <span class="hljs-string">'parking meter'</span>, <span class="hljs-string">'bench'</span>, <span class="hljs-string">'bird'</span>, <span class="hljs-string">'cat'</span>, <span class="hljs-string">'dog'</span>, <span class="hljs-string">'horse'</span>,
    <span class="hljs-string">'sheep'</span>, <span class="hljs-string">'cow'</span>, <span class="hljs-string">'elephant'</span>, <span class="hljs-string">'bear'</span>, <span class="hljs-string">'zebra'</span>, <span class="hljs-string">'giraffe'</span>, <span class="hljs-string">'N/A'</span>, <span class="hljs-string">'backpack'</span>, <span class="hljs-string">'umbrella'</span>, <span class="hljs-string">'N/A'</span>, <span class="hljs-string">'N/A'</span>, <span class="hljs-string">'handbag'</span>,
    <span class="hljs-string">'tie'</span>, <span class="hljs-string">'suitcase'</span>, <span class="hljs-string">'frisbee'</span>, <span class="hljs-string">'skis'</span>, <span class="hljs-string">'snowboard'</span>, <span class="hljs-string">'sports ball'</span>, <span class="hljs-string">'kite'</span>, <span class="hljs-string">'baseball bat'</span>, <span class="hljs-string">'baseball glove'</span>,
    <span class="hljs-string">'skateboard'</span>, <span class="hljs-string">'surfboard'</span>, <span class="hljs-string">'tennis racket'</span>, <span class="hljs-string">'bottle'</span>, <span class="hljs-string">'N/A'</span>, <span class="hljs-string">'wine glass'</span>, <span class="hljs-string">'cup'</span>, <span class="hljs-string">'fork'</span>, <span class="hljs-string">'knife'</span>, <span class="hljs-string">'spoon'</span>,
    <span class="hljs-string">'bowl'</span>, <span class="hljs-string">'banana'</span>, <span class="hljs-string">'apple'</span>, <span class="hljs-string">'sandwich'</span>, <span class="hljs-string">'orange'</span>, <span class="hljs-string">'broccoli'</span>, <span class="hljs-string">'carrot'</span>, <span class="hljs-string">'hot dog'</span>, <span class="hljs-string">'pizza'</span>, <span class="hljs-string">'donut'</span>, <span class="hljs-string">'cake'</span>,
    <span class="hljs-string">'chair'</span>, <span class="hljs-string">'couch'</span>, <span class="hljs-string">'potted plant'</span>, <span class="hljs-string">'bed'</span>, <span class="hljs-string">'N/A'</span>, <span class="hljs-string">'dining table'</span>, <span class="hljs-string">'N/A'</span>, <span class="hljs-string">'N/A'</span>, <span class="hljs-string">'toilet'</span>, <span class="hljs-string">'N/A'</span>, <span class="hljs-string">'tv'</span>, <span class="hljs-string">'laptop'</span>,
    <span class="hljs-string">'mouse'</span>, <span class="hljs-string">'remote'</span>, <span class="hljs-string">'keyboard'</span>, <span class="hljs-string">'cell phone'</span>, <span class="hljs-string">'microwave'</span>, <span class="hljs-string">'oven'</span>, <span class="hljs-string">'toaster'</span>, <span class="hljs-string">'sink'</span>, <span class="hljs-string">'refrigerator'</span>, <span class="hljs-string">'N/A'</span>, <span class="hljs-string">'book'</span>,
    <span class="hljs-string">'clock'</span>, <span class="hljs-string">'vase'</span>, <span class="hljs-string">'scissors'</span>, <span class="hljs-string">'teddy bear'</span>, <span class="hljs-string">'hair drier'</span>, <span class="hljs-string">'toothbrush'</span>
]
</code></pre>
<p>List di atas <code>COCO_INSTANCE_CATEGORY_NAMES</code> berisikan nama-nama kelas yang digunakan dalam dataset COCO (Common Objects in Context).</p>
<h3 id="heading-deteksi-model">Deteksi Model</h3>
<p>Setelah model siap, selanjutnya kita akan mencoba menggunakan model faster rcnn untuk memprediksi objek dalam berbagai gambar. Berikut beberapa contoh gambar yang akan kita lakukan deteksi objek di dalamnya</p>
<ol>
<li><p><strong>Deteksi pada gambar berisikan satu orang.</strong></p>
</li>
<li><p><strong>Deteksi pada gambar berisikan beberapa orang dalam satu gambar.</strong></p>
</li>
<li><p><strong>Deteksi anjing dan kucing.</strong></p>
</li>
<li><p><strong>Deteksi mobil dan pesawat</strong></p>
</li>
<li><p><strong>Deteksi pada gambar yang diunduh dari internet.</strong></p>
</li>
</ol>
<pre><code class="lang-python"><span class="hljs-comment"># 1. Predicting a Person</span>
img_path = <span class="hljs-string">'/kaggle/input/sample-images-for-object-detection/ronaldo.jpg'</span>
image = Image.open(img_path)
image = image.resize([int(<span class="hljs-number">0.5</span> * s) <span class="hljs-keyword">for</span> s <span class="hljs-keyword">in</span> image.size])
plt.imshow(image)
plt.show()

transform = transforms.Compose([transforms.ToTensor()])
img = transform(image)
pred = model([img])
pred_class = get_predictions(pred, objects=[<span class="hljs-string">"person"</span>])
draw_box(pred_class, img)
save_RAM(image_=<span class="hljs-literal">True</span>)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723538855305/66091af6-624e-4bee-9ecc-4bd503427fbb.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723538837977/3ba5b86e-b00a-4c30-83ab-0db0183d5502.png" alt class="image--center mx-auto" /></p>
<pre><code class="lang-python"><span class="hljs-comment"># 2. Predicting People</span>
img_path = <span class="hljs-string">'/kaggle/input/sample-images-for-object-detection/people.jpg'</span>
image = Image.open(img_path)
image = image.resize([int(<span class="hljs-number">0.5</span> * s) <span class="hljs-keyword">for</span> s <span class="hljs-keyword">in</span> image.size])
plt.imshow(image)
plt.show()

img = transform(image)
pred = model([img])
pred_thresh = get_predictions(pred, threshold=<span class="hljs-number">0.9</span>, objects=[<span class="hljs-string">"person"</span>])
draw_box(pred_thresh, img, rect_th=<span class="hljs-number">1</span>, text_size=<span class="hljs-number">1</span>, text_th=<span class="hljs-number">1</span>)
save_RAM(image_=<span class="hljs-literal">True</span>)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723538955854/7de6c1df-92a3-4079-9312-42ad422f6a8d.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723538975348/fdd597bb-fccc-46aa-a54d-f6bff28548ad.png" alt class="image--center mx-auto" /></p>
<pre><code class="lang-python">
<span class="hljs-comment"># 3. Predicting Cat and Dog</span>
img_path = <span class="hljs-string">'/kaggle/input/sample-images-for-object-detection/catanddog.jpg'</span>
image = Image.open(img_path)
image = image.resize([int(<span class="hljs-number">0.5</span> * s) <span class="hljs-keyword">for</span> s <span class="hljs-keyword">in</span> image.size])
plt.imshow(image)
plt.show()

img = transform(image)
pred = model([img])
pred_thresh = get_predictions(pred, threshold=<span class="hljs-number">0.8</span>)
draw_box(pred_thresh, img, rect_th=<span class="hljs-number">10</span>, text_size=<span class="hljs-number">10</span>, text_th=<span class="hljs-number">10</span>)
save_RAM(image_=<span class="hljs-literal">True</span>)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723539012232/0da4bcf4-29b2-40c3-a90b-30d7979c86a9.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723539002579/4b32e60e-fc81-4d47-9217-e0cc7642b93b.png" alt class="image--center mx-auto" /></p>
<pre><code class="lang-python"><span class="hljs-comment"># 4. Predicting a Car and a Plane</span>
img_path = <span class="hljs-string">'/kaggle/input/sample-images-for-object-detection/carandplane.jpg'</span>
image = Image.open(img_path)
image = image.resize([int(<span class="hljs-number">0.5</span> * s) <span class="hljs-keyword">for</span> s <span class="hljs-keyword">in</span> image.size])
plt.imshow(image)
plt.show()

img = transform(image)
pred = model([img])
pred_thresh = get_predictions(pred, threshold=<span class="hljs-number">0.9</span>)
draw_box(pred_thresh, img)
save_RAM(image_=<span class="hljs-literal">True</span>)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723539061147/1f3b8d1f-b833-4015-b794-135146787500.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723539048029/45d11eca-51d8-432c-ad44-41cf9fd3dcbb.png" alt class="image--center mx-auto" /></p>
<pre><code class="lang-python"><span class="hljs-comment"># 5. Predicting on an Uploaded Image</span>
url = <span class="hljs-string">'https://www.plastform.ca/wp-content/themes/plastform/images/slider-image-2.jpg'</span>
image = Image.open(requests.get(url, stream=<span class="hljs-literal">True</span>).raw).convert(<span class="hljs-string">'RGB'</span>)
plt.imshow(image)
plt.show()

img = transform(image)
pred = model([img])
pred_thresh = get_predictions(pred, threshold=<span class="hljs-number">0.95</span>)
draw_box(pred_thresh, img, rect_th=<span class="hljs-number">2</span>, text_size=<span class="hljs-number">1.5</span>, text_th=<span class="hljs-number">2</span>)
save_RAM(image_=<span class="hljs-literal">True</span>)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723539211881/6cdb6842-a9a8-4aa9-9edf-83730a64449d.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723539135247/df95cd3c-e15e-4d5b-9140-6cdf1abd305b.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-penutup">Penutup</h3>
<p>Pada artikel ini, kita sudah mencoba menggunakan model Faster R-CNN untuk melakukan deteksi objek. Apa yang kita lakukan barusan hanya bagian kecil, sehingga masih banyak eksplorasi lanjutan yang bisa kita coba sendiri nantinya. Seperti mencobanya pada data lain, otak-atik pada nilai threshold yang ada, sampai melakukan fine tuning pada model agar bisa melakukan deteksi objek pada benda-benda yang lebih banyak. Semoga artikel ini bermanfaat, terima kasih dan selamat belajar.</p>
<hr />
<p>Source Code : <a target="_blank" href="https://github.com/emhaihsan/blog-post-code/blob/main/notebooks/faster-rcnn-notebook.ipynb">Github</a> / <a target="_blank" href="https://www.kaggle.com/code/emhaihsan/faster-rcnn-notebook">Kaggle</a></p>
]]></content:encoded></item><item><title><![CDATA[Pengenalan Machine learning dengan PyTorch]]></title><description><![CDATA[PyTorch merupakan framework open-source yang banyak digunakan untuk membuat model AI baik dalam bidang akademik maupun industri dengan berbagai ragam…]]></description><link>https://emhaihsan.hashnode.dev/pengenalan-machine-learning-dengan-pytorch</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/pengenalan-machine-learning-dengan-pytorch</guid><category><![CDATA[2Articles1Week]]></category><category><![CDATA[Python]]></category><category><![CDATA[pytorch]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Thu, 01 Aug 2024 05:48:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/zr5FR4Yi4X8/upload/2df02bf19d5224c41686f3360e7af71c.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>PyTorch merupakan framework open-source yang banyak digunakan untuk membuat model AI baik dalam bidang akademik maupun industri dengan berbagai ragam bidang implementasi, mulai dari pengenalan gambar, pemrosesan bahasa alami, hingga pengenalan suara. PyTorch juga mendukung komputasi menggunakan CPU, GPU, bahkan pelatihan paralel dan terdistribusi di banyak GPU menggunakan node. Fleksibilitas yang ditawarkan oleh PyTorch menjadikannya salah pilihan utama yang banyak digunakan saat ini untuk mengembangkan dan mengoptimalkan jaringan saraf dalam.</p>
<p>Pada artikel ini, kita akan menggunakan PyTorch untuk membuat model sederhana untuk klasifikasi digit tulisan tangan. Kita akan belajar dari mulai membuat model, melatih, dan melakukan evaluasi. Serta bagaimana cara menyimpan model yang telah dilatih agar bisa digunakan kembali di masa yang akan datang.</p>
<h3 id="heading-mengimpor-library-yang-diperlukan">Mengimpor Library yang Diperlukan</h3>
<p>Berikut library-library yang akan digunakan pada project ini</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> torch
<span class="hljs-keyword">from</span> torch <span class="hljs-keyword">import</span> nn
<span class="hljs-keyword">from</span> torch.utils.data <span class="hljs-keyword">import</span> DataLoader
<span class="hljs-keyword">from</span> torchvision <span class="hljs-keyword">import</span> datasets, transforms
<span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt
<span class="hljs-keyword">from</span> ignite.engine <span class="hljs-keyword">import</span> Events, create_supervised_trainer, create_supervised_evaluator
<span class="hljs-keyword">from</span> ignite.metrics <span class="hljs-keyword">import</span> Accuracy, Loss
<span class="hljs-keyword">from</span> ignite.handlers <span class="hljs-keyword">import</span> EarlyStopping
<span class="hljs-keyword">from</span> ignite.contrib.handlers <span class="hljs-keyword">import</span> ProgressBar
</code></pre>
<p>Pada blok kode di atas, kami mengimpor modul-modul terkait yang esensial. <code>torch</code> adalah pustaka inti PyTorch. <code>nn</code> digunakan untuk membuat neural network. <code>DataLoader</code> digunakan untuk memuat data dalam batch, membuatnya lebih mudah dikelola saat pelatihan. <code>datasets</code> dan <code>transforms</code> dari <code>torchvision</code> digunakan untuk mengunduh dataset MNIST dan mengubah gambar menjadi tensor. <code>ignite</code> digunakan membuat proses pelatihan model lebih transparan.</p>
<h3 id="heading-mengunduh-dataset-dan-membuat-data-loader">Mengunduh Dataset dan Membuat Data Loader</h3>
<p>Di sini kita akan menggunakan dataset MNIST, dataset ini terdiri dari 60.000 gambar digit tulisan tangan. Dataset akan dibagi menjadi dua subset terpisah untuk melatih dan menguji model AI. Gambar-gambar dalam dataset MNIST berukuran 28x28 piksel.</p>
<pre><code class="lang-python">training_data = datasets.MNIST(
    root=<span class="hljs-string">"data"</span>,
    train=<span class="hljs-literal">True</span>,
    download=<span class="hljs-literal">True</span>,
    transform=transforms.ToTensor()
)

test_data = datasets.MNIST(
    root=<span class="hljs-string">"data"</span>,
    train=<span class="hljs-literal">False</span>,
    download=<span class="hljs-literal">True</span>,
    transform=transforms.ToTensor()
)

batch_size = <span class="hljs-number">64</span>
train_dataloader = DataLoader(training_data, batch_size=batch_size)
test_dataloader = DataLoader(test_data, batch_size=batch_size)
</code></pre>
<p>Kode di atas menunjukkan proses mengunduh data train dan data test MNIST. Dataset ini telah tersedia di library <code>torchvision</code> dan bisa dengan dengan mudah digunakan untuk eksperimen. Parameter <code>root</code> digunakan untuk menentukan lokasi penyimpanan data, <code>train=True</code> menunjukkan bahwa ini adalah data latih, <code>download=True</code> mengindikasikan bahka kita akan mengunduhnya jika belum ada, dan <code>transform=transforms.ToTensor()</code> mengonversi gambar menjadi tensor PyTorch. Selanjutnya menggunakan <code>DataLoader</code> kita membuat iterator untuk data train dan data test, yang mana akan memuat data dalam batch berukuran 64.</p>
<h3 id="heading-mendefinisikan-model">Mendefinisikan Model</h3>
<p>Selanjutnya adalah mendefinisakn model jaringan saraf dengan lapisan input, lapisan hidden, dan lapisan output. Model ini menggunakan fungsi aktivasi ReLU di antara lapisan-lapisan tersebut. Karena gambar input adalah tensor 1x28x28, maka kita akan meratakannya menjadi tensor 784 elemen sebelum meneruskannya ke model:</p>
<pre><code class="lang-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NeuralNetwork</span>(<span class="hljs-params">nn.Module</span>):</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span>(<span class="hljs-params">self, input_size, hidden_size, num_classes</span>):</span>
        super(NeuralNetwork, self).__init__()
        self.flatten = nn.Flatten()
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(input_size, hidden_size),
            nn.ReLU(),
            nn.Linear(hidden_size, hidden_size),
            nn.ReLU(),
            nn.Linear(hidden_size, num_classes)
        )

    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span>(<span class="hljs-params">self, x</span>):</span>
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        <span class="hljs-keyword">return</span> logits

input_size = <span class="hljs-number">28</span> * <span class="hljs-number">28</span>
hidden_size = <span class="hljs-number">512</span>
num_classes = <span class="hljs-number">10</span>
model = NeuralNetwork(input_size, hidden_size, num_classes)
</code></pre>
<p>Kelas <code>NeuralNetwork</code> mewarisi dari <code>nn.Module</code>, yang merupakan kelas dasar untuk semua modul jaringan saraf di PyTorch. Dalam metode <code>__init__</code>, kita mendefinisikan lapisan-lapisan jaringan. <code>nn.Flatten()</code> digunakan untuk meratakan tensor input. Lapisan <code>nn.Linear</code> merupakan lapisan fully connected yang menjadi inti dari model kita, dan <code>nn.ReLU</code> adalah fungsi aktivasi.</p>
<h3 id="heading-pelatihan-dan-evaluasi">Pelatihan dan Evaluasi</h3>
<p>Selanjutnya adalah membuat loop untuk pelatihan dan evaluasi, proses ini merupakan inti dari pelatihan model menggunakan PyTorch</p>
<pre><code class="lang-python">device = torch.device(<span class="hljs-string">"cuda"</span> <span class="hljs-keyword">if</span> torch.cuda.is_available() <span class="hljs-keyword">else</span> <span class="hljs-string">"cpu"</span>)
model.to(device)
</code></pre>
<p>Di sini kita tentukan perangkat yang akan digunakan untuk pelatihan model. Apabila kita memiliki GPU, maka perangkat tersebut akan digunakan. Jika tidak, maka CPU yang akan digunakan. Selanjutnya adalah memindahkan model yang telah dibuat ke perangkat yang telah ditentukan (entah CPU atau GPU).</p>
<pre><code class="lang-python">learning_rate = <span class="hljs-number">1e-3</span>
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
</code></pre>
<p>Selanjutnya adalah mengatur laju learning rate untuk optimizer. Di sini kita memilih 0,001 (1e-3). Learning rate akan menentukan seberapa besar pembaharuan bobot yang akan dilakukan oleh model selama pelatihan. Selanjutnya adalah menentukan <code>nn.CrossEntropyLoss</code> adalah fungsi kerugian yang umum digunakan untuk tugas klasifikasi dengan beberapa kelas. Terakhir kita mendefinisikan optimizer yang akan digunakan untuk memperbarui parameter model. Kita menggunakan <code>torch.optim.Adam</code>, dan <code>model.parameters()</code> untuk memberikan parameter model yang akan diperbarui oleh optimizer. Di sini juga kita memasukkan learning rate yang sudah ditetapkan sebelumnya.</p>
<pre><code class="lang-python">trainer = create_supervised_trainer(model, optimizer, loss_fn, device=device)

evaluator = create_supervised_evaluator(model, 
                                        metrics={<span class="hljs-string">'accuracy'</span>: Accuracy(), <span class="hljs-string">'loss'</span>: Loss(loss_fn)}, 
                                        device=device)
pbar = ProgressBar(persist=<span class="hljs-literal">True</span>)
pbar.attach(trainer)
</code></pre>
<p>Kemudian kita membuat objek trainer dan evaluator menggunakan <code>ignite</code>. Jika biasanya membuat kode untuk training dan evaluasi secara manual, di sini kita menggunakan <code>create_supervised_trainer</code> dan <code>create_supervised_evaluator</code> dari ignite. Dengan menggunakan Ignite, kode kita bisa lebih bersih dan lebih mudah dipahami. Selanjutnya adalah progress bar menggunakan <code>ignite.contrib.handlers.ProgressBar</code> untuk memantau proses pelatihan. Progress bar ini kemudian dihubungkan ke objek trainer.</p>
<pre><code class="lang-python">train_losses = []
val_losses = []
</code></pre>
<p>Sebelum memulai pelatihan kita menginisialisasi dua list kosong untuk menyimpan nilai loss pada proses training dan validasi yang nantinya akan divisualisasikan.</p>
<pre><code class="lang-python"><span class="hljs-meta">@trainer.on(Events.EPOCH_COMPLETED)</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">log_training_results</span>(<span class="hljs-params">trainer</span>):</span>
    evaluator.run(train_dataloader)
    metrics = evaluator.state.metrics
    train_loss = metrics[<span class="hljs-string">'loss'</span>]
    train_losses.append(train_loss)
    print(<span class="hljs-string">f"Training Results - Epoch: <span class="hljs-subst">{trainer.state.epoch}</span>  Avg loss: <span class="hljs-subst">{train_loss:<span class="hljs-number">.2</span>f}</span>"</span>)

<span class="hljs-meta">@trainer.on(Events.EPOCH_COMPLETED)</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">log_validation_results</span>(<span class="hljs-params">trainer</span>):</span>
    evaluator.run(test_dataloader)
    metrics = evaluator.state.metrics
    val_loss = metrics[<span class="hljs-string">'loss'</span>]
    val_losses.append(val_loss)
    print(<span class="hljs-string">f"Validation Results - Epoch: <span class="hljs-subst">{trainer.state.epoch}</span>  Avg loss: <span class="hljs-subst">{val_loss:<span class="hljs-number">.2</span>f}</span>"</span>)
</code></pre>
<p>Blok kode di atas adalah fungsi-fungsi yang akan dijalankan setiap kali satu epoch pelatihan selesai. Evaluator training dijalankan pada data pelatihan untuk menghitung metrik (akurasi dan loss). Nilai loss training disimpan dalam list <code>train_losses</code> dan ditampilkan. Begitu juga evaluator validation dijalankan pada data tes untuk menghitung metrik (akurasi dan loss). Nilai validation loss disimpan dalam list <code>val_losses</code> dan ditampilkan.</p>
<pre><code class="lang-python">handler = EarlyStopping(patience=<span class="hljs-number">5</span>, score_function=<span class="hljs-keyword">lambda</span> engine: -engine.state.metrics[<span class="hljs-string">'loss'</span>], trainer=trainer)
evaluator.add_event_handler(Events.COMPLETED, handler)
trainer.run(train_dataloader, max_epochs=<span class="hljs-number">10</span>)
</code></pre>
<p>Kemudian kita juga akan menerapkan early stopping menggunakan <code>ignite.handlers.EarlyStopping</code>. Adanya Early stopping berfungsi untuk menghentikan proses training ketika validation loss tidak membaik setelah sejumlah epoch tertentu (dalam hal ini 5 epoch). Handler early stopping ini kemudian ditambahkan ke evaluator. Dan terakhir kita menjalankan pelatihan model menggunakan objek trainer pada data pelatihan sebanyak 10 epoch.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1722486375936/fc9cd99b-b5dc-44e3-9439-795149124e66.png" alt class="image--center mx-auto" /></p>
<pre><code class="lang-python">plt.plot(train_losses, label=<span class="hljs-string">'Training loss'</span>)
plt.plot(val_losses, label=<span class="hljs-string">'Validation loss'</span>)
plt.legend()
plt.xlabel(<span class="hljs-string">'Epochs'</span>)
plt.ylabel(<span class="hljs-string">'Loss'</span>)
plt.title(<span class="hljs-string">'Training and Validation Loss'</span>)
plt.show()
</code></pre>
<p>Setelah proses pelatihan selesai kita lakukan plotting loss pada data training dan validation untuk melihat progres kinerja model sepanjang pelatihan.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1722486388827/f3235cec-1331-4818-8bf7-4ebb663c9288.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-menyimpan-model-dan-visualisasi-hasil">Menyimpan Model dan Visualisasi Hasil</h3>
<p>Setelah model dilatih, kita dapat menyimpan parameter model dan agar bisa digunakan kembali untuk melakukan inferensi. Agar bisa lebih mudah dipahami, kita juga akan memvisualisasikan gambar-gambar yang diprediksi beserta labelnya.</p>
<pre><code class="lang-python">torch.save(model.state_dict(), <span class="hljs-string">"ml_with_pytorch_model.pth"</span>)
print(<span class="hljs-string">"Saved PyTorch Model State to ml_with_pytorch_model.pth"</span>)

model = NeuralNetwork(input_size, hidden_size, num_classes)
model.load_state_dict(torch.load(<span class="hljs-string">"ml_with_pytorch_model.pth"</span>))
model.to(device)

model.eval()
fig, axes = plt.subplots(<span class="hljs-number">1</span>, <span class="hljs-number">10</span>, figsize=(<span class="hljs-number">15</span>, <span class="hljs-number">3</span>))
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">10</span>):
    x, y = test_data[i][<span class="hljs-number">0</span>], test_data[i][<span class="hljs-number">1</span>]
    <span class="hljs-keyword">with</span> torch.no_grad():
        x = x.unsqueeze(<span class="hljs-number">0</span>).to(device)
        pred = model(x)
        predicted, actual = pred[<span class="hljs-number">0</span>].argmax(<span class="hljs-number">0</span>).item(), y

    axes[i].imshow(x.cpu().squeeze(), cmap=<span class="hljs-string">'gray'</span>)
    axes[i].set_title(<span class="hljs-string">f'Pred: <span class="hljs-subst">{predicted}</span>\nAct: <span class="hljs-subst">{actual}</span>'</span>)
    axes[i].axis(<span class="hljs-string">'off'</span>)

plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1722486545500/4fbc717e-8e38-423d-b89a-3f8438951064.png" alt class="image--center mx-auto" /></p>
<p>Dengan melakukan visualisasi terhadap hasil, kita bisa mendapatkan bayangan bagaimana model bisa melakukan prediksi.</p>
<h3 id="heading-kesimpulan">Kesimpulan</h3>
<p>Pada artikel ini, kita telah membahas bagaimana menggunakan PyTorch untuk membuat, melatih, dan mengevaluasi model neural network sederhana untuk klasifikasi digit tulisan tangan menggunakan dataset MNIST. PyTorch merupakan salah satu framework yang paling banyak digunakan saat ini. Mengetahui banyak framework akan sangat berguna karena akan membuat kita lebih fleksibel dan untuk bekerja dan eksplorasi dalam bidang machine learning. Terimakasih sudah membaca artikel ini, terus berlatih dan selamat belajar.</p>
<p>Source Code : <a target="_blank" href="https://www.kaggle.com/code/emhaihsan/intro-ml-with-pytorch/">Kaggle</a> / <a target="_blank" href="https://github.com/emhaihsan/blog-post-code/blob/main/notebooks/intro-ml-with-pytorch.ipynb">Github</a></p>
]]></content:encoded></item><item><title><![CDATA[Artificial Intelligence for IT Operations]]></title><description><![CDATA[Adanya teknologi baru seringkali memberikan istilah dan definisi baru yang menggambarkan penggunaan spesifik dari teknologi tersebut. Sebagai contoh jika…]]></description><link>https://emhaihsan.hashnode.dev/artificial-intelligence-for-it-operations</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/artificial-intelligence-for-it-operations</guid><category><![CDATA[Artificial Intelligence]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Wed, 24 Jul 2024 04:58:53 GMT</pubDate><content:encoded><![CDATA[<p>Adanya teknologi baru seringkali memberikan istilah dan definisi baru yang menggambarkan penggunaan spesifik dari teknologi tersebut. Sebagai contoh jika kita kembali ke awal tahun 2000an, orang tidak mengenal pekerjaan seperti Data Scientist, AI Engineer dan ML Engineer, hal ini berbeda dengan saat ini ketika pekerjaan-pekerjaan tersebut menjadi pekerjaan yang sangat hype saat ini. Pada artikel ini, term yang akan kita bahas adalah AIOps. AIOps merupakan istilah yang diperkenalkan oleh Gartner, ia didefinisikan sebagai kombinasi antara big data dan machine learning untuk mengotomatisasi proses operasi IT, termasuk korelasi peristiwa, deteksi anomali, dan penentuan sebab-akibat. Singkatnya, AIOps adalah kecerdasan buatan untuk operasi IT.</p>
<h2 id="heading-pengenalan-aiops">Pengenalan AIOps</h2>
<p>AIOps mengintegrasikan sistem AI khusus ke dalam operasional IT yang ada agar bisa melakukan pemrosesan data yang cepat, cerdas dan mendukung analisis berkelanjutan. Adanya integrasi ini bertujuan untuk meningkatkan observabilitas sistem IT. Sehingga bisa mengoptimalkan kinerja, mengurangi biaya operasional, dan bisa melakukan otomasi terhadap penyelesaian masalah. Caranya adalah dengan memanfaatkan AI dan machine learning untuk melakukan tugas-tugas manusia yang bersifat repetitif, memerlukan pemantauan terus menerus, atau melibatkan pemrosesan data dalam jumlah besar.</p>
<h2 id="heading-penerapan-aiops-di-dunia-nyata">Penerapan AIOps di Dunia Nyata</h2>
<h3 id="heading-manajemen-konsumsi-energi-di-data-center">Manajemen Konsumsi Energi di Data Center</h3>
<p>AIOps bisa memberikan dampak pada konsumsi energi di data center. Misalnya, mengatur pengelolaan energi data center agar efisien dengan cara melibatkan pemantauan berbagai faktor seperti suhu, kelembaban, beban server, dan konsumsi energi. Tools AIOps bisa mengumpulkan data dari sensor di seluruh data dan menggunakan machine learning untuk mendeteksi anomali yang ada. Jika rak server mengalami overheating atau mengonsumsi lebih banyak energi dari biasanya, sistem AIOps bisa secara otomatis mengidentifikasi dan mengatasi masalah tersebut, sehingga implikasinya adalah mengurangi konsumsi energi tanpa mengorbankan kinerja.</p>
<h3 id="heading-otomatisasi-tugas-rutin">Otomatisasi Tugas Rutin</h3>
<p>AIOps bisa mengotomatisasi tugas-tugas IT yang rutin dan cenderung membosankan, dengan demikian staf IT bisa lebih fokus pada aktivitas yang strategis dan lebih bernilai. Misalnya, AIOps bisa menyaring data dalam jumlah besar yang dihasilkan oleh infrastruktur IT modern, kemudian ia bisa dengan cepat mengidentifikasi apakah ada insight yang relevan di dalamnya. Otomatisasi ini akan membantu tim IT menangani tugas-tugas repetitif dengan lebih efisien dan akurat, sehingga memungkinkan mereka untuk berkonsentrasi pada proyek yang lebih kompleks dan strategis.</p>
<h3 id="heading-meningkatkan-dukungan-it">Meningkatkan Dukungan IT</h3>
<p>Adanya AIOps juga bisa meningkatkan dukungan pada IT dengan cara mengotomatisasi analisis log dan jejak penggunaan di seluruh layanan, baik perangkat keras maupun perangkat lunak. Dengan ini sistem AI bisa mengidentifikasi masalah potensial, melakukan analisis pada akar masalah yang ada, dan bisa memberikan peringatan dini, hal ini memungkinkan tim IT untuk segera menangani masalah. Selain itu, AIOps bisa memberikan dukungan otomatis melalui chatbot, sehingga membantu pengguna untuk menangani masalah IT yang umum sebelum melibatkan agen lapangan langsung.</p>
<h2 id="heading-peran-manusia-dalam-aiops">Peran Manusia dalam AIOps</h2>
<p>Meskipun kemampuan otomatisasi AIOps sangat besar, peran manusia tetaplah penting. Karena pada dasarnya sistem AI hanya bisa melakukan tugas yang telah dilatih sebelumnya, sehingga adanya penilaian manusia tetap penting untuk skenario-skenario yang berada di luar cakupan AIOps. Selain itu, pengawasan manusia diperlukan untuk memastikan sistem AI yang etis dan tidak bias.</p>
<p>Solusi AIOps bisa saja menampilkan bias, baik secara sengaja maupun tidak sengaja. Misalnya, jika data historis yang digunakan untuk melatih model AI mengandung bias, model akan belajar dan memiliki bias ini. Sehingga penting untuk memastikan bahwa data yang dimasukkan ke dalam sistem AIOps mewakili seluruh spektrum skenario operasi IT untuk menghindari bias. Pemantauan dan perbaikan terus-menerus pada AIOps juga sangat penting untuk menjaga efektivitas dan keadilannya.</p>
<h2 id="heading-kesimpulan">Kesimpulan</h2>
<p>Keberadaan AIOps bisa membantu operasional IT dengan mengotomatisasi tugas rutin, meningkatkan dukungan, dan mengoptimalkan kinerja melalui kemampuan teknologi AI dan machine learning. Meskipun AIOps menawarkan manfaat yang signifikan, peran manusia tetap tak tergantikan untuk pemecahan masalah kreatif, pengambilan keputusan etis, dan pengawasan operasi AI. Seiring AIOps terus berkembang, para profesional IT harus beradaptasi dengan perubahan ini dan memanfaatkan teknologi untuk meningkatkan kemampuan, memastikan hubungan simbiosis mutualisme antara kecerdasan manusia dan kecerdasan buatan dalam operasional IT.</p>
<hr />
<p>Sumber : <a target="_blank" href="https://www.linkedin.com/learning/exploring-aiops/exploring-aiops">Linkedin Learning</a></p>
]]></content:encoded></item><item><title><![CDATA[Membuat Chatbot dengan Model Gratis dan Berbayar menggunakan LangChain]]></title><description><![CDATA[Berbicara tentang chatbot, saat ini tidak akan jauh dari ChatGPT. ChatGPT merupakan teknologi Large Language Models (LLMs) dari OpenAI yang berfokus pada…]]></description><link>https://emhaihsan.hashnode.dev/membuat-chatbot-dengan-model-gratis-dan-berbayar-menggunakan-langchain</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/membuat-chatbot-dengan-model-gratis-dan-berbayar-menggunakan-langchain</guid><category><![CDATA[langchain]]></category><category><![CDATA[llm]]></category><category><![CDATA[GPT 4]]></category><category><![CDATA[phi3]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Tue, 23 Jul 2024 02:48:46 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/Xe7za0JtTeM/upload/603e7c1844167a780f98bfefccb8458e.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Berbicara tentang chatbot, saat ini tidak akan jauh dari ChatGPT. ChatGPT merupakan teknologi Large Language Models (LLMs) dari OpenAI yang berfokus pada text generation yang menyerupai manusia. Pada artikel ini, kita akan belajar cara membuat aplikasi chatbot menggunakan LangChain, sebuah ekosistem yang memudahkan integrasi LLMs. Di sini nantinya kita akan mencoba membuat chatbot menggunakan model berbayar seperti GPT dan model open source seperti Phi-3.</p>
<h2 id="heading-apa-itu-langchain">Apa itu LangChain?</h2>
<p>LangChain merupakan ekosistem yang menyediakan sejumlah modul dan tools untuk membangun aplikasi LLMs. Dengan LangChain, pengembang dapat dengan mudah mengintegrasikan berbagai model LLM, baik itu yang berbayar seperti GPT-3 dari OpenAI, maupun model open source melalui platform seperti Hugging Face. LangChain memungkinkan penggunaan modul-modul penting yang diperlukan untuk membangun chatbot, seperti template prompt, parser output, dan lainnya.</p>
<h2 id="heading-mengapa-menggunakan-langchain">Mengapa Menggunakan LangChain?</h2>
<p>LangChain menawarkan beberapa keuntungan utama bagi pengembang:</p>
<ol>
<li><p><strong>Kemudahan Integrasi</strong>: LangChain mempermudah integrasi berbagai model LLMs ke dalam aplikasi. Dengan modul yang telah terstruktur dengan baik, pengembang tidak perlu menulis banyak kode boilerplate untuk menghubungkan model dengan aplikasi mereka.</p>
</li>
<li><p><strong>Fleksibilitas</strong>: LangChain mendukung penggunaan berbagai model, baik berbayar maupun open source, sehingga pengembang dapat memilih model yang paling sesuai dengan kebutuhan mereka.</p>
</li>
<li><p><strong>Monitoring dan Tracing</strong>: LangChain memiliki fitur monitoring dan tracing yang memungkinkan pengembang melacak performa dan penggunaan model dalam aplikasi mereka secara real-time. Ini membantu dalam debugging dan pengoptimalan aplikasi.</p>
</li>
</ol>
<h2 id="heading-langkah-awal-dalam-membangun-chatbot">Langkah Awal dalam Membangun Chatbot</h2>
<p>Untuk memulai pembangunan chatbot dengan LangChain, ada beberapa langkah dasar yang perlu dilakukan:</p>
<ol>
<li><p><strong>Membuat Virtual Environment</strong>: Penting untuk membuat lingkungan virtual menggunakan tools seperti <code>conda</code> atau <code>venv</code> agar dependensi proyek terisolasi dan mudah dikelola.</p>
</li>
<li><p><strong>Mengatur Environment Variable</strong>: Menyimpan kunci API dan informasi penting lainnya dalam variabel lingkungan untuk menjaga keamanan dan kemudahan akses dalam kode.</p>
</li>
<li><p><strong>Menggunakan Template Prompt</strong>: Template prompt digunakan untuk mendefinisikan cara chatbot merespon input dari pengguna. Ini termasuk sistem prompt yang memberi instruksi dasar pada model dan user prompt yang menerima input dari pengguna.</p>
</li>
<li><p><strong>Menggunakan Output Parser</strong>: Output parser digunakan untuk memproses output dari model LLM sehingga dapat ditampilkan atau digunakan lebih lanjut dalam aplikasi.</p>
</li>
</ol>
<h2 id="heading-studi-kasus-chatbot-dengan-gpt-3-dan-model-open-source">Studi Kasus: Chatbot dengan GPT-3 dan Model Open Source</h2>
<p>Dalam tutorial ini, kita akan membuat dua jenis chatbot:</p>
<ol>
<li><p><strong>Chatbot dengan API Berbayar</strong>: Menggunakan GPT-4o dari OpenAI, kita akan menunjukkan bagaimana cara mengatur dan mengintegrasikan model ini ke dalam aplikasi chatbot menggunakan LangChain.</p>
</li>
<li><p><strong>Chatbot dengan Model Open Source</strong>: Menggunakan model open source seperti Phi3, kita akan melihat bagaimana cara mendownload dan menggunakan model ini secara lokal dalam aplikasi chatbot.</p>
</li>
</ol>
<h3 id="heading-implementasi-kode-chatbot-dengan-gpt-4o-mini-dan-ollama-phi-3">Implementasi Kode Chatbot dengan GPT-4o Mini dan Ollama Phi 3</h3>
<h3 id="heading-kode-1-chatbot-dengan-openai-gpt-4o-mini">Kode 1: Chatbot dengan OpenAI GPT-4o Mini</h3>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> langchain_openai <span class="hljs-keyword">import</span> ChatOpenAI
<span class="hljs-keyword">from</span> langchain_core.prompts <span class="hljs-keyword">import</span> ChatPromptTemplate
<span class="hljs-keyword">from</span> langchain_core.output_parsers <span class="hljs-keyword">import</span> StrOutputParser 

<span class="hljs-keyword">import</span> streamlit <span class="hljs-keyword">as</span> st
<span class="hljs-keyword">import</span> os
<span class="hljs-keyword">from</span> dotenv <span class="hljs-keyword">import</span> load_dotenv
</code></pre>
<p>Bagian ini mengimpor berbagai library yang diperlukan, termasuk <code>ChatOpenAI</code> dari <code>langchain_openai</code>, <code>ChatPromptTemplate</code> dan <code>StrOutputParser</code> dari <code>langchain_core</code>, serta <code>streamlit</code> untuk membangun antarmuka web. Library <code>os</code> dan <code>dotenv</code> digunakan untuk mengelola variabel lingkungan yang menyimpan kunci API.</p>
<pre><code class="lang-python">os.environ[<span class="hljs-string">"OPENAI_API_KEY"</span>] = os.getenv(<span class="hljs-string">"OPENAI_API_KEY"</span>)
os.environ[<span class="hljs-string">"LANGCHAIN_TRACING_V2"</span>] = <span class="hljs-string">"true"</span>
os.environ[<span class="hljs-string">"LANGCHAIN_API_KEY"</span>] = os.getenv(<span class="hljs-string">"LANGCHAIN_API_KEY"</span>)
</code></pre>
<p>Mengatur variabel lingkungan <code>OPENAI_API_KEY</code> dan <code>LANGCHAIN_API_KEY</code> untuk mengaktifkan tracing dan pemantauan menggunakan LangChain.</p>
<pre><code class="lang-python">prompt = ChatPromptTemplate.from_messages([
    (<span class="hljs-string">"system"</span>, <span class="hljs-string">"You are a helpful assistant. Please respond to the queries"</span>),
    (<span class="hljs-string">"user"</span>, <span class="hljs-string">"Question:{question}"</span>),
])
</code></pre>
<p>Template prompt dibuat menggunakan <code>ChatPromptTemplate</code> yang berisi dua bagian: instruksi sistem dan pertanyaan pengguna. Template ini akan digunakan untuk memandu model dalam memberikan respon.</p>
<pre><code class="lang-python">st.set_page_config(
    page_title=<span class="hljs-string">"Chatbot"</span>,
    page_icon=<span class="hljs-string">":robot:"</span>
)

st.header(<span class="hljs-string">"GPT 4o Mini Chatbot"</span>)

input_text = st.text_input(<span class="hljs-string">"Search the topic u want"</span>)
</code></pre>
<p>Antarmuka Streamlit diatur dengan menambahkan konfigurasi halaman, termasuk judul dan ikon, serta menampilkan header dan input teks untuk pengguna memasukkan pertanyaan.</p>
<pre><code class="lang-python">llm =ChatOpenAI(model=<span class="hljs-string">"gpt-4o-mini"</span>)
output_parser = StrOutputParser()
chain=prompt|llm|output_parser
</code></pre>
<p>Model GPT-4o Mini dikonfigurasi menggunakan <code>ChatOpenAI</code>, dan keluaran model diproses menggunakan <code>StrOutputParser</code>. Semua komponen ini dirangkai menjadi satu rantai menggunakan operator <code>|</code>.</p>
<pre><code class="lang-python"><span class="hljs-keyword">if</span> input_text:
    st.write(chain.invoke({<span class="hljs-string">"question"</span>: input_text}))
</code></pre>
<p>Jika ada input dari pengguna, rantai dieksekusi dengan input tersebut dan hasilnya ditampilkan menggunakan <code>st.write</code>.</p>
<h3 id="heading-kode-2-chatbot-dengan-phi-3">Kode 2: Chatbot dengan Phi 3</h3>
<p>Untuk model open source, kita akan menggunakan <a target="_blank" href="https://ollama.com/">Ollama</a> untuk menjalankannya dari local. Di sini kita menggunakan model Phi3, model ini dipilih karena ukurannya yang relatif kecil. Anda dipersilahkan untuk menggunakan model lainnya jika memiliki sumber daya komputasi yang mencukupi. Untuk melihat model-model yang tersedia anda bisa melihatnya di <a target="_blank" href="https://github.com/ollama/ollama/blob/main/README.md#quickstart">github Ollama</a>.</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> langchain_core.prompts <span class="hljs-keyword">import</span> ChatPromptTemplate
<span class="hljs-keyword">from</span> langchain_core.output_parsers <span class="hljs-keyword">import</span> StrOutputParser 
<span class="hljs-keyword">from</span> langchain_ollama <span class="hljs-keyword">import</span> ChatOllama
<span class="hljs-keyword">import</span> streamlit <span class="hljs-keyword">as</span> st
<span class="hljs-keyword">import</span> os
<span class="hljs-keyword">from</span> dotenv <span class="hljs-keyword">import</span> load_dotenv

load_dotenv()
</code></pre>
<p>Di sini kita modul yang sama dan mengganti <code>ChatOpenAI</code> dengan <code>ChatOllama</code> untuk model Ollama untuk menggunakan Phi 3. Kita juga mengatur variabel lingkungan dengan cara yang sama untuk mengaktifkan tracing dan pemantauan dengan LangChain.</p>
<pre><code class="lang-python">os.environ[<span class="hljs-string">"LANGCHAIN_TRACING_V2"</span>] = <span class="hljs-string">"true"</span>
os.environ[<span class="hljs-string">"LANGCHAIN_API_KEY"</span>] = os.getenv(<span class="hljs-string">"LANGCHAIN_API_KEY"</span>)
</code></pre>
<p>Mengatur variabel lingkungan sama seperti pada kode sebelumnya.</p>
<pre><code class="lang-python">prompt = ChatPromptTemplate.from_messages([
    (<span class="hljs-string">"system"</span>, <span class="hljs-string">"You are a helpful assistant. Please respond to the queries"</span>),
    (<span class="hljs-string">"user"</span>, <span class="hljs-string">"Question:{question}"</span>),
])
</code></pre>
<p>Template prompt yang sama digunakan untuk memberikan instruksi kepada model.</p>
<pre><code class="lang-python">st.set_page_config(
    page_title=<span class="hljs-string">"Chatbot"</span>,
    page_icon=<span class="hljs-string">":robot:"</span>
)

st.header(<span class="hljs-string">"Phi 3 Chatbot"</span>)

input_text = st.text_input(<span class="hljs-string">"Search the topic u want"</span>)
</code></pre>
<p>Antarmuka Streamlit diatur dengan header yang berbeda untuk membedakan antara chatbot GPT-4o Mini dan Phi 3.</p>
<pre><code class="lang-python">llm =ChatOllama(model=<span class="hljs-string">"phi3"</span>)
output_parser = StrOutputParser()
chain=prompt|llm|output_parser
</code></pre>
<p>Model Phi 3 dikonfigurasi menggunakan <code>ChatOllama</code>, dan keluaran model diproses dengan <code>StrOutputParser</code>. Komponen ini dirangkai menjadi satu rantai menggunakan operator <code>|</code>.</p>
<pre><code class="lang-python"><span class="hljs-keyword">if</span> input_text:
    st.write(chain.invoke({<span class="hljs-string">"question"</span>: input_text}))
</code></pre>
<p>Jika ada input dari pengguna, hasilnya ditampilkan menggunakan <code>st.write</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721700549497/2071b63b-a00c-44f0-825c-c3152525c81e.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721700557830/56850d61-1f4d-427a-84e2-31691ab9f6d3.png" alt class="image--center mx-auto" /></p>
<p>Gambar di atas merupakan contoh kedua chatbot ketika menerima prompt "tell me a funny dad joke". Kita bisa melihat bahwa meskipun memiliki ukuran lebih kecil dan gratis, phi3 tetap bisa memberikan jawaban yang relevan. Oleh karena itu, kita bisa mempertimbangkan penggunaan model-model open source pada project kita sebagai alternatif dari model GPT.</p>
<h2 id="heading-penutup">Penutup</h2>
<p>Mengembangkan chatbot yang efisien dan responsif kini semakin mudah dengan adanya ekosistem seperti LangChain. Melalui integrasi yang mulus dan penggunaan modul-modul yang terstruktur dengan baik, LangChain mempermudah pengembang untuk menghubungkan berbagai model bahasa, baik berbayar seperti GPT dari OpenAI maupun open source seperti Phi-3.</p>
<p>Pada artikel ini, kita telah melihat langkah-langkah dasar dalam membangun chatbot, mulai dari membuat lingkungan virtual hingga menggunakan template prompt dan output parser. Dengan contoh implementasi menggunakan GPT-4o Mini dan Phi-3, kita dapat melihat bagaimana kedua model ini bisa diintegrasikan ke dalam aplikasi chatbot dengan mudah dan efisien.</p>
<p>Meskipun model berbayar seperti GPT menawarkan kinerja yang sangat baik, model open source seperti Phi-3 juga menunjukkan potensi besar dalam memberikan respons yang relevan dan berguna. Oleh karena itu, pengembang dapat mempertimbangkan penggunaan model-model open source sebagai alternatif yang lebih ekonomis tanpa mengorbankan kualitas.</p>
<p>Dengan LangChain, kita memiliki fleksibilitas untuk memilih model yang paling sesuai dengan kebutuhan proyek kita, serta kemampuan untuk memantau dan mengoptimalkan performa chatbot secara real-time. Ini membuka peluang baru bagi pengembangan aplikasi chatbot yang lebih canggih dan responsif di berbagai bidang. Terima kasih sudah membaca artikel ini, tetap semangat dan selamat belajar!</p>
<hr />
<p>Source code : <a target="_blank" href="https://github.com/emhaihsan/blog-post-code/tree/main/ollama">Github</a></p>
]]></content:encoded></item><item><title><![CDATA[Pengenalan Large Language Model]]></title><description><![CDATA[Perkembangan teknologi kecerdasan buatan (AI) telah membawa banyak inovasi, terutama dalam bidang pemrosesan bahasa alami (NLP). Salah satu terobosan…]]></description><link>https://emhaihsan.hashnode.dev/pengenalan-large-language-model</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/pengenalan-large-language-model</guid><category><![CDATA[llm]]></category><category><![CDATA[Python]]></category><category><![CDATA[Machine Learning]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Mon, 22 Jul 2024 14:47:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/Fc1GBkmV-Dw/upload/9af389abc356be7aaaf738aa2131fdca.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Perkembangan teknologi kecerdasan buatan (AI) telah membawa banyak inovasi, terutama dalam bidang pemrosesan bahasa alami (NLP). Salah satu terobosan terbesar adalah pengembangan Large Language Models (LLMs) yang mampu memahami dan menghasilkan teks menyerupai manusia. Model seperti GPT-4 dan ChatGPT dari OpenAI telah menjadi sangat populer karena kemampuan mereka dalam berbagai aplikasi, mulai dari menjawab pertanyaan hingga membantu dalam penulisan kode. Artikel ini akan membahas berbagai aspek terkait LLM, termasuk bagaimana mereka dilatih, komponen utama yang membentuknya, serta beberapa model terkenal seperti BERT, GPT-3, Chinchilla, PaLM, dan LLaMA.</p>
<h2 id="heading-transformers-di-bidang-nlp">Transformers di Bidang NLP</h2>
<h3 id="heading-apa-itu-large-language-models">Apa itu Large Language Models?</h3>
<p>Belakangan ini, kata GPT-4 dan ChatGPT semakin popoler di kalangan masyarakat umum. Kedua istilah ini mengacu pada Large Language Models/LLMs, yaitu jenis AI yang mampu memahami dan menghasilkan teks menyerupai manusia. LLM dapat digunakan untuk menjawab pertanyaan, menghasilkan konten, merangkum teks, menjelaskan suatu hal, dan membuat dialog. Penggunaan LLM dalam keseharian bisa ditemui pada sistem seperti chatbot, asisten virtual, dan aplikasi penerjemah. Namun, perkembangan dalam riset Natural Language Processing (NLP) sendiri telah booming jauh sebelum populernya GPT dan ChatGPT. Tepatnya sejak 2017, ketika tim peneliti dari Google mengusulkan arsitektur model AI yang disebut Transformer dalam makalah "Attention is All You Need".</p>
<p>Cara kerja LLM adalah kita berinteraksi dengannya menggunakan teks biasa, yang sering disebut sebagai prompt, kemudian model tersebut akan merespon dengan teks yang disebut completion atau output. Misalnya, jika kita ingin tahu apakah suatu buku itu menarik, kita bisa meminta LLM untuk merangkum beberapa bab awal dari buku tersebut.</p>
<h3 id="heading-bagaimana-sebuah-llm-dilatih-pre-training">Bagaimana sebuah LLM dilatih? Pre-training</h3>
<p>Pada awalnya, LLM memiliki bobot acak dan belum mempunyai pengetahuan tentang bahasa. Ketika prompt diberikan di tahap ini, model hanya akan berhalusinasi. Namun, dengan melatih model menggunakan sejumlah data berukuran besar, model akan menyesuaikan bobotnya sebagai bagian dari proses pelatihan. Tahap pre-training ini sangat membutuhkan sumber daya yang sangat besar. Sebagai contoh, LLaMA, yang dirilis oleh Meta pada tahun 2023, menggunakan campuran data dari Common Crawl, C4, GitHub, Wikipedia, buku, artikel ilmiah, dan tanya jawab dari Stack Exchange. Setiap set data ini diambil dengan proporsi tertentu selama pelatihan, di mana model melihat sampel data beberapa kali (epoch).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721648865279/b9cb990a-545b-4848-8c92-05663e8a00b3.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>Sumber gambar : <a target="_blank" href="https://arxiv.org/pdf/2302.13971">https://arxiv.org/pdf/2302.13971</a></p>
</blockquote>
<p>Selain dari segi data, pelatihan LLM juga membutuhkan sumber daya komputasi yang amat sangat besar, pada umumnya dilakukan di ruang server dengan ratusan hingga ribuan unit GPU di dalamnya. Proses ini bisa memakan waktu hingga beberapa minggu atau bulan serta biaya hingga jutaan dolar AS. Hasil akhirnya adalah model seperti GPT-3 dari OpenAI, yang mana ia mampu menghasilkan teks bahasa Inggris yang cukup manusiawi. Namun, model ini belum tentu bisa mengikuti instruksi dengan baik. Oleh karena itu, untuk membuat LLM berfungsi sebagai asisten virtual yang efektif, diperlukan tambahan langkah agar model dapat mengikuti instruksi dengan lebih baik.</p>
<h3 id="heading-membuat-llm-mengikuti-instruksi">Membuat LLM mengikuti instruksi</h3>
<p>Sebagaimana telah disebut sebelumnya, suatu LLM pada awalnya tidak dapat mengikuti instruksi dengan baik. Pada tahun 2022, OpenAI merilis penelitian berjudul "Training Language Models to Follow Instructions with Human Feedback". Proses pelatihan di sini melibatkan dua komponen utama: supervised fine-tuning dan reinforcement learning with human feedback (RLHF). Dalam fine-tuning terawasi, peneliti membuat prompt dan labeler yang ahli dalam data teks menulis output yang diharapkan. Model dilatih menggunakan prompt dan output ini agar semakin mahir menghasilkan teks yang sesuai dengan harapan labeler.</p>
<p><img src="https://miro.medium.com/v2/resize:fit:1400/1*6eW04x-l4ewcHfHQZOX5gw.png" alt /></p>
<blockquote>
<p>Sumber gambar : <a target="_blank" href="https://medium.com/@yash9439/introduction-to-llms-and-the-generative-ai-part-3-fine-tuning-llm-with-instruction-and-326bc95e07ae">https://medium.com/@yash9439/introduction-to-llms-and-the-generative-ai-part-3-fine-tuning-llm-with-instruction-and-326bc95e07ae</a></p>
</blockquote>
<p>Reinforcement learning dari umpan balik manusia (RLHF) melibatkan labeler yang menilai beberapa output dari model berdasarkan prompt tertentu. Misalnya, untuk tugas merangkum artikel berita, model akan menghasilkan beberapa ringkasan yang kemudian dinilai oleh labeler. Model bahasa kemudian dioptimalkan menggunakan reinforcement learning, di mana model dihargai jika menghasilkan teks yang mengikuti instruksi dengan baik serta tidak bersifat toksik atau tidak benar. Metode ini telah menghasilkan model bahasa yang jauh lebih baik dalam mengikuti instruksi,</p>
<h2 id="heading-komponen-di-dalam-llm">Komponen di Dalam LLM</h2>
<h3 id="heading-arsitektur-transformer">Arsitektur Transformer</h3>
<p>Model bahasa besar terdiri dari beberapa komponen, salah satunya adalah arsitektur transformer yang terdiri dari encoder dan decoder. Encoder menerima input teks, seperti "I like this movie," dan mengubahnya menjadi representasi yang dapat dipahami oleh model. Decoder kemudian menggunakan representasi ini untuk menghasilkan output, seperti menerjemahkan teks ke dalam bahasa Indonesia, "Saya suka film ini." Transformer tidak hanya memiliki satu encoder dan satu decoder, tetapi enam encoder dan enam decoder yang bekerja bersama melalui mekanisme attention. Mekanisme ini memungkinkan model untuk fokus pada bagian-bagian penting dari teks input, sehingga dapat menangkap pemahaman yang lebih mendalam dan kompleks tentang semantik bahasa. Encoder-dekoder digunakan untuk tugas generatif seperti terjemahan dan ringkasan, sementara encoder saja digunakan untuk tugas pemahaman bahasa seperti klasifikasi kalimat.</p>
<p><img src="https://machinelearningmastery.com/wp-content/uploads/2021/10/transformer_1-727x1024.png" alt /></p>
<blockquote>
<p>Sumber Gambar : <a target="_blank" href="https://arxiv.org/abs/1706.03762">Attention Is All You Need</a></p>
</blockquote>
<p>Model seperti BERT (Bidirectional Encoder Representations from Transformers) menggunakan hanya encoder saja, model ini efektif untuk tugas-tugas yang memerlukan pemahaman bahasa yang baik, seperti klasifikasi teks. Sementara itu, model seperti ChatGPT, GPT-3, dan GPT-4 menggunakan decoder saja dan efektif untuk tugas generatif seperti pembuatan teks.</p>
<h3 id="heading-apa-itu-parameter">Apa itu Parameter?</h3>
<p>Ketika membahas LLM, kita sering merujuk pada ukuran model atau jumlah parameternya. Sebagai contoh, GPT-3 memiliki 175 miliar parameter, sementara model terbesar Llama 2 dari Meta memiliki 70 miliar parameter. Parameter dalam jaringan neural adalah variabel yang dipelajari model selama proses pelatihan. Mereka disesuaikan untuk meminimalkan perbedaan antara output yang diprediksi dan output aktual. Dalam jaringan neural, node (disebut juga neuron) menerima input, memprosesnya, dan meneruskan output ke node lain. Setiap koneksi antara node memiliki bobot, yang disesuaikan selama pelatihan. Selain bobot, ada juga istilah bias yang membantu menyesuaikan output.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721655774684/89430998-6ffb-49bc-bbb9-998e60aa12ba.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>sumber : <a target="_blank" href="https://www.linkedin.com/learning/introduction-to-large-language-models/what-are-parameters?resume=false">https://www.linkedin.com/learning/introduction-to-large-language-models/</a></p>
</blockquote>
<p>Contoh di atas adalah suatu neural network yang di dalamnya terdapat lapisan input, lapisan tersembunyi, dan lapisan output, di mana setiap node di satu lapisan terhubung dengan setiap node di lapisan berikutnya. Untuk menghitung jumlah parameter, kita mengalikan jumlah node di dua lapisan yang terhubung dan menambahkan jumlah bias. Misalnya, jaringan dengan tiga node input, dua lapisan tersembunyi dengan empat node masing-masing, dan satu node output akan memiliki total 41 parameter. Sebagian besar LLM saat ini memiliki miliaran parameter, angka ini menunjukkan kompleksitas dan kemampuan mereka untuk mempelajari dan memproses bahasa. Parameter ini adalah kunci dalam menentukan seberapa baik model dapat melakukan tugas-tugas tertentu.</p>
<h3 id="heading-apa-itu-token">Apa itu Token?</h3>
<p>Yang dihasilkan oleh suatu LLM bukanlah berupa teks kata demi kata, melainkan menghasilkan token. Token merupakan pecahan kata yang lebih kecil, di mana satu token kira-kira terdiri dari empat karakter teks. Tokenisasi adalah proses membagi kata menjadi bagian-bagian yang lebih kecil atau token. Pada umumnya, sebagian besar kata akan menjadi token tersendiri, termasuk spasi di depannya. Namun, ada beberapa pengecualian. Misalnya, kata "tokenization" terdiri dari dua token, yaitu "token" dan "ization". Dalam sebuah kalimat yang terdiri dari 3 kata, dapat terpecah menjadi 5 token, di mana tanda tanya di akhir kalimat juga dihitung sebagai satu token.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721656032985/c93346f7-e8d9-4aa2-89fe-8d8ce7e97398.png" alt class="image--center mx-auto" /></p>
<p>Kita dapat menggunakan tool Tokenizer di situs <a target="_blank" href="https://platform.openai.com/tokenizer">OpenAI</a> untuk bisa mencoba ibarat seperti gambar di atas. Ketika memasukkan teks ke dalam Tokenizer, kita akan melihat bahwa setiap warna berbeda menunjukkan token yang berbeda. Ini membantu kita memahami bagaimana kata-kata dipecah menjadi token-token kecil. Dengan memahami konsep token, kita dapat mengerti bagaimana LLM memproses dan menghasilkan teks dengan lebih efisien, menggunakan unit-unit yang lebih kecil alih-alih menggunakan satu kata utuh.</p>
<h3 id="heading-apa-itu-context-length">Apa itu Context Length?</h3>
<p>Panjang konteks (Context length) adalah jumlah total token yang dapat diingat oleh LLM dalam suatu percakapan. Panjang konteks mengacu pada jumlah total token dari prompt dan completion yang diingat oleh model untuk menghasilkan respons yang lebih relevan dan bermakna. Misalnya, gpt-3.5-turbo memiliki panjang konteks sekitar 16,385 token dan gpt-4-turbo memiliki 128,000 token, konteks yang lebih panjang memungkinkan pemrosesan teks yang lebih banyak dan detail.</p>
<p>Kemampuan model dengan panjang konteks yang lebih besar memungkinkan mereka untuk menjawab pertanyaan tentang teks yang panjang dengan cepat dan akurat. Misalnya, model gpt-4o bisa menerima seluruh isi buku <strong><em>Naar de 'Republiek Indonesia'</em></strong> karya Tan Malaka yang memiliki total 13604 kata dengan keseluruhan token 30415 token dalam satu jendela konteks.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721659890679/7bf10923-41f9-4eb7-a1ef-cac54a2501e9.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721656985660/a36c342b-3f7a-45ca-a2a4-ac314d5e4776.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-hukum-skalabilitas">Hukum Skalabilitas</h3>
<p>Pada tahun 2020, bidang teknologi mengalami lonjakan eksperimen setelah kemunculan arsitektur transformer yang diperkenalkan pada 2017. Berbagai perusahaan fokus pada bagian encoder atau decoder, dan ada jugayang mencoba meningkatkan performa model secara keseluruhan. Di saat inilah tim riset OpenAI menemukan kesimpulan bahwa performa model besar bergantung pada jumlah parameter model, ukuran dataset yang digunakan untuk pelatihan, dan total daya komputasi yang tersedia. Mereka melakukan berbagai eksperimen yang menunjukkan bahwa semakin besar model dan dataset, serta semakin banyak komputasi yang digunakan, semakin rendah test loss, yang berarti performa model semakin baik.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721657713359/e540d9f5-1a9c-48f2-bde1-1d379aa33f47.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>Sumber : <a target="_blank" href="https://arxiv.org/pdf/2001.08361">https://arxiv.org/pdf/2001.08361</a></p>
</blockquote>
<p>Grafik hasil eksperimen menunjukkan bahwa menambah jumlah layer, ukuran dataset, dan daya komputasi dapat meningkatkan performa model. Namun, peningkatan terbesar didapatkan dari memperbesar ukuran model. Ketika OpenAI menerbitkan hasil penelitian ini pada tahun 2020, banyak perusahaan teknologi besar mulai meningkatkan ukuran model bahasa mereka, salah satunya adalah OpenAI dengan GPT-3 yang memiliki 175 miliar parameter. Ini secara signifikan meningkatkan performa model dibandingkan model bahasa lainnya pada saat itu. Hukum skalabilitas ini menekankan bahwa untuk mendapatkan performa terbaik, ukuran model, jumlah data pelatihan, dan daya komputasi harus ditingkatkan secara bersamaan.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721657576753/c4686fe9-746f-436d-9fdf-224356e4804a.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>Sumber : <a target="_blank" href="https://arxiv.org/pdf/2001.08361">https://arxiv.org/pdf/2001.08361</a></p>
</blockquote>
<h2 id="heading-beberapa-contoh-large-language-models">Beberapa Contoh Large Language Models</h2>
<h3 id="heading-bert">BERT</h3>
<p>BERT (Bidirectional Encoder Representations from Transformers) adalah LLM yang dikembangkan oleh Google berdasarkan pada arsitektur transformer. BERT hanya menggunakan lapisan encoder transformer untuk memahami bahasa dengan lebih baik, sehingga memungkinkan search engine Google memberikan jawaban yang lebih relevan dan langsung menjawab pertanyaan pengguna. BERT memiliki sekitar 110 juta parameter dan dilatih menggunakan Wikipedia bahasa Inggris dan BookCorpus, yang terdiri dari 11.000 buku.</p>
<p><img src="https://miro.medium.com/v2/resize:fit:876/0*ViwaI3Vvbnd-CJSQ.png" alt="BERT Explained: State of the art language model for NLP | by Rani Horev |  Towards Data Science" /></p>
<blockquote>
<p>Sumber : <a target="_blank" href="https://towardsdatascience.com/bert-explained-state-of-the-art-language-model-for-nlp-f8b21a9b6270">https://towardsdatascience.com/bert-explained-state-of-the-art-language-model-for-nlp-f8b21a9b6270</a></p>
</blockquote>
<p>Berbeda dengan model text generation seperti ChatGPT dan GPT-4, BERT dilatih untuk melakukan dua tugas khusus: masked language modeling (MLM) dan next sentence prediction (NSP). Pada tugas MLM, BERT harus menebak kata yang disembunyikan dalam sebuah kalimat, sementara tugas NSP memintanya menentukan apakah dua kalimat berurutan secara logis. Tugas-tugas ini membuat BERT memiliki pemahaman yang mendalam tentang bahasa, sehingga sangat berguna dalam meningkatkan akurasi hasil pencarian Google. Meskipun BERT tidak digunakan untuk menghasilkan teks, kemampuannya dalam memahami bahasa menjadikannya sangat efektif dalam berbagai penerapan.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721657448430/c836dbf6-4f87-4a9e-86ea-2e9f3f029f4f.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>Contoh hasil search engine pasca BERT. Di mana hasil pencarian juga memberikan highlight pada kata-kata terkait.</p>
</blockquote>
<h3 id="heading-gpt-3">GPT-3</h3>
<p>GPT-3 merupakan salah satu LLM yang paling terkenal, dikembangkan oleh OpenAI. Nama GPT-3 mewakili tiga konsep utama: generatif (generative), yang berarti memprediksi token berikutnya berdasarkan token sebelumnya; pre-trained, yang berarti model ini dilatih dengan data dalam jumlah besar seperti Wikipedia bahasa Inggris; dan transformer, yang menggunakan bagian decoder dari arsitektur transformer. GPT-3 memiliki 175 miliar parameter dan dilatih untuk tugas prediksi token berikutnya. Selain itu, GPT-3 mendukung few-shot learning, yang memungkinkan model ini menyelesaikan berbagai tugas baru dengan memberikan beberapa contoh saja.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721657909850/c6e69ed0-c0aa-46ea-8ca8-6190c992b130.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>Sumber : <a target="_blank" href="https://arxiv.org/pdf/2005.14165">https://arxiv.org/pdf/2005.14165</a></p>
</blockquote>
<p>Sebelumnya, LLM perlu dilatih ulang untuk setiap tugas spesifik seperti analisis sentimen atau menjawab pertanyaan, dengan memberikan ratusan contoh berlabel. Namun, dengan GPT-3, para peneliti menemukan bahwa model yang sangat besar ini dapat melakukan berbagai tugas baru hanya dengan beberapa contoh dan instruksi yang jelas. I Hasil penelitian menunjukkan bahwa model GPT-3 yang lebih besar, dengan 175 miliar parameter, mampu mencapai akurasi yang lebih tinggi dibandingkan model yang lebih kecil, membuatnya lebih fleksibel dan serbaguna dalam menangani berbagai tugas tanpa pelatihan khusus untuk masing-masing tugas.</p>
<h3 id="heading-chinchilla">Chinchilla</h3>
<p>Selama bertahun-tahun, tren dalam pengembangan LLM adalah memperbesar ukuran model. Namun, hipotesis muncul tim dari DeepMind yang berpendapat bahwa LLM selama ini dilatih dengan data yang kurang memadai. Mereka berpendapat bahwa performa model yang ada bisa jauh lebih baik dengan melatih model yang lebih kecil namun dengan jumlah data yang lebih banyak dan dalam waktu yang lebih lama. Untuk menguji hipotesis ini, tim DeepMind melatih beberapa ratus model bahasa dengan ukuran bervariasi dari 70 juta hingga 16 miliar parameter, dan melatihnya dengan berbagai jumlah data dari lima hingga 500 miliar token. Berdasarkan hasil eksperimen ini, mereka menciptakan Chinchilla, model dengan 70 miliar parameter yang dilatih dengan 1,4 triliun token.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721658311587/1712cb77-ae9b-4619-88fb-8d04300ed6b5.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>Sumber : <a target="_blank" href="https://arxiv.org/pdf/2203.15556">https://arxiv.org/pdf/2203.15556</a></p>
</blockquote>
<p>Hasilnya, Chinchilla, meskipun lebih kecil dari model lain seperti Gopher (280 miliar parameter), GPT-3 (175 miliar parameter), dan Megatron-Turing (530 miliar parameter), memberikan performa yang lebih baik pada berbagai tugas bahasa. Hal ini mengindikasikan bahwa dengan ukuran komputasi yang sama, model yang lebih kecil namun dilatih dengan lebih banyak data dapat menghasilkan kinerja yang lebih baik. Eksperimen menunjukkan bahwa menyeimbangkan ukuran model dan jumlah data pelatihan adalah kunci untuk mencapai performa optimal. Chinchilla dilatih dengan lebih dari empat kali jumlah data dibandingkan LLM lainnya, menjadikannya model yang lebih efisien dan unggul dalam banyak tugas pemahaman bahasa.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721658319031/d47d393c-187e-4f51-8904-4a3f340347b0.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>Sumber : <a target="_blank" href="https://arxiv.org/pdf/2203.15556">https://arxiv.org/pdf/2203.15556</a></p>
</blockquote>
<h3 id="heading-palm-dan-palm-2">PaLM dan PaLM 2</h3>
<p>Google merilis PaLM (Pathways Language Model) pada April 2022, yang merupakan salah satu model bahasa terbesar dengan 540 miliar parameter. PaLM dilatih menggunakan sistem Pathway, yang memungkinkan penggunaan lebih banyak akselerator perangkat keras untuk efisiensi pelatihan. Model ini dilatih pada 780 miliar token dari korpus multibahasa yang mencakup lebih dari 100 bahasa, dengan sekitar 75% dari data pelatihan dalam bahasa Inggris. Studi menunjukkan bahwa model dengan 8 miliar parameter mampu melakukan tugas tertentu seperti menjawab pertanyaan dan pemahaman bahasa, sementara model dengan 62 miliar parameter dapat menangani terjemahan, ringkasan, dan penalaran umum. Namun, diperlukan lonjakan signifikan hingga 540 miliar parameter untuk menangani tugas-tugas seperti pengetahuan umum dan pemahaman terhadap bacaan. PaLM melampaui model seperti Gopher dan Chinchilla dalam berbagai tolok ukur pemahaman dan generasi bahasa alami.</p>
<p>Pada Mei 2023, Google merilis <a target="_blank" href="https://ai.google/discover/palm2/">PaLM 2</a> yang mengungguli kemampuan PaLM. Meskipun Google tidak merilis informasi mengenai ukuran model atau jumlah data pelatihan , PaLM 2 dilatih pada lebih dari 100 bahasa dan mampu memahami serta menghasilkan teks yang lebih bernuansa. Model ini telah lulus ujian kemahiran bahasa tingkat lanjutan dan dilatih menggunakan makalah ilmiah serta artikel penelitian yang memilik banyak notasi matematika, sehingga menjadikannya lebih baik dalam menangani tugas yang berkaitan dengan logika dan penalaran. PaLM 2 juga unggul dalam menghasilkan dan mengoreksi kode dalam berbagai bahasa pemrograman. PaLM 2 berukuran terkecil bahkan dapat berjalan di perangkat seluler dan digunakan untuk memperkuat fitur di produk Google seperti Gmail dan Google Docs, serta berkontribusi dalam mengembangkan Bard, LLM lainnya dari Google. Selain itu, PaLM 2 juga digunakan untuk melatih Med-PaLM 2 yang berfokus pada data-data medis.</p>
<h3 id="heading-chatgpt-dan-gpt-4">ChatGPT dan GPT-4</h3>
<p>ChatGPT diluncurkan pada 30 November 2022 dan segera mencapai 100 juta pengguna aktif bulanan dalam dua bulan. ChatGPT adalah versi yang disempurnakan dari GPT-3.5, yang menggunakan teknik supervised fine-tuning dan reinforcement learning with Human Feedback (RLHF) sehingga menjadikannya lebih lihai dalam mengikuti instruksi. Hal ini membuatnya sangat efektif untuk dialog interaktif, sehingga dapat digunakan sebagai chatbot untuk membantu berbagai tugas, termasuk membantu menulis kode program. GPT-4, yang dirilis pada Maret 2023, membawa peningkatan lebih lanjut dalam hal kemampuan penalaran dan kompleksitas tugas yang dapat ditangani, contohnya pada hal-hal terkait penalaran logis. GPT-4 bahkan menunjukkan kinerja setara manusia ketika mengerjakan soal ujian sekolah menengah at. Salah satu perkembangan signifikan adalah kemampuan fine-tuning GPT-4. OpenAI juga memungkinkan fine-tuning GPT-4 sehingga memungkinkan pengguna untuk menyesuaikan model sesuai dengan kebutuhan spesifik mereka.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721658828021/13ee96d2-5f3a-4f73-b279-38f3b4c00401.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>Sumber : <a target="_blank" href="https://openai.com/index/gpt-4-research/">https://openai.com/index/gpt-4-research/</a></p>
</blockquote>
<h3 id="heading-open-llms">Open LLMs</h3>
<p>Selain model dari perusahaan teknologi besar seperti Google dan OpenAI, terdapat juga model open source dari komunitas yang menarik untuk diikuti. OpenAI memberikan akses ke GPT-3 melalui API, tetapi tidak memberikan akses ke bobot model yang memungkinkan peneliti untuk memodifikasi dan bereksperimen dengan model tersebut. Sementara itu, Meta merilis OPT (Open Pre-trained Transformers) yang terdiri dari berbagai model dekoder yang dilatih dengan parameter antara 125 juta hingga 66 miliar. Para peneliti dapat mengajukan permohonan akses ke model yang lebih besar, hingga 175 miliar parameter. Selain itu, Hugging Face bersama lebih dari 1.000 peneliti dari berbagai negara dan lembaga menciptakan model BLOOM dengan 176 miliar parameter yang semuanya terbuka untuk diakses.</p>
<p>Pada Februari 2023, Meta merilis model LLaMA dengan parameter 7, 13, 30, dan 65 miliar, yang hanya dapat digunakan untuk penelitian dan tujuan non-komersial. Sehingga memungkinkan peneliti untuk mengembangkan kapabilitas LLaMA lebih lanjut melalui penyetelan instruksi dan pelatihan pada data yang tidak berbahasa inggris. Model LLaMA 2 dirilis pada Juli 2023 dengan panjang konteks 4.000 token dan dilatih dengan dua triliun token. Komunitas terbuka kemudian segera menghasilkan model yang lebih baik dari LLaMA 2 dalam waktu singkat, seperti Stable Beluga 2 dari Stability AI. Meskipun LLaMA 2 tidak sepenuhnya open source dan masih memerlukan izin dari Meta selaku pembuatnya, model ini menunjukkan bahwa model terbuka bisa semakin mendekati performa model tertutup seperti ChatGPT.</p>
<h3 id="heading-membandingkan-llm">Membandingkan LLM</h3>
<p>Untuk membandingkan LLM, Stanford University mengusulkan HELM (Holistic Evaluation of Language Models) yang memberikan pandangan holistik tentang performa model dengan mengevaluasi berbagai dataset. HELM mencakup berbagai tolok ukur seperti pemahaman bahasa multitugas (MMLU) dan peringkasan teks (CNN dan Daily). HELM juga mengukur ketahanan model terhadap teks dengan kesalahan ketik atau ejaan yang salah, di mana model dengan akurasi tinggi cenderung lebih tangguh.</p>
<p>Selain HELM, HuggingFace menawarkan leaderboard model open source yang memungkinkan perbandingan model berdasarkan berbagai tolak ukur. Beberapa tolok ukur tersebut termasuk tantangan penalaran (ARC), inferensi akal sehat (HellaSwag), akurasi multitugas teks (MMLU), dan kemampuan menghindari kesalahan informasi umum (TruthfulQA).</p>
<h2 id="heading-penutup">Penutup</h2>
<p>Transformasi dalam bidang natural language processing (NLP) melalui pengembangan LLM telah membuka banyak peluang baru dalam berbagai aplikasi teknologi. Dari peningkatan kualitas hasil pencarian di Google dengan BERT hingga kemampuan penalaran kompleks dari GPT-4, kemajuan ini menunjukkan potensi besar dari LLM dalam membantu dan meningkatkan berbagai aspek kehidupan manusia. Meski demikian, tantangan tetap ada, termasuk kebutuhan akan sumber daya komputasi yang besar dan masalah terkait akurasi serta ketahanan model terhadap kesalahan. Melalui kolaborasi antara komunitas riset dan perusahaan teknologi besar, serta perkembangan model open-source, kita dapat mengharapkan peningkatan lebih lanjut dalam performa dan aksesibilitas LLM di masa depan. Dengan pemahaman yang lebih mendalam tentang teknologi ini, kita dapat memanfaatkannya secara optimal untuk berbagai keperluan, dari pendidikan hingga industri. Terima kasih sudah membaca artikel ini, tetap produktif dan selamat belajar.</p>
<hr />
<p>Sumber Konten : <a target="_blank" href="https://www.linkedin.com/learning/introduction-to-large-language-models/">https://www.linkedin.com/learning/introduction-to-large-language-models/</a></p>
]]></content:encoded></item><item><title><![CDATA[Membuat Aplikasi Voice to Voice Translator dengan Python]]></title><description><![CDATA[Pengembangan teknologi kecerdasan artifisial khusunya di bidang large language model semakin membuka kesempatan pemanfaatan yang semakin luas. Salah…]]></description><link>https://emhaihsan.hashnode.dev/membuat-aplikasi-voice-to-voice-translator-dengan-python</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/membuat-aplikasi-voice-to-voice-translator-dengan-python</guid><category><![CDATA[voice to voice]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[llm]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Mon, 22 Jul 2024 06:38:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/ASKeuOZqhYU/upload/33f2533d73352ab4dbe126f49d10f3c5.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Pengembangan teknologi kecerdasan artifisial khusunya di bidang large language model semakin membuka kesempatan pemanfaatan yang semakin luas. Salah satunya adalah penerjemahan bahasa voice to voice di mana di sini digabungkan voice recognition, language transation, dan teknologi text-to-voice. Cara kerja aplikasi ini adalah mengambil input suara dalam satu bahasa, lalu mentranskripsinya ke teks, kemudian menerjemahkan teks tersebut ke bahasa lain, dan terakhir mengubah teks yang diterjemahkan kembali menjadi suara. Dengan adanya teknologi ini, implikasi yang mungkin didapatkan adalah teratasinya hambatan bahasa sehingga memungkinkan komunikasi real-time di berbagai bahasa.</p>
<p>Dalam artikel ini, kita akan membuat aplikasi translator voice to voice sederhana menggunakan Python. Di sini kita akan menggunakan Gradio untuk interface, AssemblyAI untuk pengenalan suara, pustaka <code>translate</code> untuk penerjemahan teks, dan ElevenLabs untuk konversi teks-ke-suara.</p>
<h3 id="heading-mempersiapkan-environment">Mempersiapkan Environment</h3>
<p>Sebelum memulai, pastikan kita sudah memiliki API key dan pustaka yang diperlukan Buat file <code>.env</code> di folder yang sama dengan projek kemudian simpan API key di file tersebut. Jangan lupa sertakan <code>.env</code> ke <code>.gitignore</code> jika ingin push kode kita ke github. Untuk mendapatkannya, kita terlebih dahulu <a target="_blank" href="https://elevenlabs.io/docs/api-reference/getting-started">ElevenLabs</a> dan <a target="_blank" href="https://www.assemblyai.com/">Assembly AI</a>.</p>
<pre><code class="lang-plaintext">ELEVENLABS_API_KEY=your_elevenlabs_api_key
ASSEMBLYAI_API_KEY=your_assemblyai_api_key
</code></pre>
<p>Selanjutnya kita juga perlu menginstall library yang diperlukan:</p>
<pre><code class="lang-bash">pip install gradio assemblyai translate elevenlabs python-dotenv
</code></pre>
<h3 id="heading-mengimpor-pustaka-dan-memuat-konfigurasi">Mengimpor Pustaka dan Memuat Konfigurasi</h3>
<p>Pertama, kita mengimpor pustaka yang diperlukan dan memuat kunci API dari file <code>.env</code>.</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> uuid
<span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr
<span class="hljs-keyword">import</span> assemblyai <span class="hljs-keyword">as</span> aai
<span class="hljs-keyword">from</span> pathlib <span class="hljs-keyword">import</span> Path
<span class="hljs-keyword">from</span> dotenv <span class="hljs-keyword">import</span> dotenv_values
<span class="hljs-keyword">from</span> translate <span class="hljs-keyword">import</span> Translator
<span class="hljs-keyword">from</span> elevenlabs <span class="hljs-keyword">import</span> VoiceSettings
<span class="hljs-keyword">from</span> elevenlabs.client <span class="hljs-keyword">import</span> ElevenLabs
</code></pre>
<p>Interface web menggunakan <code>gradio</code>. Transkripsi audio ke teks menggunakan <code>assemblyai</code>. Translasi teks antar bahasa <code>translate</code>. Konversi teks ke suara menggunakan <code>elevenlabs</code>. Untuk membuat nama file yang unik menggunakan <code>uuid</code>. Penanganan jalur file menggunakan <code>Path</code>. Terakhir <code>dotenv_values</code> digunakan untuk memuat file <code>.env</code>.</p>
<p>Setelah mengimpor semua library yang diperlukan, selanjutnya kita memuat API key dari file <code>.env</code> yang sudah dibuat sebelumnya</p>
<pre><code class="lang-python">config = dotenv_values(<span class="hljs-string">".env"</span>)

ELEVENLABS_API_KEY = config[<span class="hljs-string">"ELEVENLABS_API_KEY"</span>]
ASSEMBLYAI_API_KEY = config[<span class="hljs-string">"ASSEMBLYAI_API_KEY"</span>]
</code></pre>
<h3 id="heading-transkripsi-audio">Transkripsi Audio</h3>
<p>Kita menggunakan AssemblyAI untuk mentranskripsikan file audio.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">audio_transcription</span>(<span class="hljs-params">audio_file</span>):</span>
    aai.settings.api_key = ASSEMBLYAI_API_KEY

    transcriber = aai.Transcriber()
    transcription = transcriber.transcribe(audio_file)

    <span class="hljs-keyword">return</span> transcription
</code></pre>
<p>Pertama-tama kita masukkan API key untuk AssemblyAI di <code>aai.settings.api_key</code>. Lalu inisialisasi transcriber dengan <code>aai.Transcriber</code> kemudian mentranskripsikan file audio yang diberikan dengan <code>transcribe</code>.</p>
<h3 id="heading-translasi-teks">Translasi Teks</h3>
<p>Di fungsi ini kita menerjemahkan teks yang dimasukkan ke bahasa Spanyol, Arab, dan Jepang.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">text_translation</span>(<span class="hljs-params">text</span>):</span>
    translator_es = Translator(from_lang=<span class="hljs-string">"en"</span>, to_lang=<span class="hljs-string">"es"</span>)
    es_text = translator_es.translate(text)

    translator_ar = Translator(from_lang=<span class="hljs-string">"en"</span>, to_lang=<span class="hljs-string">"ar"</span>)
    ar_text = translator_ar.translate(text)

    translator_ja = Translator(from_lang=<span class="hljs-string">"en"</span>, to_lang=<span class="hljs-string">"ja"</span>)
    ja_text = translator_ja.translate(text)

    <span class="hljs-keyword">return</span> es_text, ar_text, ja_text
</code></pre>
<p>Pertama kita inisiasi penerjemah untuk setiap bahasa target menggunakan <code>Translator</code>. Selanjutnya adalah menggunakan method<code>translate</code> untuk menerjemahkanteks dari bahasa Inggris ke bahasa target.</p>
<h3 id="heading-teks-ke-suara">Teks ke suara</h3>
<p>Terakhir kita menggunakan ElevenLabs, untuk mengonversi teks yang diterjemahkan menjadi suara.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">text_to_speech</span>(<span class="hljs-params">text: str</span>) -&gt; str:</span>
    client = ElevenLabs(api_key=ELEVENLABS_API_KEY)
    response = client.text_to_speech.convert(
        voice_id=<span class="hljs-string">"pNInz6obpgDQGcFmaJgB"</span>,
        optimize_streaming_latency=<span class="hljs-string">"0"</span>,
        output_format=<span class="hljs-string">"mp3_22050_32"</span>,
        text=text,
        model_id=<span class="hljs-string">"eleven_multilingual_v2"</span>,
        voice_settings=VoiceSettings(
            stability=<span class="hljs-number">0.5</span>,
            similarity_boost=<span class="hljs-number">0.8</span>,
            style=<span class="hljs-number">0.5</span>,
            use_speaker_boost=<span class="hljs-literal">True</span>,
        ),
    )

    save_file_path = <span class="hljs-string">f"<span class="hljs-subst">{uuid.uuid4()}</span>.mp3"</span>

    <span class="hljs-keyword">with</span> open(save_file_path, <span class="hljs-string">"wb"</span>) <span class="hljs-keyword">as</span> f:
        <span class="hljs-keyword">for</span> chunk <span class="hljs-keyword">in</span> response:
            <span class="hljs-keyword">if</span> chunk:
                f.write(chunk)

    print(<span class="hljs-string">f"<span class="hljs-subst">{save_file_path}</span>: A new audio file was saved successfully!"</span>)

    <span class="hljs-keyword">return</span> save_file_path
</code></pre>
<p>Pertama-tama kita inisialisasi variabel <code>client</code> dengan memanggil kelas <code>ElevenLabs</code>. Selanjutnya menggunakan method <code>text_to_speech.convert</code> kita konversikan teks menjadi ucapan dengan parameter yang telah ditentukan.</p>
<h3 id="heading-fungsi-voicetovoice">Fungsi <code>voice_to_voice</code></h3>
<p>Fungsi ini merupakan inti dari project kita. Fungsi ini akan mentranskripsikan audio input, menerjemahkannya ke sejumlah bahasa, dan mengubah terjemahan kembali menjadi audio.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">voice_to_voice</span>(<span class="hljs-params">audio_file</span>):</span>
    transcription_response = audio_transcription(audio_file)

    <span class="hljs-keyword">if</span> transcription_response.status == aai.TranscriptStatus.error:
        <span class="hljs-keyword">raise</span> gr.Error(transcription_response.error)
    <span class="hljs-keyword">else</span>:
        text = transcription_response.text

    es_translation, ar_translation, ja_translation = text_translation(text)

    es_audio_path = text_to_speech(es_translation)
    ar_audio_path = text_to_speech(ar_translation)
    ja_audio_path = text_to_speech(ja_translation)

    es_path = Path(es_audio_path)
    ar_path = Path(ar_audio_path)
    ja_path = Path(ja_audio_path)

    <span class="hljs-keyword">return</span> es_path, ar_path, ja_path
</code></pre>
<p>Fungsi <code>voice_to_voice</code> menerima file audio sebagai parameter dan di dalamnya terjadi seluruh proses transkripsi, penerjemahan, dan konversi teks-ke-suara. Variabel <code>transcription_response</code> digunakan untuk menampung respons dari fungsi transkripsi. Transkripsi audio yang didapatkan kemudian diterjemahkan juga dalam bentuk teks ke bahasa Spanyol, Arab, dan Jepang. Setelah teks dalam bahasa tujuan didapatkan baru kemudian hasil terjemahan dikonversi kembali ke dalam bentuk suara.</p>
<h3 id="heading-membuat-interface-pengguna">Membuat Interface Pengguna</h3>
<p>Untuk projek ini, kita menggunakan gradio untuk membuat interface sederhana yang mudah digunakan. Di sini pengguna dapat memasukkan audio melalui mikrofon mereka, dan mendapatkan output berupa audio yang diterjemahkan.</p>
<pre><code class="lang-python">audio_input = gr.Audio(
    sources=[<span class="hljs-string">"microphone"</span>],
    type=<span class="hljs-string">"filepath"</span>
)

demo = gr.Interface(
    fn=voice_to_voice,
    inputs=audio_input,
    outputs=[gr.Audio(label=<span class="hljs-string">"Spanish"</span>), gr.Audio(label=<span class="hljs-string">"Arabic"</span>), gr.Audio(label=<span class="hljs-string">"Japanese"</span>)],
    title=<span class="hljs-string">"Voice-to-Voice Translator"</span>,
    description=<span class="hljs-string">"Voice-to-Voice"</span>,
)

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    demo.launch()
</code></pre>
<p>Pertama kita definisikan sumber input audio dengan <a target="_blank" href="http://gr.Audio"><code>gr.Audio</code></a>. Kemudian dengan <code>gr.Interface</code>, kita buat antarmuka Gradio dengan input dan output yang ditentukan.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721630249822/670856f8-2fec-4ab8-821e-4039d4b68ce7.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-kesimpulan">Kesimpulan</h3>
<p>Pada artikel ini, kita sudah belajar cara membuat aplikasi sederhana penerjemah voice to voice menggunakan Python dan API dari ElevenLabs dan AssemblyAI. Dengan menggabungkan teknologi transkripsi, penerjemahan, dan teks-ke-ucapan, kita dapat menciptakan aplikasi yang menjembatani hambatan bahasa dan meningkatkan komunikasi secara global.</p>
<p>Masih banyak yang bisa kita kembangkan dari projek ini. Seperti penambahan bahasa dan antarmuka pengguna yang lebih intuitif. Terima kasih sudah membaca artikel ini. Semoga sukses dan selamat belajar.</p>
<hr />
<p>Referensi : <a target="_blank" href="https://www.youtube.com/watch?v=ZduW0N31JuE">Assembly AI Youtube</a></p>
<p>Source code: <a target="_blank" href="https://github.com/emhaihsan/blog-post-code/tree/main/voicetovoice">Github</a></p>
]]></content:encoded></item><item><title><![CDATA[Prediksi Penyakit Jantung menggunakan Random Forest]]></title><description><![CDATA[Setelah mempelajari Decision Tree, sekarang kita mulai belajar algoritma yang merupakan pengembangan dari metode Decision Tree. Kata 'forest' di sini juga…]]></description><link>https://emhaihsan.hashnode.dev/prediksi-penyakit-jantung-menggunakan-random-forest</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/prediksi-penyakit-jantung-menggunakan-random-forest</guid><category><![CDATA[Machine Learning]]></category><category><![CDATA[Random Forest]]></category><category><![CDATA[Python]]></category><category><![CDATA[classification]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Thu, 18 Jul 2024 06:55:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/dJVU4jXV1Q8/upload/62f3b3179735b84b2807923632c63856.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Setelah mempelajari Decision Tree, sekarang kita mulai belajar algoritma yang merupakan pengembangan dari metode Decision Tree. Kata 'forest' di sini juga secara harfiah menggambarkan sekilas tentang apa yang terjadi di balik layar. Hal ini karena Random Forest menggunakan metode ensemble learning, yang artinya ia menggabungkan prediksi dari beberapa model untuk meningkatkan akurasi dan mengurangi overfitting.</p>
<h3 id="heading-pengenalan-random-forest">Pengenalan Random Forest</h3>
<p>Lantas bagaimana cara kerja dari random forest? Misalnya kita memiliki data kesehatan seperti usia, tekanan darah, kadar kolesterol, dan lain-lain. Kemudian kita ingin memprediksi apakah orang tersebut akan mengalami penyakit jantung berdasarkan data yang diberikan. Salah satu cara yang bisa diterapkan adalah menggunakan decision tree. Namun, kendalanya pada pohon keputusan adalah ia rentan terhadap overfitting, yang mana berpotensi tidak bekerja dengan baik pada data baru.</p>
<p>Lalu kita melakukan langkah alternatif tentang dengan membuat keputusan berdasarkan pendapat sekelompok orang, bukan hanya satu orang. Misalnya, jika pada kasus penyakit jantung tadi kita bertanya kepada 10 dokter tentang prediksinya, kita mungkin mendapatkan jawaban yang lebih akurat dan meyakinkan dengan mengambil mayoritas jawaban mereka, daripada hanya bertanya kepada satu dokter. Kira-kira seperti ini lah perumpamaan dari metode random forest</p>
<h3 id="heading-cara-kerja-random-forest">Cara Kerja Random Forest</h3>
<p>Dari subset acak pada data latih, Random Forest bekerja dengan membangun banyak decision tree. Setiap pohon dilatih pada subset data yang berbeda, yang diambil menggunakan teknik yang disebut bootstrap sampling, di mana sampel dipilih secara acak (satu sampel dapat dipilih lebih dari sekali). Selain itu, pada setiap node dalam pohon, hanya subset acak dari semua fitur yang dipertimbangkan untuk dipecah, bukan semua fitur. Hal ini membantu mengurangi korelasi antar pohon. Setelah semua pohon dibuat, Random Forest menggabungkan prediksi dari semua pohon untuk membuat keputusan akhir. Untuk klasifikasi, ini biasanya dilakukan dengan voting mayoritas (prediksi kelas yang paling sering muncul). Untuk regresi, rata-rata dari semua prediksi pohon digunakan.</p>
<p>Random Forest memiliki beberapa keunggulan. Pertama, algoritma ini cenderung memberikan hasil yang lebih akurat dibandingkan dengan satu decision tree saja karena sifatnya yang menggabungkan prediksi dari banyak pohon. Kedua, Random Forest mengurangi risiko overfitting dengan menggabungkan banyak pohon yang dilatih pada subset data yang berbeda. Ketiga, algoritma ini dapat menangani missing value dengan lebih baik. Keempat, Random Forest memungkinkan kita untuk melihat fitur mana yang paling berpengaruh dalam prediksi.</p>
<h3 id="heading-kelemahan-random-forest">Kelemahan Random Forest</h3>
<p>Meskipun memiliki banyak keunggulan, Random Forest juga memiliki beberapa kelemahan. Membangun banyak pohon dan menggabungkan prediksi mereka bisa membutuhkan banyak waktu dan sumber daya komputasi. Selain itu, meskipun kita dapat melihat fitur-fitur yang penting dalam prediksi, secara keseluruhan model Random Forest kurang interpretatif jika dibandingkan dengan decision tree.</p>
<h2 id="heading-implementasi-prediksi-heart-failure">Implementasi : Prediksi Heart Failure</h2>
<p>Setelah kita mempelajari sekilas tentang konsep random forest. Sekarang kita akan mencoba menerapkannya untuk melakukan klasifikasi kematian pasien menggunakan dataset "<a target="_blank" href="https://www.kaggle.com/datasets/andrewmvd/heart-failure-clinical-data">Heart Failure Clinical Records</a>". Pertama-tama, kita mengimpor pustaka-pustaka penting seperti pandas, numpy, matplotlib, seaborn, serta modul-modul dari scikit-learn yang digunakan untuk preprocessing dan evaluasi model.</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt
<span class="hljs-keyword">import</span> seaborn <span class="hljs-keyword">as</span> sns
<span class="hljs-keyword">from</span> sklearn.model_selection <span class="hljs-keyword">import</span> train_test_split
<span class="hljs-keyword">from</span> sklearn.preprocessing <span class="hljs-keyword">import</span> StandardScaler
<span class="hljs-keyword">from</span> sklearn.ensemble <span class="hljs-keyword">import</span> RandomForestClassifier
<span class="hljs-keyword">from</span> sklearn.metrics <span class="hljs-keyword">import</span> classification_report, confusion_matrix, accuracy_score
</code></pre>
<p>Kemudian kita memuat dataset menggunakan pandas lalu menampilkan 5 baris teratas dari data.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Load the dataset</span>
url = <span class="hljs-string">"/kaggle/input/heart-failure-clinical-data/heart_failure_clinical_records_dataset.csv"</span>
data = pd.read_csv(url)

<span class="hljs-comment"># Display the first few rows of the dataset</span>
data.head()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721281109392/e1354a0a-66c3-4c1b-8e0f-ac473a0ba5d9.png" alt class="image--center mx-auto" /></p>
<p>Selanjutnya adalah mengecek informasi dasar tentang dataset menggunakan <code>data.info()</code>. Di sini kita bisa mengetahui jumlah entri, kolom, tipe data, dan jumlah nilai non-null.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Check the basic info of the dataset</span>
data.info()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721281119252/aef803aa-17be-4367-ac66-876d9bc901e6.png" alt class="image--center mx-auto" /></p>
<p>Setelah itu kita juga menampilkan ringkasan statistik dasar dari dataset menggunakan <code>data.describe()</code>.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Statistical summary of the dataset</span>
data.describe()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721281137620/3c6c8b02-8dc6-4b17-a9e5-3150eda09c3e.png" alt class="image--center mx-auto" /></p>
<p>Untuk keperluan visualisasi, di sini kita akan melihat distribusi variabel target / 'DEATH_EVENT'.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Plotting the distribution of target variable</span>
sns.countplot(x=<span class="hljs-string">'DEATH_EVENT'</span>, data=data)
plt.title(<span class="hljs-string">'Distribution of Target Variable'</span>)
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721281259761/a3121a74-2504-439c-9aca-c64098db54a2.png" alt class="image--center mx-auto" /></p>
<p>Dari hasil di atas terlihat bahwa data dengan label 0 lebih banyak daripada label 1. Selanjutnya kita akan membuat heatmap untuk melihat korelasi antar matrix.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Correlation matrix</span>
plt.figure(figsize=(<span class="hljs-number">12</span>, <span class="hljs-number">8</span>))
sns.heatmap(data.corr(), annot=<span class="hljs-literal">True</span>, cmap=<span class="hljs-string">'coolwarm'</span>)
plt.title(<span class="hljs-string">'Correlation Matrix'</span>)
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721281269491/0c3d19a4-334b-4c73-b27b-afc4ba543c82.png" alt class="image--center mx-auto" /></p>
<p>Selesai dengan visualisasi. Selanjutnya kita mempersiapkan data untuk training. Di sini kita memisahkan data menjadi fitur (X) dan target (y), dimana kolom 'DEATH_EVENT' dipisahkan dari dataset dan sisanya dijadikan fitur.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Splitting the data into features and target</span>
X = data.drop(<span class="hljs-string">'DEATH_EVENT'</span>, axis=<span class="hljs-number">1</span>)
y = data[<span class="hljs-string">'DEATH_EVENT'</span>]
</code></pre>
<p>Dataset kemudian dibagi menjadi set pelatihan dan pengujian dengan perbandingan 80:20 menggunakan <code>train_test_split</code>, memastikan hasil yang dapat direproduksi dengan <code>random_state=42</code>.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Splitting the data into training and testing sets</span>
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=<span class="hljs-number">0.2</span>, random_state=<span class="hljs-number">42</span>)
</code></pre>
<p>Fitur-fitur kemudian dinormalisasi menggunakan <code>StandardScaler</code> untuk mengurangi bias yang mungkin terjadi jika tidak dinormalisasi.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Standardizing the features</span>
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
</code></pre>
<p>Setelah data seiap, kita inisialisasi model Random Forest dan melatihnya pada set pelatihan.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Initialize the Random Forest Classifier</span>
rf_classifier = RandomForestClassifier(n_estimators=<span class="hljs-number">100</span>, random_state=<span class="hljs-number">42</span>)

<span class="hljs-comment"># Train the model</span>
rf_classifier.fit(X_train, y_train)
</code></pre>
<p>Setelah pelatihan, model digunakan untuk memprediksi hasil pada set pengujian.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Make predictions</span>
y_pred = rf_classifier.predict(X_test)
</code></pre>
<p>Evaluasi model dilakukan menggunakan metrik seperti accuracy score, classification report, dan confusion matrix.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Evaluate the model</span>
print(<span class="hljs-string">"Accuracy Score:"</span>, accuracy_score(y_test, y_pred))
print(<span class="hljs-string">"\nClassification Report:\n"</span>, classification_report(y_test, y_pred))

<span class="hljs-comment"># Confusion Matrix</span>
conf_matrix = confusion_matrix(y_test, y_pred)
sns.heatmap(conf_matrix, annot=<span class="hljs-literal">True</span>, fmt=<span class="hljs-string">'d'</span>, cmap=<span class="hljs-string">'Blues'</span>)
plt.title(<span class="hljs-string">'Confusion Matrix'</span>)
plt.xlabel(<span class="hljs-string">'Predicted'</span>)
plt.ylabel(<span class="hljs-string">'Actual'</span>)
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721281067444/ace943c1-ed08-4436-9bc9-d1e42a9efb5b.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721281077284/dc5fd20c-88cb-4106-ab26-f1abd4dfced1.png" alt class="image--center mx-auto" /></p>
<p>Hasil evaluasi menunjukkan akurasi model serta metrik precision, recall, dan f1-score untuk masing-masing kelas target. Matriks kebingungan digambarkan menggunakan heatmap untuk visualisasi yang lebih baik. Terakhir, kita bisa melihat nilai fitur-fitur penting yang digunakan dalam prediksi menggunakan atribut <code>feature_importances_</code> yang ada di model Random Forest.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Feature importance</span>
importances = rf_classifier.feature_importances_
indices = np.argsort(importances)[::<span class="hljs-number">-1</span>]
features = X.columns

<span class="hljs-comment"># Plotting feature importances</span>
plt.figure(figsize=(<span class="hljs-number">12</span>, <span class="hljs-number">8</span>))
plt.title(<span class="hljs-string">'Feature Importances'</span>)
plt.bar(range(X.shape[<span class="hljs-number">1</span>]), importances[indices], align=<span class="hljs-string">'center'</span>)
plt.xticks(range(X.shape[<span class="hljs-number">1</span>]), features[indices], rotation=<span class="hljs-number">90</span>)
plt.tight_layout()
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721281000875/f609406f-169e-49d5-bb7a-95eed26b0ff3.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-kesimpulan">Kesimpulan</h2>
<p>Dalam artikel ini, kita telah mempelajari tentang algoritma Random Forest, sebuah metode pembelajaran mesin yang menggabungkan prediksi dari banyak decision tree yang dilatih pada subset acak dari data pelatihan, yang mana hal tersebut akan membantu meningkatkan akurasi dan mengurangi risiko overfitting.</p>
<p>Kita juga mencoba menerapkannya pada dataset "Heart Failure Clinical Records" untuk melakukan klasifikasi kematian pasien. Hasil evaluasi menunjukkan bahwa Random Forest dapat memberikan hasil akurasi 75%. Dan di akhir, kita juga mengidentifikasi fitur-fitur yang paling berpengaruh dalam prediksi. Terima kasih sudah membaca artikel ini, tetap semangat, terus berlatih dan selamat belajar!.</p>
<hr />
<p>Kode Sumber : <a target="_blank" href="https://www.kaggle.com/code/emhaihsan/random-forest-heart-disease/">Kaggle</a></p>
]]></content:encoded></item><item><title><![CDATA[Prediksi Penyakit Jantung dengan Decision Tree Classifier]]></title><description><![CDATA[Pada artikel sebelumnya, kita sudah belajar tentang decision tree untuk kasus regresi. Pada artikel ini, kita akan lanjut mempelajari Decision Tree…]]></description><link>https://emhaihsan.hashnode.dev/prediksi-penyakit-jantung-dengan-decision-tree-classifier</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/prediksi-penyakit-jantung-dengan-decision-tree-classifier</guid><category><![CDATA[Machine Learning]]></category><category><![CDATA[decisiontree]]></category><category><![CDATA[classification]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Thu, 18 Jul 2024 03:45:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/MhFJNz_D8t4/upload/11fa8620aa5c4a12daab1d8a905d54ab.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Pada artikel sebelumnya, kita sudah belajar tentang decision tree untuk kasus regresi. Pada artikel ini, kita akan lanjut mempelajari Decision Tree Classifier, yang mana penggunaannya adalah untuk mengelompokkan data ke dalam kategori-kategori berbeda. Decision Tree di sini bekerja secara rekursif dengan cara memisahkan data berdasarkan fitur yang paling signifikan, hingga nantinya mencapai keputusan yang akhir.</p>
<h3 id="heading-decision-tree-proses"><strong>Decision Tree Proses</strong></h3>
<p>Sama seperti untuk regresi, sebuah Decision Tree terdiri dari tiga jenis node:</p>
<ol>
<li><p><strong>Root Node</strong>: Node pertama yang memulai pembagian.</p>
</li>
<li><p><strong>Internal Node</strong>: Node di dalam pohon yang memisahkan data berdasarkan fitur tertentu.</p>
</li>
<li><p><strong>Leaf Node</strong>: Node terakhir yang memberikan prediksi kelas.</p>
</li>
</ol>
<p>Pada proses membuat Decision Tree untuk klasifikasi, terdapat sejumlah langkah penting:</p>
<ol>
<li><p><strong>Pemilihan Fitur</strong>: Memilih fitur yang paling signifikan untuk memisahkan data pada setiap langkah.</p>
</li>
<li><p><strong>Kriteria Pembagian</strong>: Menentukan bagaimana memisahkan data di setiap simpul.</p>
</li>
<li><p><strong>Pembentukan Simpul</strong>: Mengulangi proses pemisahan hingga kriteria penghentian terpenuhi (misalnya, kedalaman maksimum pohon atau jumlah minimum sampel dalam simpul).</p>
</li>
</ol>
<p>Salah satu aspek paling penting dari Decision Tree Classifier adalah memilih cara terbaik untuk memisahkan data di setiap simpul. Untuk klasifikasi, biasanya digunakan kriteria seperti Gini Impurity atau Entropy (Information Gain).</p>
<p>Rumus Gini Impurity:</p>
<p>\(\text{Gini} = 1 - \sum_{i=1}^{C} p_i^2\)</p>
<p>Rumus Entropy:</p>
<p>\(\text{Entropy} = - \sum_{i=1}^{C} p_i \log(p_i)\)</p>
<p>dimana:</p>
<ul>
<li><p>\(C\) adalah jumlah kelas.</p>
</li>
<li><p>\(p_i\)adalah proporsi sampel yang termasuk dalam kelas \(i\).</p>
</li>
</ul>
<p>Algoritma akan mencari pembagian yang meminimalkan Gini Impurity atau Entropy pada setiap simpul.</p>
<p>Selanjutnya proses pemilihan fitur melibatkan perhitungan Gini Impurity atau Entropy untuk setiap fitur dan titik pembagian yang mungkin. Misalnya, jika kita memiliki fitur X dengan nilai-nilai \([1, 2, 3, 4, 5]\) dan kelas Y dengan nilai-nilai \([0, 1, 0, 1, 0]\), kita dapat mencoba berbagai titik pembagian seperti \(X &lt; 2.5\), \(X &lt; 3.5\), dll., dan menghitung Gini Impurity atau Entropy untuk setiap pembagian. Pembagian dengan nilai terendah akan dipilih.</p>
<p>Kelebihan dari decision tree adalah mudah diinterpretasikan dan divisualisasikan. Decision tree juga dapat menangani hubungan non-linear antara fitur dan kelas. Selain itu, Algoritma juga akan secara otomatis memilih fitur yang paling signifikan.</p>
<p><strong>Kekurangan</strong>:</p>
<ul>
<li><p><strong>Overfitting</strong>: Pohon keputusan cenderung overfitting pada data training, terutama jika tidak diatur kedalamannya.</p>
</li>
<li><p><strong>Stabilitas</strong>: Pohon keputusan sensitif terhadap perubahan kecil dalam data; perubahan kecil dapat menghasilkan struktur pohon yang sangat berbeda.</p>
</li>
</ul>
<h2 id="heading-studi-kasus-prediksi-penyakit-jantung"><strong>Studi Kasus: Prediksi Penyakit Jantung</strong></h2>
<p>Untuk contoh penggunaan decision tree classifier, kita akan menggunakan dataset Heart Disease dari Kaggle.</p>
<h3 id="heading-import-libraries">Import Libraries</h3>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt
<span class="hljs-keyword">import</span> seaborn <span class="hljs-keyword">as</span> sns
<span class="hljs-keyword">from</span> sklearn.model_selection <span class="hljs-keyword">import</span> train_test_split
<span class="hljs-keyword">from</span> sklearn.tree <span class="hljs-keyword">import</span> DecisionTreeClassifier
<span class="hljs-keyword">from</span> sklearn.metrics <span class="hljs-keyword">import</span> confusion_matrix, classification_report, accuracy_score
</code></pre>
<ul>
<li><p><strong>pandas</strong> dan <strong>numpy</strong> digunakan untuk manipulasi data.</p>
</li>
<li><p><strong>matplotlib</strong> dan <strong>seaborn</strong> digunakan untuk visualisasi.</p>
</li>
<li><p><strong>train_test_split</strong> digunakan untuk membagi data menjadi set pelatihan dan pengujian.</p>
</li>
<li><p><strong>DecisionTreeClassifier</strong> digunakan untuk membuat model klasifikasi pohon keputusan.</p>
</li>
<li><p><strong>confusion_matrix</strong>, <strong>classification_report</strong>, dan <strong>accuracy_score</strong> digunakan untuk evaluasi performa model.</p>
</li>
</ul>
<h3 id="heading-load-dataset">Load Dataset</h3>
<pre><code class="lang-python">df = pd.read_csv(<span class="hljs-string">'/kaggle/input/heart-failure-clinical-data/heart_failure_clinical_records_dataset.csv'</span>)
</code></pre>
<p>Membaca data dari file CSV yang berisi informasi tentang pasien dengan penyakit jantung dan fitur-fitur yang terkait.</p>
<pre><code class="lang-python">df.head()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721266913108/32613568-4f1c-4ba8-9f57-c9276aefee60.png" alt class="image--center mx-auto" /></p>
<p>Di sini kita melihat lima data teratas dari dataset. Dengan melakukan visualisasi seperti ini kita bisa mendapatkan gambaran tentang bagaimana kondisi data-data dan kolom-kolom fitur yang tersedia.</p>
<h3 id="heading-descriptive-statistics">Descriptive Statistics</h3>
<pre><code class="lang-python">df.describe()
</code></pre>
<p>Setelah melihat ini contoh data-data teratas kita kemudian bisa menampilkan statistik deskriptif seperti mean, std, min, max untuk setiap kolom dalam dataset.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721266929095/c63c069b-e3b3-4a23-824c-4c386f77eb15.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-informasi-data">Informasi Data</h3>
<pre><code class="lang-python">df.info()
</code></pre>
<p>Memberikan informasi tentang tipe data dan jumlah nilai null untuk setiap kolom. Mengetahui tipe data dan jumlah null perlu diperlakukan agar bisa menjadi pertimbangan ketika melakukan preprocessing nanti.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721266945084/0b62c581-f00b-4300-8c3b-362bd6927ec6.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-visualisasi-distribusi-target">Visualisasi Distribusi Target</h3>
<pre><code class="lang-python">plt.figure(figsize=(<span class="hljs-number">10</span>, <span class="hljs-number">6</span>))
sns.countplot(x=<span class="hljs-string">'DEATH_EVENT'</span>, data=df)
plt.title(<span class="hljs-string">'Target Variable Distribution'</span>)
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721266958348/04128941-7471-4eeb-bc61-72a6a957a3fe.png" alt class="image--center mx-auto" /></p>
<p>Dari visualisasi yang kita lakukan didapatkan bahwa target dengan label 0 memiliki jumlah data yang lebih banyak dari label 1. Sehingga bisa dikatakan bahwa data kita saat ini imbalanced.</p>
<h3 id="heading-visualisasi-korelasi-fitur">Visualisasi Korelasi Fitur</h3>
<pre><code class="lang-python">plt.figure(figsize=(<span class="hljs-number">12</span>, <span class="hljs-number">8</span>))
sns.heatmap(df.corr(), annot=<span class="hljs-literal">True</span>, fmt=<span class="hljs-string">'.2f'</span>, cmap=<span class="hljs-string">'coolwarm'</span>)
plt.title(<span class="hljs-string">'Correlation Heatmap'</span>)
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721266968227/aa02b524-f9b1-404d-a02d-2cc36571a8d8.png" alt class="image--center mx-auto" /></p>
<p>Heatmap di atas menunjukkan data-data yang memiliki korelasi dengan kolom <code>DEATH_EVENT</code> sebagai target. Nilai positif menunjukkan korelasi positif antar data, sebagai contoh semakin tinggi nilai pada kolom <code>time</code> maka cenderung juga kemungkinan <code>DEATH_EVENT</code> semakin tinggi. Sebaliknya pada data-data yang memiliki korelasi negatif.</p>
<h3 id="heading-preprocessing-data">Preprocessing Data</h3>
<h4 id="heading-normalisasi-fitur-numerik">Normalisasi Fitur Numerik</h4>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> sklearn.preprocessing <span class="hljs-keyword">import</span> StandardScaler

<span class="hljs-comment"># Normalize numerical features</span>
scaler = StandardScaler()
numerical_features = [<span class="hljs-string">'age'</span>, <span class="hljs-string">'creatinine_phosphokinase'</span>, <span class="hljs-string">'ejection_fraction'</span>, <span class="hljs-string">'platelets'</span>, <span class="hljs-string">'serum_creatinine'</span>, <span class="hljs-string">'serum_sodium'</span>, <span class="hljs-string">'time'</span>]
df[numerical_features] = scaler.fit_transform(df[numerical_features])
</code></pre>
<p>Di sini kita akan menggunakan Standard Scaler sebagai teknik prapemrosesan data. Teknik ini digunakan untuk menstandarisasi fitur-fitur numerik dalam dataset sehingga memiliki rata-rata (mean) nol dan standar deviasi satu. Proses ini membantu algoritma agar bisa bekerja dengan lebih efisien dengan mempercepat konvergensi dan mengurangi bias dalam fitur yang memiliki skala berbeda.</p>
<h3 id="heading-pemilihan-fitur-dan-target">Pemilihan Fitur dan Target</h3>
<pre><code class="lang-python">X = df.drop(columns=[<span class="hljs-string">'DEATH_EVENT'</span>])
y = df[<span class="hljs-string">'DEATH_EVENT'</span>]
</code></pre>
<p>Setelah dilakukan standarisasi, kita bisa kemudian menentukan kolom-kolom yang menjadi variabel fitur dan target. Di sini kita menggunakan <code>DEATH_EVENT</code> sebagai target dan kolom selainnya sebagai fitur.</p>
<h3 id="heading-pemisahan-data">Pemisahan Data</h3>
<pre><code class="lang-python">X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=<span class="hljs-number">0.2</span>, random_state=<span class="hljs-number">42</span>)
</code></pre>
<p>Kemudian kita membagi data menjadi data train dan data text. Kita menggunakan ukuran split di sini 80% untuk training dan 20% untuk testing.</p>
<h3 id="heading-hyperparameter-tuning">Hyperparameter Tuning</h3>
<p>Menggunakan <code>GridSearchCV</code> untuk menemukan kombinasi hyperparameter terbaik.</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> sklearn.model_selection <span class="hljs-keyword">import</span> GridSearchCV

<span class="hljs-comment"># Initialize Decision Tree model</span>
model = DecisionTreeClassifier(random_state=<span class="hljs-number">42</span>)

<span class="hljs-comment"># Define parameter grid</span>
param_grid = {
    <span class="hljs-string">'criterion'</span>: [<span class="hljs-string">'gini'</span>, <span class="hljs-string">'entropy'</span>],
    <span class="hljs-string">'max_depth'</span>: [<span class="hljs-literal">None</span>, <span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>],
    <span class="hljs-string">'min_samples_split'</span>: [<span class="hljs-number">2</span>, <span class="hljs-number">10</span>, <span class="hljs-number">20</span>],
    <span class="hljs-string">'min_samples_leaf'</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">5</span>, <span class="hljs-number">10</span>]
}

<span class="hljs-comment"># Initialize GridSearchCV</span>
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=<span class="hljs-number">5</span>, n_jobs=<span class="hljs-number">-1</span>, scoring=<span class="hljs-string">'accuracy'</span>)
grid_search.fit(X_train, y_train)

<span class="hljs-comment"># Best parameters and model</span>
best_params = grid_search.best_params_
best_model = grid_search.best_estimator_

print(<span class="hljs-string">f'Best Parameters: <span class="hljs-subst">{best_params}</span>'</span>)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721266978595/96dbc140-a721-403e-ada6-2cd957a3e72d.png" alt class="image--center mx-auto" /></p>
<p>Selain pada model, pengembangan machine learning juga sangat bergantung pada parameter-parameter yang digunakan untuk melatih model. Di sini kita melakukan grid search untuk melihat kombinasi dari setiap parameter yang ada.</p>
<h3 id="heading-train-and-evaluate-the-best-model">Train and Evaluate the Best Model</h3>
<pre><code class="lang-python"><span class="hljs-comment"># Train the best model</span>
best_model.fit(X_train, y_train)

<span class="hljs-comment"># Predictions</span>
y_pred_train = best_model.predict(X_train)
y_pred_test = best_model.predict(X_test)

<span class="hljs-comment"># Evaluation metrics</span>
conf_matrix = confusion_matrix(y_test, y_pred_test)
class_report = classification_report(y_test, y_pred_test)
accuracy = accuracy_score(y_test, y_pred_test)

print(<span class="hljs-string">f'Confusion Matrix:\n<span class="hljs-subst">{conf_matrix}</span>'</span>)
print(<span class="hljs-string">f'Classification Report:\n<span class="hljs-subst">{class_report}</span>'</span>)
print(<span class="hljs-string">f'Accuracy: <span class="hljs-subst">{accuracy}</span>'</span>)
</code></pre>
<p>Setelah kita mendapatkan model dengan parameter terbaik. Kita melakukan training pada data latih kemudian mengujinya pada data tes. Terakhir kita melakukan evaluasi dengan melihat classification report dari model.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721268525501/055dc532-f52f-4de5-b907-f48681d347d5.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-visualisasi-decision-tree">Visualisasi Decision Tree</h3>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> sklearn.tree <span class="hljs-keyword">import</span> plot_tree

plt.figure(figsize=(<span class="hljs-number">20</span>, <span class="hljs-number">10</span>))
plot_tree(best_model, filled=<span class="hljs-literal">True</span>, feature_names=X.columns, class_names=[<span class="hljs-string">'No Disease'</span>, <span class="hljs-string">'Disease'</span>], max_depth=<span class="hljs-number">2</span>, fontsize=<span class="hljs-number">10</span>)
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721267064433/7c7aec27-47eb-46f0-975d-7f47574ee966.png" alt class="image--center mx-auto" /></p>
<p>Sebagaimana telah disinggung. Kelebihan dari decision tree adalah sifatnya yang mudah diinterpretasi. Di sini kita melakukan visualisasi dengan kedalaman 2.</p>
<h3 id="heading-visualisasi-confusion-matrix">Visualisasi Confusion Matrix</h3>
<pre><code class="lang-python">plt.figure(figsize=(<span class="hljs-number">8</span>, <span class="hljs-number">6</span>))
sns.heatmap(conf_matrix, annot=<span class="hljs-literal">True</span>, fmt=<span class="hljs-string">'d'</span>, cmap=<span class="hljs-string">'Blues'</span>, xticklabels=[<span class="hljs-string">'No Disease'</span>, <span class="hljs-string">'Disease'</span>], yticklabels=[<span class="hljs-string">'No Disease'</span>, <span class="hljs-string">'Disease'</span>])
plt.xlabel(<span class="hljs-string">'Predicted'</span>)
plt.ylabel(<span class="hljs-string">'Actual'</span>)
plt.title(<span class="hljs-string">'Confusion Matrix'</span>)
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721267081657/4068b8ba-c454-4382-8675-effe77df9025.png" alt class="image--center mx-auto" /></p>
<p>Dari visualisasi di atas, kita dapat melihat hasil prediksi model yang didapatkan. Dari sini juga kita bisa menganalisa bagian-bagian mana yang diprediksi dengan baik oleh model dan bagian yang mana yang tidak. Sehingga berguna untuk analisa lebih lanjut di masa depan.</p>
<h3 id="heading-kesimpulan"><strong>Kesimpulan</strong></h3>
<p>Dalam artikel ini, kita telah membahas bagaimana Decision Tree Classifier bekerja, mulai dari pemilihan fitur, kriteria pembagian, hingga pembentukan simpul. Kita juga telah melakukan studi kasus prediksi penyakit jantung. Model Decision Tree Classifier menawarkan interpretabilitas yang tinggi, memudahkan kita untuk memahami dan menjelaskan prediksi yang dihasilkan. Namun, penting untuk diingat bahwa model ini bisa sangat sensitif terhadap perubahan kecil dalam data dan cenderung overfitting jika tidak diatur dengan benar.</p>
<p>Dengan pemahaman yang mendalam tentang bagaimana Decision Tree Classifier bekerja dan bagaimana mengimplementasikannya, kita sekarang siap untuk menerapkan algoritma ini pada berbagai masalah klasifikasi lainnya. Terima kasih sudah membaca artikel ini, Selamat Belajar!</p>
<hr />
<p>Source Code : <a target="_blank" href="https://www.kaggle.com/code/emhaihsan/decision-tree-regressor-and-classifier/">Kaggle</a></p>
]]></content:encoded></item><item><title><![CDATA[Pengenalan RAG dan Fine-Tuning pada LLM]]></title><description><![CDATA["Mengubah LLM dari Robot Kaku menjadi Bestie Kamu" Ketika kita mulai menerapkan Kecerdasan Artifisial dalam bentuk Large Language Model (LLM) pada suatu…]]></description><link>https://emhaihsan.hashnode.dev/pengenalan-rag-dan-fine-tuning-pada-llm</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/pengenalan-rag-dan-fine-tuning-pada-llm</guid><category><![CDATA[llm]]></category><category><![CDATA[RAG ]]></category><category><![CDATA[generative ai]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[Deep Learning]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Tue, 16 Jul 2024 04:53:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/LuzT78A1g7M/upload/6e8c08050e4d01a9e0d5c45f3204506b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>"Mengubah LLM dari Robot Kaku menjadi Bestie Kamu"</p>
</blockquote>
<h2 id="heading-pendahuluan">Pendahuluan</h2>
<p>Ketika kita mulai menerapkan Kecerdasan Artifisial dalam bentuk Large Language Model (LLM) pada suatu aplikasi, setidaknya kita akan menemui dua tantangan. Pertama adalah bagaimana menghubungkan LLM dengan 'data asli'. Perlu diketahui, bahwa kita perlu "membumikan" LLM atau menghubungkannya dengan data asli yang relevan dari agar dapat berfungsi dengan baik. Kedua adalah bagaimana menyediakan data yang tepat. LLM harus bisa memberikan informasi yang benar dan relevan sesuai kebutuhan bisnis.</p>
<p>RAG (Retrieval-Augmented Generation) merupakan teknik yang menggabungkan kemampuan mengambil data (retrieval) dengan kemampuan menghasilkan teks (generation) untuk memberikan jawaban yang lebih akurat dan relevan. Adapun Fine-Tuning adalah proses penyesuaian model LLM yang sudah ada dengan data spesifik yang lebih relevan untuk meningkatkan performa dan ketepatan dalam memberikan jawaban. RAG dan fine-tuning merupakan cara terbaik yang saat ini tersedia untuk menerapkan AI dalam dunia nyata. Keduanya membantu LLM memberikan hasil yang lebih akurat dan relevan dengan berbagai kondisi yang ada. Dalam artikel ini, kita akan membahas konsep-konsep ini secara keseluruhan untuk membantu memahami cara kerja dan manfaat RAG dan fine-tuning dalam penerapan AI di dunia nyata.</p>
<h2 id="heading-bagaimana-llm-bekerja">Bagaimana LLM Bekerja?</h2>
<p>Agar bisa paham konsep RAG dan fine-tuning, kita perlu memahami dulu bagaimana cara kerja dari LLM. Ketika kita berinteraksi dengan LLM melalui aplikasi seperti ChatGPT misalnya, mungkin terkadang akan terasa seperti berbicara dengan manusia. Kita beri dia pertanyaan, lalu LLM memberikan jawabannya, kemudian percakapan bisa terus berlanjut. Interaksi seperti ini mungkin akan memberi kesan bahwa LLM ini pintar dan ia mampu berpikir seperti manusia pada umumnya. Namun, terkadang jawaban dari LLM bisa saja tidak akurat atau salah, meskipun terlihat LLM sangat yakin dengan jawabannya. Dalam konteks LLM, ini biasa disebut dengan "Halusinasi".</p>
<p>Suatu LLM yang diterapkan dalam bentuk aplikasi chat sebenarnya merupakan sistem auto-complete canggih. Ketika kita membuat chat baru, di balik layar LLM sudah memiliki pesan awal yang disebut "system message". Poin inilah yang menjadi titik awal dari suatu percakapan yang akan kita lakukan dengan LLM. Sehingga ketika misalnya kita memasukkan pertanyaan seperti, "Bagaimana cara membuat nasi goreng?", LLM terlebih dahulu membaca "system message" yang sudah didefinisikan sebelumnya, lalu membaca pertanyaan kita, dan kemudian melengkapi percakapan dengan memberikan jawaban yang sesuai.</p>
<p>Sebenarnya, LLM tidak mencari informasi tentang nasi goreng dari database sebelum menjawab. Sebaliknya, LLM menggunakan multi-dimensional map yang sangat kompleks dari bahasa manusia untuk melengkapi dokumen tersebut. Karena ratusan bahkan mungkin ribuan resep nasi goreng ada di dalam data latih, dan sebagian resep nasi goreng juga hanya merupakan variasi dari bahan-bahan dasar yang sama, maka kemungkinan besar juga LLM akan menghasilkan daftar bahan yang akurat untuk resep nasi goreng secara umum.</p>
<p>Sehingga perlu disadari bahwa suatu LLM tidak bisa disebut "pintar" dalam arti sebenarnya. Kemampuan menjawab pertanyaan ini di balik layar sebenarnya merupakan perhitungan matematika yang kompleks. Jadi, meski LLM kelihatannya punya kemampuan berpikir seperti manusia, kenyataannya itu hanyalah hasil dari proses auto-complete yang sangat canggih.</p>
<h3 id="heading-pentingnya-konteks-ketika-berinteraksi-dengan-llm">Pentingnya Konteks ketika Berinteraksi dengan LLM</h3>
<p>Di antara hal penting yang perlu kita tahu saat mulai menggunakan LLM adalah kenyataan bahwa memberikan konteks kepada LLM bisa memberi pengaruh yang signifikan.</p>
<p>Disadari atau tidak, memberi konteks pembicaraan adalah hal yang sangat penting ketika kita berinteraksi dengan LLM. Dalam percakapan sehari-hari, kita selalu memberikan konteks tanpa berpikir panjang. Misalnya, saat ingin membuat nasi goreng, pertanyaan yang diajukan tidak hanya, "Apa bahan-bahan yang diperlukan untuk membuat nasi goreng?" Kita biasanya akan lebih spesifik, seperti "Apa bahan-bahan yang diperlukan untuk membuat nasi goreng khas Indonesia?"</p>
<p>Jadi, misalnya ketika kita bertanya ke ChatGPT, "Apa bahan-bahan yang diperlukan untuk membuat nasi goreng khas Indonesia?" kata "khas Indonesia" di sini lah yang menjadi konteks pentingnya. LLM kemudian akan membaca semua informasi sebelumnya, mulai dari pesan awal hingga permintaan dan konteks baru yang kita tambahkan, sehingga kemudian ia bisa memberikan jawaban yang lebih spesifik dan relevan.</p>
<p>Proses memberikan konteks yang tepat dengan harapan bisa mendapat jawaban relevan dari LLM inilah yang kemudian dikenal dengan "Prompt engineering". Makin banyak konteks yang kita berikan, makin besar pula kemungkinan LLM mampu memberikan jawaban sesuai dengan yang diinginkan. Oleh karena itu, hal ini juga yang menjadi alasan kenapa ketika kita meminta LLM untuk meringkas dari dokumen ataupun transkrip video ke dalam LLM, hasilnya akan bagus. Dengan cara memberikan konteks, LLM mampu menghasilkan respon yang bisa membuat kita merasa seakan-akan ia benar-benar telah membaca dan meringkas konten sesuai permintaan kita.</p>
<h3 id="heading-mengenal-rag-retrieval-augmented-generation">Mengenal RAG: Retrieval Augmented Generation</h3>
<p>Sebagaimana sudah disinggung sebelumnya, ketika kita menggunakan produk LLM seperti ChatGPT. Kita seringkali menganggapnya sebagai perpaduan antara search engine dan asisten virtual yang amat sangat cerdas. Padahal, LLM sebenarnya bukanlah sistem pencarian informasi. LLM merupakan representasi dari suatu sistem kompleks bernama "language transformer". LLM tidak benar-benar "tahu" sesuatu. yang cukup rumit sehingga bisa melengkapi sebagian besar kalimat dengan benar, selama pola informasi tersebut tersedia dalam data pelatihannya.</p>
<p>Masalahnya adalah, ketika informasi yang diberikan LLM sebenarnya salah namun dari jawaban yang diberikan ia terlihat memiliki tingkat keyakinan yang sangat tinggi. Ketika terjadi kondisi seperti ini, LLM malah terlihat seperti sedang berhalusinasi atau bahkan sedang berbohong.</p>
<p>Agar jawaban yang diberikan LLM lebih akurat, kita bisa menggunakan pendekatan RAG. Pendekatan ini meningkatkan akurasi dari jawaban LLM dengan cara menggabungkan pencarian informasi (retrieval) dengan kemampuan LLM untuk melengkapi dan menghasilkan teks (generation). Sehingga, alih-alih langsung menjawab, yang terlebih dahulu dilakukan LLM adalah mencari informasi dari basis data, kemudian menambahkannya sesuai konteks, dan baru kemudian memberikan jawaban. Contoh awal dari konsep ini ada pada sistem Bing AI. Di mana ketika kita berikan pertanyaan, sistem terlebih dahulu akan mencari informasi yang relevan di web, kemudian informasi tersebut digunakan sebagai referensi untuk memberikan jawaban. Tentu saja pemanfaatan dari pendekatan ini tidak hanya terbatas pada search engine namun juga berlaku untuk sistem LLM yang lainnya.</p>
<h3 id="heading-alur-kerja-rag-retrieval-augmented-generation">Alur Kerja RAG (Retrieval Augmented Generation)</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721094403000/7b522484-6c87-4676-9d35-3e4039d673ac.png" alt class="image--center mx-auto" /></p>
<p><strong>Lalu bagaimana</strong> model bahasa besar (LLM) bisa mengambil data dari sumber informasi yang ada? Mari kita lihat bagaimana alur kerja RAG secara sederhana (semoga 😅).</p>
<ol>
<li><p><strong>Permintaan Masuk:</strong></p>
<p> Ketika ada permintaan ataupun pertanyaan yang masuk, pertama-tama LLM akan memahami makna dari permintaan tersebut terlebih dahulu. Misalnya, ketika kita bertanya, "Apa saja bahan-bahan untuk membuat kue lapis?", LLM akan mengubah pertanyaan ini menjadi query (permintaan data) yang bisa dipahami oleh sistem data terkait.</p>
</li>
<li><p><strong>Mengakses Sumber Data:</strong></p>
<p> Query ini kemudian dikirim ke sumber data yang relevan, sumber data di sini bisa berupa database standar yang diakses melalui API, array embeddings, database vektor, atau bahkan buku resep dalam bentuk pdf. Sumber data ini kita sebut sebagai "grounded truth" (kebenaran yang terhubung).</p>
</li>
<li><p><strong>Mengambil Data:</strong></p>
<p> Sumber data yang terkait kemudian memproses permintaan ini dan mengembalikan data yang relevan kepada LLM.</p>
</li>
<li><p><strong>Menghasilkan Jawaban:</strong></p>
<p> LLM kemudian menggabungkan permintaan asli dengan data yang baru saja diambil dan menghasilkan jawaban. Misalnya, ketika data yang diambil oleh LLM ternyata berupa resep dari buku resep masakan Indonesia, maka LLM akan menggunakan informasi ini untuk memberikan daftar bahan-bahan yang akurat.</p>
</li>
<li><p><strong>Verifikasi Tambahan:</strong></p>
<p> Karena sifat dari LLM adalah bersifat probabilistik (menghasilkan jawaban berdasarkan kemungkinan) dan non-deterministik (hasilnya bisa berbeda pada setiap langkah), akurasi dari jawabannya mungkin tidak selalu tepat. Untuk mengurangi risiko ini, sering kali ditambahkan langkah verifikasi.</p>
<p> Jawaban yang sudah dihasilkan, bersama dengan data yang diambil, akan dikembalikan ke LLM untuk memastikan bahwa jawaban tersebut hanya mengandung informasi dari data yang diambil. Langkah ini bisa diulang sampai beberapa kali untuk meningkatkan akurasi jawaban.</p>
</li>
</ol>
<h3 id="heading-embeddings-membantu-ai-memahami-data">Embeddings: Membantu AI Memahami Data</h3>
<p><a target="_blank" href="https://www.google.com/url?sa=i&amp;url=https%3A%2F%2Fcommons.wikimedia.org%2Fwiki%2FFile%3AWord_vector_illustration.jpg&amp;psig=AOvVaw1J0U_GyPvnGDlRPOg-8W1k&amp;ust=1721182970994000&amp;source=images&amp;cd=vfe&amp;opi=89978449&amp;ved=0CBEQjRxqFwoTCMj-uK7AqocDFQAAAAAdAAAAABAE"><img src="https://upload.wikimedia.org/wikipedia/commons/3/3f/Word_vector_illustration.jpg" alt="File:Word vector illustration.jpg - Wikimedia Commons" /></a></p>
<p>Kembali lagi kepada perkara nasi goreng, misalnya kita membuat suatu ChatBot dan menggunakan buku resep masakan Indonesia sebagai sumber data. Kemudian kita berikan pertanyaan, "Apa resep untuk membuat nasi goreng?" Nasi adalah makanan pokok di Indonesia dan tentunya merupakan bahan umum yang ada di resep-resep masakan. Lantas bagaimana caranya sistem bisa tahu kalau yang kita mau adalah resep nasi goreng? bukan nasi ayam, nasi sop, nasi bakar, atau nasi kebuli?</p>
<p><strong>Untuk menemukan informasi terkait yang relevan. AI menggunakan teknik bernama</strong> Embeddings. Berikut cara kerja embedding:</p>
<ol>
<li><p><strong>Representasi Numerik:</strong></p>
<p> Embeddings mengubah teks menjadi representasi numerik dalam bentuk titik-titik dan vektor di ruang multidimensi.</p>
</li>
<li><p><strong>Proses Embeddings:</strong></p>
<p> Setiap resep dalam buku resep dimasukkan ke dalam model embeddings, yang kemudian mengubah kata-kata dalam resep tersebut menjadi peta titik-titik di ruang multidimensi. Di sini setiap kata-kata yang mirip, seperti "nasi" dan "ketan", akan ditempatkan lebih dekat satu sama lain. Sementara kata-kata yang tidak mirip, seperti "bayam" dan "wortel", akan ditempatkan lebih jauh.</p>
</li>
<li><p><strong>Membuat Vektor:</strong></p>
<p> Vektor digambar pada setiap titik-titik yang dihasilkan untuk mewakili hubungan antara kata-kata dalam teks. Representasi matematis dari titik-titik dan vektor ini menjadi embeddings untuk setiap resep.</p>
</li>
<li><p><strong>Mencocokkan Permintaan dengan Embeddings:</strong></p>
<p> Ketika kamu memberikan pertanyaan seperti, "Bagaimana cara membuat nasi goreng ayam?", sistem AI akan membuat embeddings dari pertanyaan ini menggunakan model embeddings yang sama. Sistem AI kemudian membandingkan embeddings pertanyaan dengan embeddings setiap resep untuk menemukan yang paling cocok.</p>
</li>
<li><p><strong>Menghasilkan Jawaban:</strong></p>
<p> Dengan membandingkan embeddings, sistem AI dapat menemukan resep yang paling sesuai permintaan kita. Misalnya, jika pertanyaanmu kita dengan embeddings untuk resep nasi goreng khas Indonesia, sistem AI akan memberikan teks resep nasi goreng khas Indonesia dari database.</p>
</li>
</ol>
<h2 id="heading-knowledge-graphs"><strong>Knowledge Graphs</strong></h2>
<p>Bayangkan kita sedang memasak kemudian ingin tahu bahan apa yang diperlukan. Misalnya, kita bertanya, "Saus apa yang saya perlukan untuk membuat nasi goreng?" Jika sistem AI hanya mengandalkan 'embeddings', bisa saja AI tersebut mengembalikan dua jawaban: 'Saus Kecap' dan 'Saus Barbeque'. Jelas yang benar adalah 'saus kecap', bukan 'saus barbeque'. Apa alasan AI bisa salah?</p>
<ol>
<li><p><strong>Kata-Kata yang Sama, Maknanya Berbeda:</strong> Dalam bahasa kita, banyak kata yang memiliki lebih dari satu makna tergantung konteksnya. Misalnya 'pasta' di masakan 'saus tomat (tomato paste)' dengan 'pasta' dalam 'pasta gigi (tooth paste)' tentu berbeda.</p>
</li>
<li><p><strong>Keterbatasan Embeddings:</strong> Embeddings memang mengubah kata-kata menjadi angka (vektor) yang membuat komputer bisa memahami dan membandingkan kata-kata tersebut. Akan tetapi, embeddings tidak selalu bisa memahami konteks dengan baik.</p>
</li>
</ol>
<p>Untuk mengatasi masalah ini, kita bisa menggunakan 'knowledge graphs'. Dengan ini, selain makna, hubungan antar kata juga dipertimbangkan. Misalnya, dalam knowledge graph, 'tomato paste' akan dihubungkan dengan 'makanan' dan 'tooth paste' dengan 'kebersihan'. Sehingga ketika kita bertanya , "Pasta apa yang enak untuk membuat spaghetti?" Knowledge graph akan memahami bahwa kita sedang berbicara tentang makanan dan hanya akan memberikan 'tomato paste' sebagai jawaban yang relevan.</p>
<p>Meskipun demikian, tidak semua kondisi memerlukan knowledge graphs. Sistem AI biasanya menggabungkan berbagai sumber data seperti database tradisional, API, embeddings, dan knowledge graphs, tergantung pada keperluan dan jenis data yang ada. Pada umumnya, disarankan untuk memulai dengan metode yang paling sederhana, seperti menggunakan database dengan API, dan kemudian mencoba opsi yang lebih advance ketika masalah semakin kompleks.</p>
<h3 id="heading-fine-tuning"><strong>Fine-Tuning</strong></h3>
<p>RAG memang merupakan salah satu metode yang efektif untuk meningkatkan kualitas jawaban dari LLM. Namun, ia juga bukan satu-satunya, contoh metode lain yang bisa dilakukan adalah fine tuning. Metode ini merupakan salah satu cara untuk meningkatkan kinerja model AI agar bisa memberikan jawaban yang lebih spesifik dan sesuai dengan keperluan kita. Cara kerjanya adalah pertama-tama, kita memberikan model AI banyak contoh dialog yang sudah lengkap. Setiap contoh berisi pesan sistem, permintaan pengguna, dan jawaban yang diharapkan. Kemudian Model AI dilatih dengan contoh-contoh ini sehingga dia belajar bagaimana harus merespons permintaan yang serupa di masa depan.</p>
<p>Fine-Tuning memiliki sejumlah manfaat. Setidaknya ada tiga benefit utama dari fine-tuning. Pertama adalah jawaban yang lebih konsisten, karena ia sudah tahu bagaimana harus merespon. Kedua, model akan bisa disesuaikan untuk menjawab dengan gaya bahasa tertentu. Ketiga, model bisa dilatih agar melakukan tindakan tertentu seperti memberikan referensi ke dokumen atau mengarahkan ke database.</p>
<p>Meskipun menjanjikan, fine-tuning juga memiliki sejumlah tantangan antara lain:</p>
<ul>
<li><p>Diperlukan banyak contoh data latih agar bisa berhasil.</p>
</li>
<li><p>Proses melatih model perlu dilakukan berkali-kali agar model benar-benar mengikuti pola yang diinginkan.</p>
</li>
<li><p>Meskipun sudah dilatih, model mungkin saja tidak memberi hasil yang sesuai harapan, sehingga akan perlu banyak uji coba dan penyesuaian.</p>
</li>
</ul>
<p>Fine-tuning sangat berguna dalam situasi di mana kita memerlukan konsistensi jawaban. Dengan fine-tuning, kita bisa memiliki kendali langsung atas perilaku model AI, sesuatu yang akan sulit dicapai jika hanya menggunakan model dasar.</p>
<h2 id="heading-rag-dengan-fine-tuning-raft"><strong>RAG dengan Fine-Tuning = RAFT</strong></h2>
<p>RAFT adalah singkatan dari <strong>Retrieval Augmented Fine-Tuning</strong>. Ini adalah metode yang menggabungkan dua teknik untuk membuat sistem AI yang lebih efisien dan akurat dalam menangani data spesifik, seperti dokumen internal perusahaan. Bisa demikian karena dengan <strong>RAG (Retrieval-Augmented Generation)</strong> AI bisa menemukan informasi relevan dari sumber data yang luas. Kemudian dengan <strong>Fine-Tuning AI juga dilatih</strong> agar memberikan jawaban yang sesuai dengan contoh spesifik. Berikut contoh alur dari RAFT:</p>
<ol>
<li><p><strong>Langkah Pertama: Menggunakan RAG</strong></p>
<p> Kita menggunakan RAG untuk melatih model AI dengan data spesifik. Misalnya, dokumen internal perusahaan sehingga AI mengenali pola dalam data tersebut.</p>
</li>
<li><p><strong>Langkah Kedua: Membuat Pertanyaan Spesifik</strong></p>
<p> Buat daftar pertanyaan yang mencerminkan jenis pertanyaan yang mungkin diajukan oleh pengguna sistem.</p>
</li>
<li><p><strong>Langkah Ketiga: Ambil Dokumen Terkait</strong></p>
<p> Gunakan RAG untuk mengambil dua jenis dokumen:</p>
<ul>
<li><p>A : Dokumen yang berisi jawaban yang benar.</p>
<p>  B : Dokumen yang berisi informasi yang tidak relevan.</p>
</li>
</ul>
</li>
<li><p><strong>Langkah Keempat: Gabungkan Pertanyaan dan Dokumen</strong></p>
<p> Gabungkan pertanyaan dengan dokumen A untuk membuat jawaban yang rinci, termasuk di dalmnya penjelasan langkah demi langkah.</p>
</li>
<li><p><strong>Langkah Kelima: Proses Fine-Tuning</strong></p>
<p> Lakukan fine-tuning dengan menggunakan tiga jenis contoh data:</p>
<ol>
<li><p>Pertanyaan + Dokumen A + Jawaban rinci.</p>
</li>
<li><p>Pertanyaan + Dokumen B + Jawaban rinci.</p>
</li>
<li><p>Pertanyaan + Campuran data + Jawaban rinci.</p>
</li>
</ol>
</li>
</ol>
<p>Setelah dilatih hasilnya adalah model akan belajar menggunakan data yang relevan dan mengabaikan data yang tidak relevan dan bisa menentukan data mana yang bisa relevan untuk setiap pertanyaan yang ada.</p>
<h2 id="heading-kesimpulan">Kesimpulan</h2>
<p>Dalam penerapan Kecerdasan Artifisial, terutama dengan Large Language Models (LLMs), terdapat berbagai tantangan yang perlu diatasi agar dapat memberikan jawaban yang akurat dan relevan. Teknik-teknik seperti RAG (Retrieval-Augmented Generation) dan Fine-Tuning memainkan peran penting dalam mengatasi tantangan tersebut. Dengan menggunakan teknik-teknik ini, kita dapat menciptakan sistem AI yang tidak hanya canggih, tetapi juga lebih dapat diandalkan dalam memberikan jawaban yang relevan dan akurat sesuai dengan keperluan. Penerapan RAG, fine-tuning, dan RAFT dalam sistem AI akan membantu mengatasi keterbatasan model dasar dan memastikan bahwa AI dapat memberikan kontribusi yang signifikan dalam berbagai aplikasi dunia nyata. Terimakasih telah membaca artikel ini, selamat belajar!</p>
]]></content:encoded></item><item><title><![CDATA[Prediksi Harga Rumah dengan Decision Tree Regressor]]></title><description><![CDATA[Decision Tree adalah salah satu algoritma yang sangat populer dalam machine learning, digunakan baik untuk masalah klasifikasi maupun regresi. Pada artikel…]]></description><link>https://emhaihsan.hashnode.dev/prediksi-harga-rumah-dengan-decision-tree-regressor</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/prediksi-harga-rumah-dengan-decision-tree-regressor</guid><category><![CDATA[#Regression]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[Decision Tree]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Mon, 15 Jul 2024 04:52:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/g39p1kDjvSY/upload/e84dcf03c37957e4c3664044174ecce9.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-pendahuluan">Pendahuluan</h2>
<p>Decision Tree adalah salah satu algoritma yang sangat populer dalam machine learning, digunakan baik untuk masalah klasifikasi maupun regresi. Pada artikel ini, kita akan fokus pada Decision Tree Regression terlebih dahulu. Decision Tree Regression adalah algoritma yang memetakan fitur dari dataset untuk memprediksi nilai kontinu (seperti harga rumah, suhu, dll.). Decision Tree di sini memecah data ke dalam subset yang lebih kecil dan semakin kecil dan di saat yang sama dibuat suatu pohon keputusan secara bertahap. Hasil akhirnya adalah sebuah pohon dengan simpul daun dan cabang.</p>
<h3 id="heading-bagaimana-suatu-decision-tree-bekerja"><strong>Bagaimana Suatu Decision Tree Bekerja?</strong></h3>
<p>Sebuah decision tree terdiri dari tiga jenis node:</p>
<ol>
<li><p><strong>Root Node</strong>: Node pertama yang memulai pembagian.</p>
</li>
<li><p><strong>Internal Node</strong>: Node di dalam pohon yang memisahkan data berdasarkan fitur tertentu.</p>
</li>
<li><p><strong>Leaf Node</strong>: Node terakhir yang memberikan prediksi nilai target.</p>
</li>
</ol>
<p>Dalam membangun suatu decision tree, terdapat beberapa tahapan yang terjadi:</p>
<ol>
<li><p><strong>Pemilihan Fitur</strong>: Memilih fitur yang paling signifikan untuk memisahkan data pada setiap langkah.</p>
</li>
<li><p><strong>Kriteria Pembagian</strong>: Menentukan bagaimana memisahkan data pada setiap simpul.</p>
</li>
<li><p><strong>Pembentukan Simpul</strong>: Ulangi proses pemisahan sampai memenuhi kriteria tertentu (misalnya, jumlah maksimum kedalaman pohon atau jumlah minimum sampel dalam simpul).</p>
</li>
</ol>
<h3 id="heading-kriteria-pembagian"><strong>Kriteria Pembagian</strong></h3>
<p>Salah satu aspek paling penting dari Decision Tree Regression adalah memilih cara terbaik untuk memisahkan data di setiap simpul. Untuk regresi, biasanya digunakan Mean Squared Error (MSE) sebagai kriteria pembagian.</p>
<p>Rumus Mean Squared Error (MSE):</p>
<p>\( \text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2\)</p>
<p>dimana:</p>
<ul>
<li><p>\(N\) adalah jumlah sampel</p>
</li>
<li><p>\(y_i\) adalah nilai target aktual</p>
</li>
<li><p>\(\hat y_i\) adalah nilai prediksi</p>
</li>
</ul>
<p>Algoritma akan mencari pembagian yang meminimalkan MSE pada setiap simpul.</p>
<h3 id="heading-pemilihan-fitur-dan-pembagian"><strong>Pemilihan Fitur dan Pembagian</strong></h3>
<p>Proses pemilihan fitur melibatkan perhitungan MSE untuk setiap fitur dan titik pembagian yang mungkin. Misalnya, jika kita memiliki fitur X dengan nilai-nilai \([1, 2, 3, 4, 5]\) dan nilai target Y dengan nilai-nilai \([5, 4, 3, 2, 1]\), kita dapat mencoba berbagai titik pembagian seperti \(X &lt; 2.5\), \(X &lt; 3.5\), dll., dan menghitung MSE untuk setiap pembagian. Pembagian dengan MSE terendah akan dipilih.</p>
<p>Setelah fitur dan titik pembagian dipilih, data dipecah menjadi dua subset berdasarkan pembagian tersebut. Proses ini diulang terus menerus pada setiap subset sampai memenuhi kriteria penghentian tertentu, seperti kedalaman maksimum pohon atau jumlah minimum sampel dalam simpul.</p>
<p>Misalkan kita memiliki dataset sederhana dengan fitur X dan nilai target Y:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>X</td><td>Y</td></tr>
</thead>
<tbody>
<tr>
<td>1</td><td>5</td></tr>
<tr>
<td>2</td><td>4</td></tr>
<tr>
<td>3</td><td>3</td></tr>
<tr>
<td>4</td><td>2</td></tr>
<tr>
<td>5</td><td>1</td></tr>
</tbody>
</table>
</div><p>Kita ingin memprediksi nilai Y menggunakan Decision Tree Regression. Berikut langkah-langkahnya:</p>
<ol>
<li><p><strong>Memilih Fitur dan Pembagian</strong>:</p>
<ul>
<li><p>Cobalah pembagian di ( X &lt; 2.5 ):</p>
<ul>
<li><p>Kiri: X = [1, 2] , Y = [5, 4]</p>
</li>
<li><p>Kanan: X = [3, 4, 5] , Y = [3, 2, 1]</p>
</li>
</ul>
</li>
<li><p>Hitung MSE untuk pembagian ini:</p>
<p>  \(\text{MSE}_{left} = \frac{1}{2} ((5 - 4.5)^2 + (4 - 4.5)^2) = 0.25\)</p>
<p>  \(\text{MSE}_{ right} = \frac{1}{3} ((3 - 2)^2 + (2 - 2)^2 + (1 - 2)^2) = 0.67\)</p>
<p>  \( \text{MSE}_{total} = \frac{2}{5} \times 0.25 + \frac{3}{5} \times 0.67 = 0.47\)</p>
</li>
</ul>
</li>
<li><p><strong>Membuat Simpul</strong>:</p>
<ul>
<li>Pembagian ( X &lt; 2.5 ) memberikan MSE total terendah, jadi kita memecah data pada titik tersebut.</li>
</ul>
</li>
</ol>
<p>Proses ini diulang untuk subset yang dihasilkan sampai kriteria penghentian terpenuhi.</p>
<h3 id="heading-kelebihan-dan-kekurangan"><strong>Kelebihan dan Kekurangan</strong></h3>
<p>Sebagaimana model machine learning pada umumnya. Decision Tree juga memiliki kelebihan dan kekurangannya. Decision Tree mudah diinterpretasikan dan divisualisasikan. Decision tree juga dapat menangani hubungan non-linear antara fitur dan target. Algoritma decision tree juga akan secara otomatis memilih fitur yang paling signifikan untuk melakukan prediksi.</p>
<p>Adapun kekurangannya antara lain hasil decision tree cenderung overfitting pada data training, terutama jika kita tidak mengatur kedalamannya. Selain itu, decision tree juga sangat sensitif terhadap perubahan kecil dalam data., perubahan kecil dapat menghasilkan struktur pohon yang sangat berbeda.</p>
<h2 id="heading-studi-kasus-prediksi-harga-rumah">Studi Kasus : Prediksi Harga Rumah</h2>
<p>Kode di bawah ini adalah contoh implementasi model Decision Tree Regressor menggunakan dataset <a target="_blank" href="https://www.kaggle.com/competitions/house-prices-advanced-regression-techniques">House Prices dari Kaggle</a>. Langkah-langkahnya mencakup loading data, eksplorasi data, penanganan missing values, pemisahan data, pelatihan model, evaluasi model, dan visualisasi hasil.</p>
<h3 id="heading-import-libraries">Import Libraries</h3>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt
<span class="hljs-keyword">import</span> seaborn <span class="hljs-keyword">as</span> sns
<span class="hljs-keyword">from</span> sklearn.model_selection <span class="hljs-keyword">import</span> train_test_split
<span class="hljs-keyword">from</span> sklearn.tree <span class="hljs-keyword">import</span> DecisionTreeRegressor
<span class="hljs-keyword">from</span> sklearn.metrics <span class="hljs-keyword">import</span> mean_squared_error, r2_score
</code></pre>
<ul>
<li><p><strong>pandas</strong> dan <strong>numpy</strong> digunakan untuk manipulasi data.</p>
</li>
<li><p><strong>matplotlib</strong> dan <strong>seaborn</strong> digunakan untuk visualisasi.</p>
</li>
<li><p><strong>train_test_split</strong> dari sklearn digunakan untuk membagi data menjadi set pelatihan dan pengujian.</p>
</li>
<li><p><strong>DecisionTreeRegressor</strong> dari sklearn digunakan untuk membuat model regresi pohon keputusan.</p>
</li>
<li><p><strong>mean_squared_error</strong> dan <strong>r2_score</strong> digunakan untuk evaluasi performa model.</p>
</li>
</ul>
<h3 id="heading-load-dataset">Load Dataset</h3>
<pre><code class="lang-python">df = pd.read_csv(<span class="hljs-string">'/kaggle/input/house-prices-advanced-regression-techniques/train.csv'</span>)
</code></pre>
<p>Membaca data dari file CSV yang berisi informasi harga rumah dan fitur-fitur yang terkait. Kemudian kita menampilkan 5 baris pertama untuk mendapatkan dambaran umum tentang data.</p>
<pre><code class="lang-python">df.head()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721016420211/3d8fde89-18ee-4ee1-9a2f-717c36cc8359.png" alt class="image--center mx-auto" /></p>
<h4 id="heading-descriptive-statistics">Descriptive Statistics</h4>
<pre><code class="lang-python">df.describe()
</code></pre>
<p>Menampilkan statistik deskriptif seperti mean, std, min, max untuk setiap kolom dalam dataset.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721016494566/ff5717ef-e4a4-40ac-8d4b-ebf116944e9f.png" alt class="image--center mx-auto" /></p>
<p>Karena data yang kita gunakan memiliki kolom yang sangat banyak, kita juga perlu mengetahui tentang tipe data yang ada di setiap kolom.</p>
<pre><code class="lang-python">df.info()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721016773019/2cfeddf1-5ed9-4393-b46f-2a80779e91c8.png" alt class="image--center mx-auto" /></p>
<h4 id="heading-deteksi-missing-values">Deteksi Missing Values</h4>
<pre><code class="lang-python"><span class="hljs-keyword">for</span> col <span class="hljs-keyword">in</span> df.columns:
    miss = df[col].isna().sum() 
    <span class="hljs-keyword">if</span> miss &gt; <span class="hljs-number">0</span>:
        print(<span class="hljs-string">f"<span class="hljs-subst">{col}</span> has total <span class="hljs-subst">{miss}</span> missing values"</span>)
</code></pre>
<p>Menghitung dan menampilkan jumlah nilai yang hilang untuk setiap kolom.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721022867177/45879900-2b62-418e-a4e3-e02297ead967.png" alt class="image--center mx-auto" /></p>
<h4 id="heading-visualisasi-missing-values">Visualisasi Missing Values</h4>
<pre><code class="lang-python">plt.figure(figsize=(<span class="hljs-number">12</span>, <span class="hljs-number">6</span>))
sns.heatmap(df.isnull(), cbar=<span class="hljs-literal">False</span>, cmap=<span class="hljs-string">'viridis'</span>)
plt.title(<span class="hljs-string">'Missing Values Heatmap'</span>)
plt.show()
</code></pre>
<p>Menggunakan heatmap untuk memvisualisasikan lokasi missing values dalam dataset.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721022893843/690f7212-d221-4c3c-9944-4fb65ad95cc8.png" alt class="image--center mx-auto" /></p>
<h4 id="heading-penanganan-missing-values">Penanganan Missing Values</h4>
<pre><code class="lang-python">manyMiss = [col <span class="hljs-keyword">for</span> col <span class="hljs-keyword">in</span> df.columns <span class="hljs-keyword">if</span> df[col].isna().sum() &gt; <span class="hljs-number">500</span>]
lessMiss = [col <span class="hljs-keyword">for</span> col <span class="hljs-keyword">in</span> df.columns <span class="hljs-keyword">if</span> df[col].isna().sum() &lt;= <span class="hljs-number">500</span>]
df = df.drop(columns=manyMiss)
<span class="hljs-keyword">for</span> col <span class="hljs-keyword">in</span> df.columns:
    <span class="hljs-keyword">if</span> df[col].dtype == <span class="hljs-string">'O'</span>:
        df[col] = df[col].fillna(df[col].mode()[<span class="hljs-number">0</span>])
    <span class="hljs-keyword">else</span>:
        df[col] = df[col].fillna(df[col].mean())
</code></pre>
<ul>
<li><p><strong>manyMiss</strong>: Kolom dengan lebih dari 500 missing values dihapus.</p>
</li>
<li><p><strong>lessMiss</strong>: Kolom dengan kurang dari 500 missing values diisi dengan mode untuk tipe objek dan mean untuk tipe numerik.</p>
</li>
</ul>
<h3 id="heading-eksplorasi-data">Eksplorasi Data</h3>
<h4 id="heading-distribusi-saleprice">Distribusi SalePrice</h4>
<pre><code class="lang-python">plt.figure(figsize=(<span class="hljs-number">10</span>, <span class="hljs-number">6</span>))
sns.histplot(df[<span class="hljs-string">'SalePrice'</span>], kde=<span class="hljs-literal">True</span>)
plt.title(<span class="hljs-string">'SalePrice Distribution'</span>)
plt.show()
</code></pre>
<p>Di sini kita ingin memprediksi harga rumah, maka tidak ada salahnya melakukan plotting untuk melihat distribusi yang ada.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721016842707/288e9337-3f2c-4d5c-930c-736972be831d.png" alt class="image--center mx-auto" /></p>
<h4 id="heading-pemilihan-fitur-numerik">Pemilihan Fitur Numerik</h4>
<pre><code class="lang-python">numeric_features = df.select_dtypes(include=[np.number])
numeric_features = numeric_features.drop(columns=[<span class="hljs-string">'SalePrice'</span>])
y = df[<span class="hljs-string">'SalePrice'</span>]
X = numeric_features
</code></pre>
<p>Untuk project ini kita hanya memilih kolom-kolom yang memiliki tipe data numerik. Kemudian kita menentukan kolom <code>SalePrice</code> sebagai variabel target / <code>y</code>. Setelah menentukan variabel <code>X</code> dan <code>y</code> kemudian kita membaginya menjadi data train dan data test</p>
<pre><code class="lang-python">X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=<span class="hljs-number">0.2</span>, random_state=<span class="hljs-number">42</span>)
</code></pre>
<h4 id="heading-train-model">Train Model</h4>
<pre><code class="lang-python">model = DecisionTreeRegressor(random_state=<span class="hljs-number">42</span>)
model.fit(X_train, y_train)
</code></pre>
<p>Di sini kita membuat dan melatih model Decision Tree Regressor pada data latih.</p>
<h4 id="heading-prediksi-dan-evaluasi">Prediksi dan Evaluasi</h4>
<p>Setelah melatih pada data yang dipilih, kemudian kita melakukan prediksi pada data baru. Dalam hal ini kita menggunakan data tes yang sudah dituliskan sebelumnya (20% dari dataset)</p>
<pre><code class="lang-python"><span class="hljs-comment"># Predictions</span>
y_pred_train = model.predict(X_train)
y_pred_test = model.predict(X_test)

<span class="hljs-comment"># Evaluation metrics</span>
mse_train = mean_squared_error(y_train, y_pred_train)
mse_test = mean_squared_error(y_test, y_pred_test)
r2_train = r2_score(y_train, y_pred_train)
r2_test = r2_score(y_test, y_pred_test)

print(<span class="hljs-string">f'Training MSE: <span class="hljs-subst">{mse_train}</span>'</span>)
print(<span class="hljs-string">f'Testing MSE: <span class="hljs-subst">{mse_test}</span>'</span>)
print(<span class="hljs-string">f'Training R²: <span class="hljs-subst">{r2_train}</span>'</span>)
print(<span class="hljs-string">f'Testing R²: <span class="hljs-subst">{r2_test}</span>'</span>)
</code></pre>
<ul>
<li><p><strong>y_pred_train</strong> dan <strong>y_pred_test</strong>: Hasil prediksi untuk set pelatihan dan pengujian.</p>
</li>
<li><p><strong>mse_train</strong> dan <strong>mse_test</strong>: Mean Squared Error untuk set pelatihan dan pengujian.</p>
</li>
<li><p><strong>r2_train</strong> dan <strong>r2_test</strong>: R² score untuk set pelatihan dan pengujian.</p>
</li>
<li><p>Menampilkan hasil evaluasi performa model.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721019485648/db29f7fe-02ae-4bf3-963b-faf7a633616b.png" alt class="image--center mx-auto" /></p>
<h4 id="heading-visualisasi-decision-tree">Visualisasi Decision Tree</h4>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> sklearn.tree <span class="hljs-keyword">import</span> plot_tree
plt.figure(figsize=(<span class="hljs-number">20</span>, <span class="hljs-number">10</span>))
plot_tree(model, filled=<span class="hljs-literal">True</span>, feature_names=X.columns, max_depth=<span class="hljs-number">2</span>, fontsize=<span class="hljs-number">10</span>)
plt.show()
</code></pre>
<p>Menggunakan <code>plot_tree</code> untuk memvisualisasikan struktur pohon keputusan sampai kedalaman 2.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721017649095/c4add9f4-b60b-4434-9bdb-ad17f89092a5.png" alt class="image--center mx-auto" /></p>
<p>Di atas kita membuat visualisasi hasil decision tree dengan kedalaman 2. Pada kenyataannya, pohon keputusan memiliki cabang yang sangat banyak dan dalam. Setelah mendapatkan hasil prediksi, kita buat visualisasi untuk melihat perbandingan data real dengan hasil prediksi.</p>
<pre><code class="lang-python">plt.figure(figsize=(<span class="hljs-number">10</span>, <span class="hljs-number">6</span>))
plt.scatter(y_test, y_pred_test, alpha=<span class="hljs-number">0.7</span>, color=<span class="hljs-string">'b'</span>)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], <span class="hljs-string">'--r'</span>, linewidth=<span class="hljs-number">2</span>)
plt.xlabel(<span class="hljs-string">'Actual SalePrice'</span>)
plt.ylabel(<span class="hljs-string">'Predicted SalePrice'</span>)
plt.title(<span class="hljs-string">'Actual vs Predicted SalePrice'</span>)
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721018425955/93cbe301-a3db-4d2c-88d9-685117c3bf83.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-penutup">Penutup</h2>
<p>Dalam artikel ini, kita telah membahas bagaimana Decision Tree bekerja, mulai dari pemilihan fitur, kriteria pembagian, hingga pembentukan simpul. Kita juga melakukan studi kasus prediksi harga rumah. Model Decision Tree Regression menawarkan interpretabilitas yang tinggi, memudahkan kita untuk memahami dan menjelaskan prediksi yang dihasilkan. Namun, penting untuk diingat bahwa model ini bisa sangat sensitif terhadap perubahan kecil dalam data dan cenderung overfitting jika tidak diatur dengan benar.</p>
<p>Dengan pemahaman yang mendalam tentang bagaimana Decision Tree Regression bekerja dan bagaimana mengimplementasikannya, kita sekarang siap untuk menerapkan algoritma ini pada berbagai masalah prediksi nilai kontinu lainnya. Terima kasih sudah membaca artikel ini, Selamat Belajar!</p>
<hr />
<p>Source Code : <a target="_blank" href="https://www.kaggle.com/code/emhaihsan/decision-tree-regressor-and-classifier/">Kaggle</a></p>
]]></content:encoded></item><item><title><![CDATA[Prediksi Kualitas Wine dengan Support Vector Machine]]></title><description><![CDATA[Ketika kita mulai belajar machine learning, kita tentu tidak akan asing dengan istilah Support Vector Machine (SVM). SVM merupakan algoritma machine…]]></description><link>https://emhaihsan.hashnode.dev/prediksi-kualitas-wine-dengan-support-vector-machine</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/prediksi-kualitas-wine-dengan-support-vector-machine</guid><category><![CDATA[SVM]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Fri, 12 Jul 2024 15:46:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/0dhIwRsPV74/upload/e3e53c9d9fb0da048ec69608c19d6c70.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ketika kita mulai belajar machine learning, kita tentu tidak akan asing dengan istilah Support Vector Machine (SVM). SVM merupakan algoritma machine learning yang banyak digunakan untuk klasifikasi dan regresi. Pada artikel ini, kita akan belajar tentang SVM dan mencoba mengimplementasikannya untuk menentukan kualitas dari suatu wine.</p>
<h2 id="heading-support-vector-machine">Support Vector Machine</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720796975781/90142d79-9f4e-41a3-b369-0ddb276feac7.png" alt class="image--center mx-auto" /></p>
<p>Support Vector Machine merupakan algoritma machine learning yang bekerja dengan cara mencari hyperplane optimal untuk memisahkan data ke dalam kelas-kelas berbeda. Dalam kasus data dua dimensi, hyperplane ini adalah garis lurus yang memisahkan data. Di ruang tiga dimensi, hyperplane menjadi bidang, dan di dimensi lebih tinggi, hyperplane tetap disebut hyperplane. Tujuan SVM adalah menemukan hyperplane yang memaksimalkan margin antara dua kelas, yang dikenal sebagai margin maximization.</p>
<h3 id="heading-support-vectors">Support Vectors</h3>
<p>Support vectors adalah titik data yang paling dekat dengan hyperplane. Titik-titik ini sangat penting karena mereka menentukan posisi dan orientasi hyperplane. Jika support vectors diubah, hyperplane yang memisahkan kelas juga akan berubah. Oleh karena itu, SVM hanya bergantung pada beberapa titik data penting ini, menjadikannya efisien dalam hal penggunaan memori.</p>
<h3 id="heading-margin-maximization">Margin Maximization</h3>
<p>Margin adalah jarak antara hyperplane dan titik data terdekat dari setiap kelas. SVM berusaha untuk menemukan hyperplane yang memaksimalkan margin ini. Hyperplane dengan margin terbesar dipilih karena diharapkan dapat memberikan generalisasi yang lebih baik pada data baru. Margin yang lebih besar mengurangi risiko overfitting, yang terjadi ketika model terlalu menyesuaikan data pelatihan dan tidak bekerja dengan baik pada data yang tidak terlihat.</p>
<h3 id="heading-kernel-trick">Kernel Trick</h3>
<p>Dalam banyak kasus, data tidak dapat dipisahkan secara linear di ruang fitur asli. Untuk mengatasi ini, SVM menggunakan kernel trick, yang memetakan data ke ruang dimensi lebih tinggi di mana data dapat dipisahkan secara linear. Kernel yang umum digunakan termasuk kernel linear, polynomial, dan radial basis function (RBF). Dengan kernel trick, SVM dapat menangani data yang sangat kompleks dan tidak dapat dipisahkan secara linear.</p>
<h4 id="heading-fungsi-kernel">Fungsi Kernel</h4>
<ol>
<li><p><strong>Linear Kernel</strong>: Digunakan untuk data yang dapat dipisahkan secara linear.</p>
</li>
<li><p><strong>Polynomial Kernel</strong>: Memetakan data ke ruang polinomial.</p>
</li>
<li><p><strong>Radial Basis Function (RBF) Kernel</strong>: Memetakan data ke ruang dimensi tak hingga.</p>
</li>
</ol>
<p>SVM dengan kernel trick memungkinkan model untuk menemukan hyperplane optimal di ruang fitur yang lebih tinggi tanpa perlu menghitung koordinat data dalam ruang tersebut secara eksplisit.</p>
<h2 id="heading-studi-kasus-klasifikasi-kualitas-wine">Studi Kasus: Klasifikasi kualitas Wine</h2>
<p>Pada bagian ini, kita akan mengimplementasikan algoritma Support Vector Machine (SVM) menggunakan dataset <a target="_blank" href="https://www.kaggle.com/datasets/yasserh/wine-quality-dataset">Wine Quality</a>.</p>
<h3 id="heading-mengimpor-library-dan-dataset">Mengimpor Library dan Dataset</h3>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd
<span class="hljs-keyword">from</span> sklearn.model_selection <span class="hljs-keyword">import</span> train_test_split
<span class="hljs-keyword">from</span> sklearn.preprocessing <span class="hljs-keyword">import</span> StandardScaler
<span class="hljs-keyword">from</span> sklearn.svm <span class="hljs-keyword">import</span> SVC
<span class="hljs-keyword">from</span> sklearn.metrics <span class="hljs-keyword">import</span> classification_report, confusion_matrix
<span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt
<span class="hljs-keyword">import</span> seaborn <span class="hljs-keyword">as</span> sns
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">import</span> warnings
warnings.filterwarnings(<span class="hljs-string">'ignore'</span>)
</code></pre>
<pre><code class="lang-python">wine_data = pd.read_csv(<span class="hljs-string">'/kaggle/input/red-wine-quality-cortez-et-al-2009/winequality-red.csv'</span>)
wine_data.head()
</code></pre>
<p>Pada langkah ini, kita mengimpor library-library yanng diperlukan dan membaca dataset Wine Quality dari file CSV yang tersedia di Kaggle.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720797442323/58402cf2-28d4-4c43-9c53-0a2de597b975.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-eksplorasi-dan-pembersihan-data">Eksplorasi dan Pembersihan Data</h3>
<p>Pertama-tama kita memeriksa informasi tentang dataset, termasuk jumlah baris dan kolom, serta tipe data setiap kolom.</p>
<pre><code class="lang-python">wine_data.info()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720797457013/80b83f11-ac37-48eb-9c4f-9831f2fba7c2.png" alt class="image--center mx-auto" /></p>
<p>Dari informasi di atas dapat diketahui bahwa keseluruhan data memiliki tipe data numerik. Selanjutnya adalah memeriksa statistik deskriptif dari dataset seperti mean, standard deviation, minimum, dan maximum value untuk setiap fitur.</p>
<pre><code class="lang-python">wine_data.describe()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720797473661/6e9499ef-54b5-40bf-a549-ea0c5ec21e57.png" alt class="image--center mx-auto" /></p>
<p>Kemudian kita juga perlu memeriksa apakah ada missing values dalam dataset.</p>
<pre><code class="lang-python">wine_data.isnull().sum()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720797623334/b88019eb-ef54-4de2-90fd-5e6f17e12325.png" alt class="image--center mx-auto" /></p>
<p>Hasil menunjukkan bahwa tidak ada missing values. Selanjutnya kita akan menampilkan sejumlah visualisasi dari data yang kita gunakan</p>
<pre><code class="lang-python">plt.figure(figsize=(<span class="hljs-number">8</span>, <span class="hljs-number">6</span>))
sns.countplot(data=wine_data, x=<span class="hljs-string">'quality'</span>, palette=<span class="hljs-string">'viridis'</span>)
plt.title(<span class="hljs-string">'Wine Quality Distribution'</span>)
plt.xlabel(<span class="hljs-string">'Quality'</span>)
plt.ylabel(<span class="hljs-string">'Count'</span>)
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720798064062/55f6f8a3-1980-48df-879d-8ea0d52e1aad.png" alt class="image--center mx-auto" /></p>
<p>Plot ini menunjukkan sebaran jumlah sampel anggur untuk setiap nilai kualitas. Ini membantu kita memahami berapa banyak anggur yang masuk dalam setiap kategori kualitas.</p>
<pre><code class="lang-python">plt.figure(figsize=(<span class="hljs-number">12</span>, <span class="hljs-number">8</span>))
sns.heatmap(wine_data.corr(), annot=<span class="hljs-literal">True</span>, cmap=<span class="hljs-string">'coolwarm'</span>)
plt.title(<span class="hljs-string">'Feature Correlation Heatmap'</span>)
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720798093732/8058d018-e358-426c-a94d-0589dc077f6d.png" alt class="image--center mx-auto" /></p>
<p>Plot ini menunjukkan korelasi antar fitur dalam dataset. Nilai korelasi berkisar dari -1 hingga 1. Nilai positif menunjukkan korelasi positif, sementara nilai negatif menunjukkan korelasi negatif. Ini membantu kita memahami hubungan antar fitur.</p>
<pre><code class="lang-python">features = [<span class="hljs-string">'fixed acidity'</span>, <span class="hljs-string">'volatile acidity'</span>, <span class="hljs-string">'citric acid'</span>, <span class="hljs-string">'residual sugar'</span>, <span class="hljs-string">'chlorides'</span>, <span class="hljs-string">'free sulfur dioxide'</span>, <span class="hljs-string">'total sulfur dioxide'</span>, <span class="hljs-string">'density'</span>, <span class="hljs-string">'pH'</span>, <span class="hljs-string">'sulphates'</span>, <span class="hljs-string">'alcohol'</span>]
plt.figure(figsize=(<span class="hljs-number">20</span>, <span class="hljs-number">15</span>))
<span class="hljs-keyword">for</span> i, feature <span class="hljs-keyword">in</span> enumerate(features):
    plt.subplot(<span class="hljs-number">4</span>, <span class="hljs-number">3</span>, i+<span class="hljs-number">1</span>)
    sns.histplot(wine_data[feature], kde=<span class="hljs-literal">True</span>, bins=<span class="hljs-number">30</span>, color=<span class="hljs-string">'blue'</span>)
    plt.title(<span class="hljs-string">f'Distribusi <span class="hljs-subst">{feature}</span>'</span>)
plt.tight_layout()
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720798107559/8f70eecf-f589-4d42-a1c7-88e2f55ba62d.png" alt class="image--center mx-auto" /></p>
<p>Plot ini menunjukkan distribusi nilai dari setiap fitur utama dalam dataset. Ini membantu kita memahami sebaran data dan mendeteksi adanya outlier.</p>
<pre><code class="lang-python">plt.figure(figsize=(<span class="hljs-number">20</span>, <span class="hljs-number">15</span>))
<span class="hljs-keyword">for</span> i, feature <span class="hljs-keyword">in</span> enumerate(features):
    plt.subplot(<span class="hljs-number">4</span>, <span class="hljs-number">3</span>, i+<span class="hljs-number">1</span>)
    sns.boxplot(y=wine_data[feature], color=<span class="hljs-string">'blue'</span>)
    plt.title(<span class="hljs-string">f'Boxplot <span class="hljs-subst">{feature}</span>'</span>)
plt.tight_layout()
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720798127976/1ba18f17-6983-471a-b2e9-2bd047faed95.png" alt class="image--center mx-auto" /></p>
<p>Plot ini menunjukkan boxplot dari setiap fitur utama dalam dataset. Boxplot memberikan informasi tentang distribusi data, median, kuartil, dan potensi outlier. Ini membantu kita memahami karakteristik distribusi setiap fitur lebih detail.</p>
<h3 id="heading-preprocessing-data">Preprocessing Data</h3>
<p>Selanjutnya adalah melakukan prapemrosesan pada data. Tahap ini bertujuan agar data siap dimasukkan ke dalam model machine learning.</p>
<pre><code class="lang-python">X = wine_data.drop(<span class="hljs-string">'quality'</span>, axis=<span class="hljs-number">1</span>)
y = wine_data[<span class="hljs-string">'quality'</span>]

y = (y &gt; <span class="hljs-number">5</span>).astype(int)
</code></pre>
<p>Pertama, kita memisahkan fitur (<code>X</code>) dan target (<code>y</code>). Kita mengubah kolom <code>quality</code> menjadi variabel binary di mana nilai 0 menunjukkan kualitas &lt;= 5 dan nilai 1 menunjukkan kualitas &gt; 5.</p>
<pre><code class="lang-python">scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
</code></pre>
<p>Selanjutnya, kita melakukan scaling pada fitur menggunakan <code>StandardScaler</code> untuk memastikan semua fitur memiliki skala yang sama.</p>
<pre><code class="lang-python">X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=<span class="hljs-number">0.2</span>, random_state=<span class="hljs-number">42</span>)
</code></pre>
<p>Kita membagi data menjadi training set dan test set dengan proporsi 80% training dan 20% testing.</p>
<h3 id="heading-membuat-model-svm">Membuat Model SVM</h3>
<pre><code class="lang-python">svm_model = SVC(kernel=<span class="hljs-string">'linear'</span>)
svm_model.fit(X_train, y_train)

y_pred = svm_model.predict(X_test)
</code></pre>
<p>Pada bagian ini, kita membangun model SVM menggunakan kernel linear dan melatihnya dengan data training. Kemudian, kita melakukan prediksi pada data test.</p>
<h3 id="heading-model-evaluation">Model Evaluation</h3>
<pre><code class="lang-python">print(classification_report(y_test, y_pred))
</code></pre>
<p>Kita mengevaluasi performa model menggunakan <code>classification_report</code> yang memberikan metrik seperti precision, recall, dan f1-score untuk setiap kelas.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720798272684/25f9a08c-7ae8-4255-b5e0-196aac01941c.png" alt class="image--center mx-auto" /></p>
<pre><code class="lang-python">plt.figure(figsize=(<span class="hljs-number">8</span>, <span class="hljs-number">6</span>))
sns.heatmap(confusion_matrix(y_test, y_pred), annot=<span class="hljs-literal">True</span>, fmt=<span class="hljs-string">'d'</span>, cmap=<span class="hljs-string">'Blues'</span>)
plt.title(<span class="hljs-string">'Confusion Matrix'</span>)
plt.xlabel(<span class="hljs-string">'Predicted'</span>)
plt.ylabel(<span class="hljs-string">'Actual'</span>)
plt.show()
</code></pre>
<p>Kita juga menampilkan confusion matrix untuk melihat jumlah prediksi benar dan salah untuk setiap kelas.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720798292192/529d03a7-dcaa-4c0f-bc0d-d83338ca7b72.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-tambahan-menggunakan-kernel-rbf">Tambahan : Menggunakan Kernel RBF</h3>
<p>Jika pada percobaan sebelumnya kita menggunakan kernel linear, sekarang mari kita coba membuat model svm menggunakan kernel rbf. <code>gamma='auto'</code> berarti bahwa parameter gamma akan diatur ke nilai default.</p>
<pre><code class="lang-python">svm_model_rbf = SVC(kernel=<span class="hljs-string">'rbf'</span>, gamma=<span class="hljs-string">'auto'</span>)
svm_model_rbf.fit(X_train, y_train)

y_pred_rbf = svm_model_rbf.predict(X_test)
</code></pre>
<pre><code class="lang-python"><span class="hljs-comment"># Evaluasi performa model RBF</span>
print(classification_report(y_test, y_pred_rbf))
</code></pre>
<pre><code class="lang-python">plt.figure(figsize=(<span class="hljs-number">8</span>, <span class="hljs-number">6</span>))
sns.heatmap(confusion_matrix(y_test, y_pred_rbf), annot=<span class="hljs-literal">True</span>, fmt=<span class="hljs-string">'d'</span>, cmap=<span class="hljs-string">'Blues'</span>)
plt.title(<span class="hljs-string">'Confusion Matrix'</span>)
plt.xlabel(<span class="hljs-string">'Predicted'</span>)
plt.ylabel(<span class="hljs-string">'Actual'</span>)
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720798383593/6d76624d-17d0-48c2-b057-28ce0dc09895.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720798415014/6614a231-05a7-4b76-9e47-965fb6084bcd.png" alt class="image--center mx-auto" /></p>
<p>Dari hasli yang didapatkan dapat dilihat bahwa hasil klasifikasi yang menggunakan kernel RBF mendapatkan hasil yang lebih baik dibandingkan dengan menggunakan kernel Linear.</p>
<h2 id="heading-kesimpulan">Kesimpulan</h2>
<p>Dalam artikel ini, kita membahas konsep dasar Support Vector Machine (SVM) dan mengimplementasikannya pada dataset Wine Quality untuk klasifikasi kualitas anggur. Hasil evaluasi menunjukkan bahwa SVM dengan kernel RBF memberikan performa lebih baik dengan akurasi 77% dibandingkan kernel linear dengan akurasi 73%. Visualisasi seperti distribusi kualitas anggur, heatmap korelasi fitur, dan boxplot distribusi fitur utama membantu memahami karakteristik data. Secara keseluruhan, SVM adalah algoritma yang kuat untuk tugas klasifikasi, terutama saat data tidak dapat dipisahkan secara linear. Selain itu, perbedaan hasil antara model yang menggunakan kernel RBF dengan linear menggambarkan pentingnya untuk melakukan tuning terhadap parameter-parameter yang ada di dalam model. Terima kasih sudah membaca artikel ini. Semoga bermanfaat dan selamat belajar!</p>
<hr />
<p>Source Code : <a target="_blank" href="https://www.kaggle.com/code/emhaihsan/svm-wine-quality/edit">Kaggle</a></p>
]]></content:encoded></item><item><title><![CDATA[Klasifikasi Bunga Iris dengan K Nearest Neighbor]]></title><description><![CDATA[Dalam dunia machine learning, banyak algoritma yang dapat digunakan untuk memprediksi data baru berdasarkan data yang sudah ada. Salah satu algoritma yang…]]></description><link>https://emhaihsan.hashnode.dev/klasifikasi-bunga-iris-dengan-k-nearest-neighbor</link><guid isPermaLink="true">https://emhaihsan.hashnode.dev/klasifikasi-bunga-iris-dengan-k-nearest-neighbor</guid><category><![CDATA[iris data]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[k nearest neighbors]]></category><category><![CDATA[Artificial Intelligence]]></category><dc:creator><![CDATA[Muhammad Ihsan]]></dc:creator><pubDate>Fri, 12 Jul 2024 14:12:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/QJNFKcofcOc/upload/6917d5fcf7b495852ae38eaa2fdb640a.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Dalam dunia machine learning, banyak algoritma yang dapat digunakan untuk memprediksi data baru berdasarkan data yang sudah ada. Salah satu algoritma yang sederhana namun kuat adalah K-Nearest Neighbor (KNN). Kelebihan yang paling menonjol dari algoritma ini adalah sifatnya yang mudah dipahami. Meskipun demikian, algoritma ini tetap efektif pada sejumlah kasus klasifikasi. Pada artikel ini, kita akan membahas konsep dasar KNN, cara kerjanya, dan kemudian menerapkannya menggunakan dataset Iris.</p>
<h2 id="heading-mengenal-k-nearest-neighbor-knn">Mengenal K-Nearest Neighbor (KNN)</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720794558109/a5d54f16-591a-47e7-8a58-41f2a1013a07.png" alt class="image--center mx-auto" /></p>
<p>K-Nearest Neighbor adalah algoritma yang mengklasifikasikan sebuah data baru berdasarkan kemiripannya dengan data yang sudah ada. Misalnya kita memiliki sekelompok data yang sudah dikategorikan, dan kemudian kita ingin mengkategorikan data baru. KNN akan mencari data yang paling mirip dengan data baru ini dan menggunakan informasi tersebut untuk menentukan kategori data baru. Berikut adalah tahapan yang terjadi dalam KNN:</p>
<ol>
<li><p><strong>Pilih jumlah tetangga (k)</strong>: Jumlah tetangga yang akan digunakan untuk menentukan kategori data baru. Biasanya, k adalah angka ganjil untuk menghindari hasil yang setara dalam klasifikasi.</p>
</li>
<li><p><strong>Hitung jarak</strong>: Hitung jarak antara data baru dan semua data dalam dataset yang sudah ada. Jarak ini biasanya dihitung menggunakan rumus Euclidean.</p>
</li>
<li><p><strong>Pilih tetangga terdekat</strong>: Pilih k data terdekat yang memiliki jarak terkecil dengan data baru.</p>
</li>
<li><p><strong>Tentukan kategori</strong>: Lihat kategori dari k tetangga terdekat. Kategori yang paling sering muncul di antara tetangga terdekat akan menjadi kategori untuk data baru.</p>
</li>
</ol>
<p>Rumus Euclidean merupakan metode yang paling umum digunakan untuk menghitung jarak antara dua titik dalam ruang berdimensi n. Misalnya, jika kita memiliki dua titik \(A\) dan \(B\) dengan koordinat masing-masing \((x_1, y_1)\) dan \((x_2, y_2)\), maka jarak Euclidean antara keduanya adalah:</p>
<p>\(\text{Euclidean Distance} = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}\)</p>
<p>Rumus ini bisa diperluas untuk data dengan lebih banyak dimensi.</p>
<p>Kelebihan dari KNN antara lain adalah prosesnya yang dipahami dan diimplementasikan. KNNjuga tidak memerlukan pelatihan model, karena ia hanya menyimpan data. Selain itu, ia juga dapat menangani data dengan kategori yang banyak.</p>
<p>KNN juga memiliki sejumlah kekurangan seperti diperlukannya banyak memori karena harus menyimpan semua data. Waktu prediksi KNN bisa berlangsung lama ketika dataset sangat besar. KNN juga sensitif terhadap fitur yang tidak relevan atau skala yang berbeda.</p>
<h2 id="heading-studi-kasus-klasifikasi-bunga-iris">Studi Kasus Klasifikasi Bunga Iris</h2>
<p>Setelah memahami dasar-dasar K-Nearest Neighbor (KNN) pada bagian sebelumnya, mari kita lanjutkan dengan studi kasus penerapan KNN. Kita akan menggunakan dataset Iris yang berisi informasi tentang tiga jenis bunga Iris: Iris-setosa, Iris-versicolor, dan Iris-virginica. Setiap jenis bunga memiliki empat fitur:</p>
<ul>
<li><p>Panjang sepal (sepal_length)</p>
</li>
<li><p>Lebar sepal (sepal_width)</p>
</li>
<li><p>Panjang petal (petal_length)</p>
</li>
<li><p>Lebar petal (petal_width)</p>
</li>
</ul>
<p>Dataset Iris yang digunakan pada artikel ini berasal dari kaggle dan bisa dilihat pada <a target="_blank" href="https://www.kaggle.com/datasets/arshid/iris-flower-dataset">link berikut.</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720792420483/20e9d276-9003-462c-b902-a60929b2a29e.png" alt class="image--center mx-auto" /></p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> warnings
<span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd
<span class="hljs-keyword">import</span> seaborn <span class="hljs-keyword">as</span> sns
<span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt
<span class="hljs-keyword">from</span> sklearn.preprocessing <span class="hljs-keyword">import</span> LabelEncoder
<span class="hljs-keyword">from</span> sklearn.neighbors <span class="hljs-keyword">import</span> KNeighborsClassifier
<span class="hljs-keyword">from</span> sklearn.model_selection <span class="hljs-keyword">import</span> train_test_split
<span class="hljs-keyword">from</span> sklearn.metrics <span class="hljs-keyword">import</span> accuracy_score, confusion_matrix, classification_report
warnings.filterwarnings(<span class="hljs-string">'ignore'</span>)
</code></pre>
<p>Pertama kita mengimpor library yang diperlukan terlebih dahulu. Library-library ini mencakup tools untuk manipulasi data (pandas), visualisasi data (seaborn dan matplotlib), preprocessing (LabelEncoder), algoritma KNN, dan evaluasi model (accuracy_score, confusion_matrix, classification_report).</p>
<pre><code class="lang-python">data = pd.read_csv(<span class="hljs-string">'/kaggle/input/iris-flower-dataset/IRIS.csv'</span>)
data.head()
</code></pre>
<p>Selanjutnya kita memuat Dataset Iris dengan <code>pd.read_csv</code> lalu menampilkan lima baris pertama untuk memastikan data telah dimuat dengan benar.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720792512722/312e2d84-202c-482a-a66a-36d86d927614.png" alt class="image--center mx-auto" /></p>
<pre><code class="lang-python">data[<span class="hljs-string">'species'</span>].value_counts()
</code></pre>
<p>Selanjutnay kita lihat berapa banyak contoh setiap jenis bunga dalam dataset.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720792556566/ae67634b-9a75-4838-98d9-54338dcd5780.png" alt class="image--center mx-auto" /></p>
<pre><code class="lang-python">label_encoder = LabelEncoder()
data[<span class="hljs-string">'species'</span>] = label_encoder.fit_transform(data[<span class="hljs-string">'species'</span>])
data[<span class="hljs-string">'species'</span>].value_counts()
</code></pre>
<p>LabelEncoder digunakan untuk mengubah label kategori (Iris-setosa, Iris-versicolor, Iris-virginica) menjadi angka (0, 1, 2). Selanjutnya kita jalankan kembali <code>data['species'].value_counts()</code> untuk melihat apakah kolom species sudah berubah menjadi angka.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720792706937/0cd06e8d-224b-4be6-ab35-e5dfb5d5ecaf.png" alt class="image--center mx-auto" /></p>
<p><strong>Visualisasi Data</strong></p>
<p>Selanjutnya adalah melakukan visualisasi pada data yang ada di dalam dataset. Di sini kita akan menampilkan pairplot dan heatmap.</p>
<pre><code class="lang-python">sns.pairplot(data, hue=<span class="hljs-string">'species'</span>, markers=[<span class="hljs-string">"o"</span>, <span class="hljs-string">"s"</span>, <span class="hljs-string">"D"</span>])
plt.show()
</code></pre>
<pre><code class="lang-python">plt.figure(figsize=(<span class="hljs-number">8</span>, <span class="hljs-number">6</span>))
sns.heatmap(data.corr(), annot=<span class="hljs-literal">True</span>, cmap=<span class="hljs-string">'coolwarm'</span>, linewidths=<span class="hljs-number">0.5</span>)
plt.title(<span class="hljs-string">'Correlation Matrix'</span>)
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720792770715/f39cf1da-33e9-439b-9f41-8fd85f8890f8.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720792781221/95fcb5ab-d616-491b-8e3e-808a3a8b4d22.png" alt class="image--center mx-auto" /></p>
<p>Pair plot menunjukkan hubungan antara setiap fitur dan bagaimana mereka dipisahkan berdasarkan kelas. Heatmap menunjukkan korelasi antara fitur-fitur dalam dataset.</p>
<p><strong>Menentukan Fitur dan Target</strong></p>
<pre><code class="lang-python">X = data.drop(<span class="hljs-string">'species'</span>, axis=<span class="hljs-number">1</span>)
y = data[<span class="hljs-string">'species'</span>]
</code></pre>
<p>Fitur (X) mencakup semua kolom kecuali 'species', dan target (y) adalah kolom 'species'.</p>
<p><strong>Membagi Data</strong></p>
<pre><code class="lang-python">X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=<span class="hljs-number">0.2</span>, random_state=<span class="hljs-number">42</span>)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
</code></pre>
<p>Selanjutnya adalah membagi data menjadi data latih dan data uji. Di sini kita membagi data latih dan data uji dengan rasio 80:20.</p>
<p><strong>Inisialisasi dan Pelatihan Model KNN</strong></p>
<pre><code class="lang-python">knn = KNeighborsClassifier(n_neighbors=<span class="hljs-number">3</span>)
knn.fit(X_train, y_train)
</code></pre>
<p>Model KNN diinisialisasi dengan k=3 dan dilatih menggunakan data latih.</p>
<p><strong>Evaluasi Model</strong></p>
<pre><code class="lang-python">y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)

print(<span class="hljs-string">"Accuracy:"</span>, accuracy)
print(<span class="hljs-string">"Confusion Matrix:\n"</span>, conf_matrix)
print(<span class="hljs-string">"Classification Report:\n"</span>, class_report)
</code></pre>
<p>Model dievaluasi menggunakan metrik akurasi, confusion matrix, dan classification report untuk melihat performa model.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720792912160/9852053a-2c9d-4191-897f-ef96c2f7f8f7.png" alt class="image--center mx-auto" /></p>
<pre><code class="lang-python">plt.figure(figsize=(<span class="hljs-number">8</span>, <span class="hljs-number">6</span>))
sns.heatmap(conf_matrix, annot=<span class="hljs-literal">True</span>, fmt=<span class="hljs-string">'d'</span>, cmap=<span class="hljs-string">'Blues'</span>, cbar=<span class="hljs-literal">False</span>)
plt.xlabel(<span class="hljs-string">'Predicted'</span>)
plt.ylabel(<span class="hljs-string">'Actual'</span>)
plt.title(<span class="hljs-string">'Confusion Matrix'</span>)
plt.show()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720792934238/da32b3ee-9c0a-4e1f-ab89-576c06559dd7.png" alt class="image--center mx-auto" /></p>
<p>Selamat kita telah berhasil menerapkan KNN untuk melakukan prediksi data iris. Kita bisa melihat bahwa model yang kita buat bisa melakukan prediksi dengan akurasi 100%.</p>
<h3 id="heading-kesimpulan">Kesimpulan</h3>
<p>K-Nearest Neighbor (KNN) adalah algoritma yang sangat berguna dan mudah diimplementasikan untuk berbagai tugas klasifikasi. Melalui studi kasus menggunakan dataset Iris, kita telah melihat bagaimana KNN dapat digunakan untuk mengkategorikan jenis bunga berdasarkan fitur-fiturnya. Dengan visualisasi data yang tepat dan evaluasi model yang baik, kita dapat memastikan bahwa model KNN bekerja dengan optimal.</p>
<p>Meskipun memiliki beberapa kekurangan, seperti kebutuhan memori yang besar dan sensitivitas terhadap fitur yang tidak relevan, KNN tetap menjadi pilihan yang populer dalam dunia machine learning karena kesederhanaannya dan kemampuannya untuk menangani berbagai jenis data. Namun perlu diketahui juga, dataset iris yang kita gunakan terbilang sebagai data yang 'sangat bersih', sehingga tidak mengherankan hasilnya akan sangat bagus ketika menggunakan sejumlah metode. Sehingga kita tidak perlu terkejut ketika menerapkan KNN pada dataset lain, hasilnya tidak sebagus menggunakan dataset iris. Oleh karena itu, diharapkan kita bisa terus belajar dan melakukan eksplorasi terhadap metode-metode baru yang senantiasa berkembang. Terima kasih sudah membaca artikel ini, semoga bermanfaat dan selamat belajar!.</p>
<hr />
<p>Source Code : <a target="_blank" href="https://www.kaggle.com/code/emhaihsan/knn-iris-classification/">Kaggle</a></p>
]]></content:encoded></item></channel></rss>