Machine Learning With Python for Beginner
Halo, semuanya. Kali ini saya menulis apa saja yang saya pelajari dalam modul Machine Learning With Python for Beginner yang saya pelajari di DQLab.
Machine Learning adalah teknik dimana komputer dapat mengekstraksi atau mempelajari pola dari suatu data, kemudian dengan pola yang telah dipelajari dari data historis, komputer mampu mengenali dan memprediksi trend, hasil atau kejadian di masa mendatang atau dari observasi baru tanpa perlu diprogram secara eksplisit.
Dalam pembuatan model machine learning tentunya dibutuhkan data. Sekumpulan data yang digunakan dalam machine learning disebut DATASET, yang kemudian dibagi/di-split menjadi training dataset dan test dataset.
TRAINING DATASET digunakan untuk membuat/melatih model machine learning, sedangkan TEST DATASET digunakan untuk menguji performa/akurasi dari model yang telah dilatih/di-training.
Teknik atau pendekatan yang digunakan untuk membangun model disebut ALGORITHM seperti Decision Tree, K-NN, Linear Regression, Random Forest, dan sebagainya. Output atau hasil dari proses melatih algorithm dengan suatu dataset disebut MODEL.
Umumnya dataset disajikan dalam bentuk tabel yang terdiri dari baris dan kolom. Bagian Kolom adalah FEATURE atau VARIABEL data yang dianalisa, sedangkan bagian baris adalah DATA POINT/OBSERVATION/EXAMPLE.
Hal yang menjadi target prediksi atau hal yang akan diprediksi dalam machine learning disebut LABEL/CLASS/TARGET. Dalam statistika/matematika, LABEL/CLASS/TARGET ini dinamakan dengan Dependent Variabel, dan FEATURE adalah Independent Variabel.
Machine Learning terbagi menjadi 2 tipe yaitu supervised dan unsupervised learning. Jika LABEL/CLASS dari dataset sudah diketahui maka dikategorikan sebagai supervised learning, dan jika Label belum diketahui maka dikategorikan sebagai unsupervised learning.
Untuk supervised learning, jika LABEL dari dataset berupa numerik atau kontinu variabel seperti harga, dan jumlah penjualan, metode yang dipilih adalah REGRESI dan jika bukan numerik atau diskrit maka digunakan metode KLASIFIKASI. Untuk unsupervised learning, seperti segmentasi customer, dapat menggunakan metode CLUSTERING.
Eksplorasi Data & Data Pre-processing
Eksplorasi Data: Memahami Data dengan Statistik
Membuat model machine learning tidak serta-merta langsung modelling, ada tahapan sebelumnya yang penting untuk dilakukan sehingga menghasilkan model yang baik. Dengan memanfaatkan Pandas library untuk digunakan dalam menganalisa, memanipulasi dan membersihkan data. Eksplorasi data dapat menggunakan fungsi .shape, .head(), .info(), dan .describe().
Data eksplorasi tidaklah cukup dengan mengetahui dimensi data dan statistical properties saja, tetapi perlu juga untuk sedikit menggali tentang hubungan atau korelasi dari setiap feature, karena beberapa algorithm seperti linear regression dan logistic regression akan menghasilkan model dengan performansi yang buruk jika kita menggunakan feature/variabel saling dependensi atau berkorelasi kuat (multicollinearity). Jadi, jika data yang digunakan berkorelasi kuat, algorithm yang digunakan harus tidak sensitif terhadap hubungan korelasi dari feature/variabel seperti decision tree.
Eksplorasi Data: Memahami Data dengan Visual
Selain dengan statistik, eksplorasi data dapat dilakukan dalam bentuk visual. Visualisasi dapat dengan mudah dan cepat dalam memahami data, bahkan dapat memberikan pemahaman yang lebih baik terkait hubungan setiap variabel/features.
Data Pre-processing: Handling Missing Value
Setelah melakukan eksplorasi data, dilanjutkan ke tahap data pre-processing. Jika data memiliki banyak missing value, maka akan mengurangi performansi model dan juga beberapa algorithm machine learning tidak dapat memproses data dengan missing value. Oleh karena itu, perlu mengecek apakah terdapat missing value dalam data atau tidak. Jika tidak, maka tidak perlu melakukan apa-apa dan bisa melanjutkan ke tahap berikutnya. Jika ada, maka perlu melakukan treatment khusus untuk missing value ini. Proses ini pernah dibahas pada modul Data Manipulation with Pandas — Part1.
Data Preprocessing: Scaling
Beberapa machine learning seperti K-NN dan gradient descent mengharuskan semua variabel memiliki rentang nilai yang sama, karena jika tidak sama, feature dengan rentang nilai terbesar akan menjadi feature yang paling mendominasi dalam proses training/komputasi, sehingga model yang dihasilkan pun akan sangat bias. Oleh karena itu, sebelum memulai training model, terlebih dahulu perlu dilakukan data rescaling ke dalam rentang 0 dan 1, sehingga semua feature berada dalam rentang nilai tersebut, yaitu nilai max = 1 dan nilai min = 0. Data rescaling ini dengan mudah dapat dilakukan di Python menggunakan .MinMaxScaler( ) dari Scikit-Learn library.
Data Pre-processing: Konversi string ke numerik
Setiap algoritma machine learning bekerja dengan menggunakan nilai numeris, maka kolom dengan tipe pandas object atau str harus diubah ke tipe numeris. Perubahan tersebut dapat menggunakan LabelEncoder dari sklearn.preprocessing. LabelEncoder akan mengurutkan label secara otomatis secara alfabetik, posisi/indeks dari setiap label ini digunakan sebagai nilai numeris konversi pandas objek ke numeris (dalam hal ini tipe data int).
Pemodelan dengan Scikit-Learn
Features & Label
Untuk melatih dataset menggunakan Scikit-Learn library, dataset perlu dipisahkan ke dalam Features dan Label/Target.
Training dan Test Dataset
Dataset perlu dibagi ke dalam training dataset dan test dataset dengan perbandingan 80:20. 80% digunakan untuk training dan 20% untuk proses testing. Perbandingan lain yang biasanya digunakan adalah 75:25. Hal penting yang perlu diketahui adalah Scikit-Learn tidak dapat memproses dataframe dan hanya mengakomodasi format data tipe array. Fungsi train_test_split( ) dari Scikit-Learn, otomatis mengubah dataset dari dataframe ke dalam format array.
Fungsi training adalah melatih model untuk mengenali pola dalam data, sedangkan testing berfungsi untuk memastikan bahwa model yang telah dilatih tersebut mampu dengan baik memprediksi label dari new observation dan belum dipelajari oleh model sebelumnya.
Training Model: Fit
Melatih model atau training dengan Scikit-Learn sangat sederhana. Cukup memanggil nama algorithm yang akan digunakan, biasanya disebut classifier untuk problem klasifikasi, dan regressor untuk problem regresi. Misalnya algorithm yang akan digunakan adalah Decision Tree. Maka fungsi yang digunakan adalah DecisionTreeClassifier(). Kemudian menggunakan fungsi .fit() untuk melatih classifier dengan training dataset.
Training Model: Predict
Setelah model/classifier terbentuk, selanjutnya model digunakan untuk memprediksi LABEL dari testing dataset, menggunakan fungsi .predict(). Fungsi ini akan mengembalikan hasil prediksi untuk setiap data point dari testing dataset dalam bentuk array. Proses ini dikenal dengan TESTING.
Evaluasi Model Performance
Tahap terakhir dari modelling yaitu evaluasi hasil model. Untuk evaluasi model performance, setiap algorithm mempunyai metrik yang berbeda-beda. Metrik paling sederhana untuk mengecek performansi model adalah accuracy. Nilai accuracy dapat dimunculkan dengan menggunakan fungsi .score( ). Tetapi di banyak real problem, accuracy saja tidaklah cukup. Metode lain yang digunakan adalah dengan Confusion Matrix. Confusion Matrix merepresentasikan perbandingan prediksi dan real LABEL dari test dataset yang dihasilkan oleh algoritma ML. Untuk menampilkan confusion matrix cukup menggunakan fungsi confusion_matrix() dari Scikit-Learn
- True Positive (TP): Jika diprediksi Positif, dan memang benar (True).
- True Negative (TN): Jika diprediksi Negatif, dan aktualnya benar (True).
- False Positive (FP): Jika diprediksi Positif, tetapi ternyata tidak benar (False).
- False Negative (FN): Jika diprediksi Negatif, tetapi sebenarnya tidak benar (False).
Pakai Metrik yang Mana?
Jika dataset memiliki jumlah data False Negatif dan False Positif yang seimbang (Symmetric), maka bisa gunakan Accuracy, tetapi jika tidak seimbang, maka sebaiknya menggunakan F1-Score.
Dalam suatu problem, jika lebih memilih False Positif lebih baik terjadi daripada False Negatif, misalnya: Dalam kasus Fraud/Scam, kecenderungan model mendeteksi transaksi sebagai fraud walaupun kenyataannya bukan, dianggap lebih baik, daripada transaksi tersebut tidak terdeteksi sebagai fraud tetapi ternyata fraud. Untuk problem ini sebaiknya menggunakan Recall.
Sebaliknya, jika lebih menginginkan terjadinya True Negatif dan sangat tidak menginginkan terjadinya False Positif, sebaiknya menggunakan Precision.
Supervised Learning — Algorithm
Classification — Logistic Regression
Logistic Regression merupakan salah satu algoritma klasifikasi dasar yang cukup popular. Secara sederhana, Logistic regression hampir serupa dengan linear regression tetapi linear regression digunakan untuk Label atau Target Variable yang berupa numerik atau continuous value, sedangkan Logistic Regression digunakan untuk Label atau Target yang berupa categorical/discrete value.
Contoh continuous value adalah harga rumah, harga saham, suhu, dsb; dan contoh dari categorical value adalah prediksi SPAM or NOT SPAM (1 dan 0) atau prediksi customer SUBSCRIBE atau UNSUBSCRIBED (1 dan 0).
Umumnya Logistic Regression dipakai untuk binary classification (1/0; Yes/No; True/False) problem, tetapi beberapa data scientist juga menggunakannya untuk multiclass classification problem. Logistic Regression adalah salah satu linear classifier, oleh karena itu, Logistik Regression juga menggunakan rumus atau fungsi yang sama seperti linear regression yaitu:
dimana variabel 𝑏₀, 𝑏₁, …, 𝑏ᵣ adalah koefisien regresi, dan 𝑥₁, …, 𝑥ᵣ adalah variabel input atau feature.
Output dari Logistic Regression adalah 1 atau 0; sehingga real value dari fungsi ini perlu ditransfer ke nilai di antara 1 dan 0 dengan menggunakan fungsi sigmoid.
Jadi, jika output dari fungsi sigmoid bernilai lebih dari 0.5, maka data point diklasifikasi ke dalam label/class: 1 atau YES; dan kurang dari 0.5, akan diklasifikasikan ke dalam label/class: 0 atau NO.
Pemodelan Logistic Regression dengan memanfaatkan Scikit-Learn sangatlah mudah. Cukup menggunakan modul linear_model dari Scikit-learn, dan memanggil fungsi LogisticRegression().
Classification — Decision Tree
Decision Tree merupakan salah satu metode klasifikasi yang populer dan banyak diimplementasikan serta mudah diinterpretasi. Decision Tree adalah model prediksi dengan struktur pohon atau struktur berhierarki. Decision Tree dapat digunakan untuk classification problem dan regression problem.
Decision tree terdiri dari :
- Decision Node yang merupakan feature/input variabel;
- Branch yang ditunjukkan oleh garis hitam berpanah, yang adalah rule/aturan keputusan, dan
- Leaf yang merupakan output/hasil.
Decision node paling atas dalam Decision Tree dikenal sebagai akar keputusan, atau feature utama yang menjadi asal mula percabangan. Jadi, Decision Tree membagi data ke dalam kelompok atau kelas berdasarkan feature/variable input, yang dimulai dari node paling atas (akar), dan terus bercabang ke bawah sampai dicapai cabang akhir atau leaf.
Pemodelan decision tree dapat menggunakan scikit-learn module, yaitu DecisionTreeClassifier.
Regression: Linear Regression
Regression merupakan metode statistik dan machine learning yang paling banyak digunakan. Seperti yang dijelaskan sebelumnya, regresi digunakan untuk memprediksi output label yang berbentuk numerik atau continuous value. Dalam proses training, model regresi akan menggunakan variabel input (features) dan variabel output (label) untuk mempelajari bagaimana hubungan/pola dari variabel input dan output.
Model regresi terdiri atas 2 tipe yaitu :
- Simple regression model → model regresi paling sederhana, hanya terdiri dari satu feature (univariate) dan 1 target.
- Multiple regression model → sesuai namanya, terdiri dari lebih dari satu feature (multivariate).
Adapun model regresi yang paling umum digunakan adalah Linear Regression.
Linear Regression digunakan untuk menganalisis hubungan linear antara dependent variabel (feature) dan independent variabel (label). Hubungan linear disini berarti bahwa jika nilai dari independen variabel mengalami perubahan baik itu naik atau turun, maka nilai dari dependen variabel juga mengalami perubahan (naik atau turun). Rumus matematis dari Simple Linear Regression adalah:
untuk Multiple Linear Regression:
dengan, y adalah target/label, X adalah feature, dan a,b adalah model parameter (intercept dan slope).
Perlu diketahui bahwa tidak semua problem dapat diselesaikan dengan Linear Regression. Untuk pemodelan dengan Linear Regression, terdapat beberapa asumsi yang harus dipenuhi, yaitu :
- Terdapat hubungan linear antara variabel input (feature) dan variabel output(label). Untuk melihat hubungan linear feature dan label, dapat menggunakan chart seperti scatter chart. Untuk mengetahui hubungan dari variabel umumnya dilakukan pada tahap eksplorasi data.
- Tidak ada multicollinearity antara features. Multicollinearity artinya terdapat dependency antara feature, misalnya saja hanya bisa mengetahui nilai feature B jika nilai feature A sudah diketahui.
- Tidak ada autocorrelation dalam data, contohnya pada time-series data.
Pemodelan Linear Regression menggunakan scikit-learn tidaklah sulit. Secara prosedur serupa dengan pemodelan Logistic Regression. Cukup memanggil LinearRegression dengan terlebih dahulu meng-import fungsi tersebut.
Regression Performance Evaluation
Performa regresi dapat diketahui dengan mengerahui berapa nilai erornya.
- Mean Squared Error (MSE) adalah rata-rata dari squared eror
- Root Mean Squared Error (RMSE) adalah akar kuadrat dari MSE
- Mean Absolute Error (MAE) adalah rata-rata dari nilai absolut eror
Semakin kecil nilai MSE, RMSE, dan MAE, semakin baik pula performansi model regresi. Untuk menghitung nilai MSE, RMSE dan MAE dapat dilakukan dengan menggunakan fungsi mean_squared_error(), mean_absolute_error() dari scikit-learn.metrics dan untuk RMSE sendiri tidak terdapat fungsi khusus di scikit-learn tapi dapat dengan mudah kita hitung dengan terlebih dahulu menghitung MSE kemudian menggunakan Numpy module yaitu, sqrt() untuk memperoleh nilai akar kuadrat dari MSE.
Unsupervised Learning — Algorithm
K-Means Clustering
K-Means merupakan tipe clustering dengan centroid based (titik pusat). Artinya kesamaan dari objek/sampel dihitung dari seberapa dekat objek itu dengan centroid atau titik pusat. Untuk menghitung kedekatan, digunakan perhitungan jarak antar 2 buah data atau jarak Minkowski.
xi , xj adalah dua buah data yang akan dihitung jaraknya, dan p = dimensi/jumlah dari data.
Terdapat beberapa tipe perhitungan jarak yang dapat digunakan, yaitu :
- Jarak Manhattan di mana g = 1
- Jarak Euclidean di mana g = 2
- Jarak Chebychev di mana g = ∞
Untuk menentukan centroid, pada awalnya perlu mendefinisikan jumlah centroid (K) yang diinginkan, misal jumlah K = 3; maka pada awal iterasi, algorithm akan secara random menentukan 3 centroid. Setelah itu, objek/sample/data point yang lain akan dikelompokkan sebagai anggota dari salah satu centroid yang terdekat, sehingga terbentuk 3 cluster data. Iterasi selanjutnya, titik-titik centroid di-update atau berpindah ke titik yang lain, dan jarak dari data point yang lain ke centroid yang baru dihitung kembali, kemudian dikelompokkan kembali berdasarkan jarak terdekat ke centroid yang baru. Iterasi akan terus berlanjut hingga diperoleh cluster dengan eror terkecil, dan posisi centroid tidak lagi berubah.
Measuring Cluster Criteria
Clustering yang baik adalah cluster yang data point-nya saling rapat/sangat berdekatan satu sama lain dan cukup berjauhan dengan objek/data point di cluster yang lain. Jadi, objek dalam satu cluster tidak tersebut berjauhan. Nah, untuk mengukur kualitas dari clustering, kita bisa menggunakan inertia. Inertia sendiri mengukur seberapa besar penyebaran object/data point data dalam satu cluster, semakin kecil nilai inertia maka semakin baik. Nilai inertia secara otomatis dapat dihitung oleh KMeans( ) ketika algorithm fit ke dataset. Untuk mengecek nilai inertia cukup dengan print fungsi .inertia_ dari model yang sudah fit ke dataset.
Meskipun suatu clustering dikatakan baik jika memiliki inertia yang kecil tetapi secara praktikal di keadaan sebenarnya, terlalu banyak cluster juga tidak diinginkan. Adapun aturan untuk memilih jumlah cluster yang optimal adalah dengan memilih jumlah cluster yang terletak pada “elbow” dalam intertia plot, yaitu ketika nilai inertia mulai menurun secara perlahan. Jika dilihat pada gambar maka jumlah cluster yang optimal adalah K = 3.
Mini Project
Mini project kali ini menggunakan data dari sebuah e-commerce. Data tersebut dapat memprediksi apakah user-user yang sedang mengunjungi halaman website yang baru akan mengklik banner promo (ads) di halaman tersebut atau tidak berdasarkan feature yang ada dengan menggunakan machine learning.
Data yang digunakan dapat dilihat di sini. Penjelasan per kolom dari data tersebut sebagai berikut :
- ‘Daily Time Spent on Site’: lama waktu user mengunjungi site (menit)
- ‘Age’: usia user (tahun)
- ‘Area Income’: rata — rata pendapatan di daerah sekitar user
- ‘Daily Internet Usage’ : rata — rata waktu yang dihabiskan user di internet dalam sehari (menit)
- ‘Ad Topic Line’ : topik/konten dari promo banner
- ‘City’ : kota dimana user mengakses website
- ‘Male’ : apakah user adalah Pria atau bukan
- ‘Country’ : negara dimana user mengakses website
- ‘Timestamp’ : waktu saat user mengklik promo banner atau keluar dari halaman website tanpa mengklik banner
- ‘Clicked on Ad’ : mengindikasikan user mengklik promo banner atau tidak (0 = tidak; 1 = klik).
Case Study: Promos for our e-commerce — Part 1
Langkah pertama adalah eksplorasi data.
#import libraryimport pandas as pd# Baca data 'ecommerce_banner_promo.csv'data = pd.read_csv('https://dqlab-dataset.s3-ap-southeast-1.amazonaws.com/pythonTutorial/ecommerce_banner_promo.csv')#1. Data eksplorasi dengan head(), info(), describe(), shapeprint("\n[1] Data eksplorasi dengan head(), info(), describe(), shape")print("Lima data teratas:")print(data.head())print("Informasi dataset:")print(data.info())print("Statistik deskriptif dataset:")print(data.describe())print("Ukuran dataset:")print(data.shape)
Case Study: Promos for our e-commerce — Part 2
Selanjutnya, data ekplorasi dengan mengecek korelasi antar kolom dan mengecek distribusi dari kolom Clicked on Ad.
#2. Data eksplorasi dengan dengan mengecek korelasi dari setiap feature menggunakan fungsi corr()print("\n[2] Data eksplorasi dengan dengan mengecek korelasi dari setiap feature menggunakan fungsi corr()")print(data.corr())#3. Data eksplorasi dengan mengecek distribusi label menggunakan fungsi groupby() dan size()print("\n[3] Data eksplorasi dengan mengecek distribusi label menggunakan fungsi groupby() dan size()")print(data.groupby('Clicked on Ad').size())
Case Study: Promos for our e-commerce — Part 3
Kemudian, data eksplorasi dengan visualisasi untuk melihat data rentang usia pada kolom Age dan visualisasi dari hubungan setiap kolom.
#import libraryimport matplotlib.pyplot as pltimport seaborn as sns# Seting: matplotlib and seabornsns.set_style('whitegrid')plt.style.use('fivethirtyeight')#4. Data eksplorasi dengan visualisasi#4a. Visualisasi Jumlah user dibagi ke dalam rentang usia (Age) menggunakan histogram (hist()) plotplt.figure(figsize=(10, 5))plt.hist(data['Age'], bins = data.Age.nunique())plt.xlabel('Age')plt.tight_layout()plt.show()#4b. Gunakan pairplot() dari seaborn (sns) modul untuk menggambarkan hubungan setiap feature.plt.figure()sns.pairplot(data)plt.show()
Case Study: Promos for our e-commerce — Part 4
Langkah kali ini bertujuan untuk mengecek apakah ada missing value dari data ini.
#5. Cek missing valueprint("\n[5] Cek missing value")print(data.isnull().sum().sum())
Jumlah Missing Value adalah 0. Sehingga, dapat langsung menuju ke langkah berikutnya.
Case Study: Promos for our e-commerce — Part 5
Machine learning yang digunakan pada data ini adalah logistic regression. Karena data yang digunakan kali ini bersifat diskrit.
Data yang digunakan pada model ini adalah data numerik. Karena logistic regression hanya dapat memproses variabel numerik.
#import libraryfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegression#6.Lakukan pemodelan dengan Logistic Regression, gunakan perbandingan 80:20 untuk training vs testingprint("\n[6] Lakukan pemodelan dengan Logistic Regression, gunakan perbandingan 80:20 untuk training vs testing")#6a.Drop Non-Numerical (object type) feature from X, as Logistic Regression can only take numbers, and also drop Target/label, assign Target Variable to y.X = data.drop(['Ad Topic Line','City','Country','Timestamp','Clicked on Ad'], axis = 1)y = data['Clicked on Ad']#6b. splitting the dataX_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)#6c. Modelling# Call the classifierlogreg = LogisticRegression()# Fit the classifier to the training datalogreg = logreg.fit(X_train,y_train)# Prediksi modely_pred = logreg.predict(X_test)#6d. Evaluasi Model Performanceprint("Evaluasi Model Performance:")print("Training Accuracy :", logreg.score(X_train, y_train))print("Testing Accuracy :", logreg.score(X_test, y_test))
Case Study: Promos for our e-commerce — Part 6
Langkah terakhir adalah mengecek performansi model yang telah dibuat menggunakan confusion matrix dan classification report.
# Import libraryfrom sklearn.metrics import confusion_matrix, classification_report#7. Print Confusion matrix dan classification reportprint("\n[7] Print Confusion matrix dan classification report")#apply confusion_matrix function to y_test and y_predprint("Confusion matrix:")cm = confusion_matrix(y_test, y_pred)print(cm)#apply classification_report function to y_test and y_predprint("Classification report:")cr = classification_report(y_test, y_pred)print(cr)
Dataset memiliki jumlah label yang seimbang pada kolom Clicked on Ad dan nilai accuracy sebesar 0.90. Sehingga, evaluasi performansi yang dapat digunakan adalah metrik accuracy.
Demikian hasil belajar saya pada modul Machine Learning With Python for Beginner yang saya pelajari di DQLab.
Terima kasih telah membaca.