Video SLCM-01
Module/Code SLCM-01: Pendahuluan Model Klasifikasi
Code dari lesson ini dapat di akses di Link berikut (wajib login ke Google/Gmail): Code SLCM-01 [Click Here]
Di link tersebut anda langsung bisa merubah code dan menjalankannya. Keterangan lebih lanjut di video yang disertakan. Sangat disarankan untuk membuka code dan video "side-by-side" untuk mendapatkan pengalaman belajar yang baik (Gambar dibawah). SIlahkan modifikasi (coba-coba) hal lain, selain yang ditunjukkan di video untuk mendapatkan pengalaman belajar yang lebih mendalam. Tentu saja juga silahkan akses berbagai referensi lain untuk memperkaya pengetahuan lalu diskusikan di forum yang telah disediakan.
Code Lesson SLCM-01 [Click Here]
Pendahuluan Data Mining
https://tau-data.id/course/adm/
Supervised Learning - Classification 01
https://tau-data.id/lesson/adm-classification-01/
(C) Taufik Sutanto
Outline Module:
- Pengantar ke Predictive Modelling
- Regresi Logistik
- Metrics Evaluasi dan Cross Validasi
- Confusion Matrix
- k-Nearest Neighbour
- Naive Bayes Classifier
Pendahuluan Klasifikasi¶
- Misal diberikan permasalahan terdapat dua buah kategori orange dan ungu seperti di gambar.
- Setiap titik di ganmbar adalah entitas dari data yang terdiri dari beberapa variabel.
- Jika diberikan titik baru (warna putih), maka masalah klasifikkasi adalah kemudian menggolongkan data baru ini ke kategori titik Orange atau Ungu.
Klasifikasi dengan Model Regresi Logistik¶
- Mencari garis lurus yang sedemikian sehingga kesalahan prediksinya sekecil mungkin (lihat gambar)
Regresi Logistik¶
- Awalnya regresi logistik adalah metode klasifikasi binary: membedakan antara 2 kelas atau kategori.
- Masalah klasifikasi binary contohnya memprediksi seseorang terkena "kanker" atau "tidak kanker", kanker jinak/ganas, fraud atau bukan fraud (pada transaksi keuangan), negatif/positif dalam sentimen analisis, dsb.
- Regresi logistik adalah pengembangan dari model regresi liniear, namun di konversi ke masalah klasifikasi.
Regresi Logistik¶
- http://www.saedsayad.com/logistic_regression.htm
- Makna fungsi logarithm?
- Konsekuensi dari rumus $\beta$ diatas?
- Asumsi?
Kaitan Regresi Logistik dan Neural Network/Deep Learning¶
Logistic Linear Regression¶
Over Fitting?¶
Regularization
- Misal $\beta$ ==> $w$
- Di perumusan regresi logistik awal, ada kemungkinan beta akan selalu positif dan besar (walau mungkin variabelnya kurang/tidak signifikan menerangkan variabel target ~ y).
- Untuk mencegah hal ini (~over fitting), model supervised learning (klasifikasi) menggunakan teknik regulerisasi.
- Konsep Regularisasi tidak hanya digunakan dalam regresi logistik, namun juga model lain seperti SVM, JST, Deep Learning, dll.
- Memahami konsep ini akan sangat bermanfaat di Data Science.
- Misal E(w) adalah fungsi error/loss function yang sudah kita sebelumnya dan $t_n$ adalah nilai sesungguhnya, maka regulerisasi dilakukan dengan mengoptimalkan fungsi berikut ini:
Diskusi¶
- Regresi Logistik tidak dapat mengolah data yang mengandung "missing values"/null, mengapa?
- Jika kita merubah persamaannya (misal dengan mencoba berbagai transformasi variabel) sedemikian sehingga didapatkan model yang sedikit lebih baik (akurasinya) dibandingkan model yang lebih sederhana, apakah kita akan menggunakan model tersebut? Mengapa?
- Seperti regresi linear, apakah kita perlu standarisasi/scaling data?
Contoh Aplikasi¶
- Data klasifikasi bunga Iris sebagai studi kasus sederhana
- Link data: https://archive.ics.uci.edu/ml/datasets/iris
- Paper sumber data: Fisher,R.A. "The use of multiple measurements in taxonomic problems" Annual Eugenics, 7, Part II, 179-188 (1936); also in "Contributions to Mathematical Statistics" (John Wiley, NY, 1950).
- Masalah klasifikasinya adalah mengklasifikasikan jenis Bunga Iris berdasarkan bentuk (e.g. panjang dan lebar) bunga.
In [1]:
import seaborn as sns
import pandas as pd
import warnings
warnings.simplefilter('ignore')
# load the iris data
df = sns.load_dataset("iris")
g = sns.pairplot(df, hue="species")
In [2]:
df.sample(7)
Out[2]:
In [3]:
df.describe()
Out[3]:
In [4]:
# Data ini bukan murni Binary Classification
# Kita akan ambil sebagiannya untuk menjadikannya masalah binary classification
set(df['species'].values)
Out[4]:
In [5]:
# Bentuk data binary dari sini menggunakan teknik di Modul 03: EDA
# Disimpan dalam variabel baru "df_bin"
df_bin = df[df["species"].isin(['setosa','versicolor']) ]
set(df_bin['species'].values)
Out[5]:
In [6]:
df_bin.sample(7)
Out[6]:
Pisahkan menjadi training dan Test Data seperti Module sebelumnya¶
In [7]:
from sklearn.model_selection import train_test_split
#df = sns.load_dataset("iris")
X_train, X_test, y_train, y_test = train_test_split(df_bin[['sepal_length', 'sepal_width','petal_length','petal_width']],
df_bin['species'], test_size=0.5)
print(X_train.shape, X_test.shape)
Pemodelan Regresi Logistik menggunakan Python (module SciKit-Learn)¶
In [8]:
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression().fit(X_train, y_train)
In [9]:
clf
Out[9]:
Prediksi ke data Test¶
In [10]:
y_reglog = clf.predict(X_test)
y_reglog
Out[10]:
Seberapa "baik" prediksi ini? = Akurasi/Evaluasi Model¶
In [11]:
# Pertama-tama Kita gunakan metric/pengukuran yang umum
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_reglog)
Out[11]:
contoh data lain: Data Klasifikasi Kanker¶
- Dapat diunduh dari link ini: https://goo.gl/U2Uwz2
- Link scikit utk datanya: https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_breast_cancer.html#sklearn.datasets.load_breast_cancer
In [12]:
from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
type(data), dir(data)
Out[12]:
In [13]:
X = data.data
print(type(X), X.shape)
X[:3]
Out[13]:
In [14]:
Y = data.target
print(type(Y), Y.shape)
print(data.target_names)
Y[-10:]
Out[14]:
In [15]:
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.5, random_state=99)
print(X_train.shape, X_test.shape)
In [16]:
clf = LogisticRegression().fit(X_train, y_train)
y_reglog = clf.predict(X_test)
accuracy_score(y_test, y_reglog)
# Masih "mudah", namun lebih baik dari sebelumnya
Out[16]:
In [17]:
dir(clf)
Out[17]:
In [18]:
# Persamaannya? (ada 30 variabel)
clf.coef_
Out[18]:
Confusion Matrix
- sensitivity, recall, hit rate, or true positive rate (TPR)
- precision or positive predictive value (PPV)
- Yang mana kategori yang "positif"?
- $0\leq F\leq 1$, 1 optimal value
- $0\leq\beta< \inf$
- beta < 1 lends more weight to precision,
- beta > 1 favors recall
- beta -> 0 considers only precision
- beta -> inf only recall
Metric Evaluasi yang lain¶
http://scikit-learn.org/stable/modules/model_evaluation.html¶
Aplikasi di Python untuk metrics diatas:¶
In [19]:
from sklearn.metrics import precision_score, recall_score, f1_score
print('presisi = ', precision_score(y_test, y_reglog))
print('Recall = ', recall_score(y_test, y_reglog))
print('f1_score = ', f1_score(y_test, y_reglog))
Atau ...¶
In [20]:
from sklearn.metrics import confusion_matrix, classification_report
print(confusion_matrix(y_test, y_reglog))
print(classification_report(y_test, y_reglog))
Evaluasi yang kita lakukan belum cukup valid/objektif ... Mengapa?¶
Cross Validation
In [21]:
# Cross validation
# Perhatikan variabelnya, kita sekarang menggunakan seluruh data
# http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html
from sklearn.model_selection import cross_val_score
import time
mulai = time.time()
scores_regLog = cross_val_score(clf, X, Y, cv=10) # perhatikan sekarang kita menggunakan seluruh data
waktu = time.time() - mulai
# Interval Akurasi 95 CI
print("Accuracy Regresi Logistik: %0.2f (+/- %0.2f), Waktu = %0.3f detik" % (scores_regLog.mean(), scores_regLog.std() * 2, waktu))
In [22]:
# Kita juga bisa menampilkan BoxPlotnya untuk mendapatkan informasi yang lebih lengkap
%matplotlib inline
import matplotlib.pyplot as plt; plt.style.use('classic')
import seaborn as sns; sns.set()
df = pd.DataFrame({'Regresi Logistik':scores_regLog})
sns.boxplot(data=df)
plt.show()
In [23]:
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
set(y) # 3 Kategori
Out[23]:
In [24]:
X.shape # 4 variabel, 150 baris
Out[24]:
In [25]:
clf = LogisticRegression(multi_class='ovr').fit(X, y)
clf.coef_
# Perhatikan ada 3 persamaan
Out[25]:
Naive Bayes Classifier¶
- P(x) konstan, sehingga bisa diabaikan.
- Asumsi terkuatnya adalah independensi antar variabel prediktor (sehingga dikatakan "Naive")
- Klasifikasi dilakukan dengan menghitung probabilitas untuk setiap kategori ketika diberikan data x = (x1,x2,...,xm)
- Untuk data yang besar bisa menggunakan out-of-core approach (partial fit):
http://scikit-learn.org/stable/modules/scaling_strategies.html#scaling-strategies - Variasi NBC adalah bagaimana P(c|x) dihitung, misal dengan distribusi Gaussian (Normal) - sering disebut sebagai Gaussian Naive Bayes (GNB):
Pros:
- Cepat dan mudah di implementasikan
- Cocok untuk permasalahan multiclass
- Jika asumsi terpenuhi (independent) biasanya performanya cukup baik dan membutuhkan data (training) yang lebih sedikit.
- Biasanya baik digunakan untuk prediktor kategorik, untuk numerik NBC mengasumsikan distribusi normal (terkadang tidak terpenuhi)
Cons:
- Jika di test data memuat kategori yang tidak ada di training data ( ==> probabilitas = 0). Sering disebut sebagai masalah “Zero Frequency”.
- Asumsi yang sangat kuat (independen antar prediktor).
Naive Bayes in Social Media Analytics¶
- Sentiment Analysis
- Topic Modelling
In [26]:
# Naive Bayes: http://scikit-learn.org/stable/modules/naive_bayes.html
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
nbc = gnb.fit(X_train, y_train)
nbc_prediction = nbc.predict(X_test)
print('Akurasi = ', accuracy_score(y_test, nbc_prediction))
print(confusion_matrix(y_test, nbc_prediction))
print(classification_report(y_test, nbc_prediction))
# Hati-hati Sparse ==> Dense bisa memenuhi memory untuk data relatif cukup besar
# Akurasi cukup baik
k-Nearest Neighbour¶
k-Nearest Neighbour
- Classifier yang paling sederhana, namun dapat juga digunakan untuk regresi (dan bahkan clustering).
- Sering disebut sebagai Instance based Learner
- Tidak memiliki "persamaan", pendekatannya lebih ke algoritmik berdasarkan konsep jarak/similarity
- Mirip konsep DBSCAN
k-NN Neighbour Size
- Pros:
-
- Relatif cepat (efisien) untuk data yang tidak terlalu besar
- Sederhana, mudah untuk diimplementasikan
- Mudah untuk di modifikasi: Berbagai macam formula jarak/similaritas
- Menangani data Multiclass dengan mudah
- Akurasi cukup baik jika data representatif
- Cons:
-
- Menemukan nearest neighbours tidak efisien untuk data besar
- Storage of data
- Meyakinkan rumus jarak yang tepat
Similarity (Distance)¶
- Euclidean (“straight line”, distance between two points)
- Manhattan (sum of absolute differences of all attributes)
- Maximal (greatest of absolute differences between attributes)
d(x,y) = max{|x_i-y_i|, i =1,2,...,n} - Mahalanobis (distance between point and distribution).
Euclidean Distance
Manhattan Distance
Similarity explained in plain terms and its application in Python¶
http://dataaspirant.com/2015/04/11/five-most-popular-similarity-measures-implementation-in-python/¶
The Weights in k-NN:
- Uniform: all points in each neighborhood are weighted equally.
- Distance: closer neighbors of a query point have a greater influence than the neighbors further away.
Aplikasi di Python¶
In [27]:
# k-NN: http://scikit-learn.org/stable/modules/neighbors.html
from sklearn import neighbors
n_neighbors = 3
weights = 'distance'
kNN = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
kNN.fit(X_train, y_train)
print('Done!')
In [28]:
# Prediksi dengan k-NN
y_kNN = kNN.predict(X_test)
y_kNN[-10:]
Out[28]:
In [29]:
# Akurasi
accuracy_score(y_test, y_kNN)
Out[29]:
In [30]:
# Cross Validasi
del kNN
kNN = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
mulai = time.time()
scores_kNN = cross_val_score(kNN, X, y, cv=10) # perhatikan sekarang kita menggunakan seluruh data
waktu = time.time() - mulai
# Interval Akurasi 95 CI
print("Accuracy kNN: %0.2f (+/- %0.2f), Waktu = %0.3f detik" % (scores_kNN.mean(), scores_kNN.std() * 2, waktu))
Membandingkan model-model yang sudah kita bahas sejauh ini¶
- Code-nya bisa dimodifikasi sedikit untuk perbandingan model yang lain atau data yang lain
In [31]:
# Model Comparisons using Cross Validation
df = sns.load_dataset("iris")
X = df[['sepal_length','sepal_width','petal_length','petal_width']]
Y = df['species']
Models = [('Regresi Logistik',clf), ('k-NN',kNN), ('Naive Bayes',gnb)]
Scores = {}
for model_name, model in Models:
if model_name=='Naive Bayes':
Scores[model_name] = cross_val_score(model, X.values, Y, cv=10,scoring='accuracy')
else:
Scores[model_name] = cross_val_score(model, X, Y, cv=10,scoring='accuracy')
dt = pd.DataFrame.from_dict(Scores)
ax = sns.boxplot(data=dt)
End of Module
Referensi
- Aggarwal, C. C. (2015). Data mining: the textbook. Springer.
- Cabena, P. Hadjinian, R. Stadler, J. Verhees, and A. Zanasi. Discovering Data Mining: From Concept to Implementation. IBM, 1997
- Fayyad, G. Piatetsky-Shapiro, and P. Smith. From data mining to knowledge discovery. AI Magzine,Volume 17, pages 37-54, 1996.
- Barry, A. J. Michael & Linoff, S. Gordon. 2004. Data Mining Techniques. Wiley Publishing, Inc. Indianapolis : xxiii + 615 hlm.
- Hand, David etc. 2001. Principles of Data Mining. MIT Press Cambridge, Massachusetts : xxvii + 467 hlm.
- Hornick, Mark F., Marcade, Erik & Vankayala, Sunil. 2007. Java Data Mining: Strategy,Standard, and Practice. Morgan Kaufman. San Francisco : xxi + 519 hlm.
- Tang, ZhaoHui & Jamie, MacLennan. 2005. Data Mining with SQL Server 2005. Wiley Publishing, Inc. Indianapolis : xvii + 435 hal
- Bishop, C. M. (2006). Pattern recognition and machine learning. springer.
- Yang, X. S. (2019). Introduction to Algorithms for Data Mining and Machine Learning. Academic Press.
- Simovici, D. (2018). Mathematical Analysis for Machine Learning and Data Mining. World Scientific Publishing Co., Inc..
- Zheng, A. (2015). Evaluating machine learning models: a beginner’s guide to key concepts and pitfalls.
- Mitchell, T. M. (1997). Machine learning. 1997. Burr Ridge, IL: McGraw Hill, 45(37), 870-877.
- Jason Brownlee: A Gentle Introduction to XGBoost for Applied Machine Learning. Mach. Learn. Mastery. (2016).
- Ketkar, N.: Deep Learning with Python. (2017). https://doi.org/10.1007/978-1-4842-2766-4.
Tidak ada komentar:
Posting Komentar
Relevant & Respectful Comments Only.