🚓Praktikum 4
voting
Last updated
voting
Last updated
Download Dataset Terlebih Dahulu ⬇️
Pada kasus ini kita akan menggunakan salah satu metode stacking yaitu voting untuk mengklasifikasikan pasien penderita diabetes dengan beberapa ciri. Pasien akan di klasifikasikan menjadi pasien menderita diabetes (1) dan tidak menderita diabetes (0). Pertama-tama, kita akan menggunakan beberapa algoritma klasifikasi secara terpisah, yaitu Naive Bayes, SVM Linier, dan SVM RBF. Setelah itu, kita akan menggabungkan performa dari 3 algoritma tersebut dengan menggunakan metode ensemble voting.
import numpy as np
import pandas as pd
from sklearn.naive_bayes import GaussianNB # import Naive Bayes model Gaussian (asumsi data terdistribusi normal)
from sklearn.svm import SVC # import SVM classifier
from sklearn.ensemble import VotingClassifier # import model Voting
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
# Load Data
dbt = pd.read_csv('data/diabetes.csv')
dbt.head()
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI \
0 6 148 72 35 0 33.6
1 1 85 66 29 0 26.6
2 8 183 64 0 0 23.3
3 1 89 66 23 94 28.1
4 0 137 40 35 168 43.1
DiabetesPedigreeFunction Age Outcome
0 0.627 50 1
1 0.351 31 0
2 0.672 32 1
3 0.167 21 0
4 2.288 33 1
# Cek nama kolom
dbt.columns
Index(['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',
'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome'],
dtype='object')
# Cek kolom null
dbt.isnull().sum()
Pregnancies 0
Glucose 0
BloodPressure 0
SkinThickness 0
Insulin 0
BMI 0
DiabetesPedigreeFunction 0
Age 0
Outcome 0
dtype: int64
# Pada kasus ini, agak tidak masuk akal jika beberapa parameter bernilai 0
# sebagai contoh adalah nilai 'Glucose', 'BloodPlessure' ataupun 'Insulin'.
# Sekecil apapun nilainya, setiap manusia yang hidup pasti miliki nilai-nilai tersebut
# Kita akan manipulasi nilai yang 0 dengan melakukan 'imputasi' atau mengganti nilainya dengan nilai sintetis
# Pada kasus ini, kita akan menggunakan nilai mean
# Cek kolom neng nilai 0
feature_columns = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age']
for column in feature_columns:
print("============================================")
print(f"{column} ==> Missing zeros : {len(dbt.loc[dbt[column] == 0])}")
============================================
Pregnancies ==> Missing zeros : 111
============================================
Glucose ==> Missing zeros : 5
============================================
BloodPressure ==> Missing zeros : 35
============================================
SkinThickness ==> Missing zeros : 227
============================================
Insulin ==> Missing zeros : 374
============================================
BMI ==> Missing zeros : 11
============================================
DiabetesPedigreeFunction ==> Missing zeros : 0
============================================
Age ==> Missing zeros : 0
# Impute nilai 0 dengan mean
from sklearn.impute import SimpleImputer
fill_values = SimpleImputer(missing_values=0, strategy="mean", copy=False)
dbt[feature_columns] = fill_values.fit_transform(dbt[feature_columns])
X = dbt[feature_columns]
y = dbt.Outcome
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
Standarisasi Fitur
# Karena asumsi Gaussian NB adalah data terdistribusi secara normal,
# maka kita perlu melakukan standarisasi
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
# Standarisasi pada fitur di X_train dan X_test
X_train_std = sc.fit_transform(X_train)
X_test_std = sc.transform(X_test)
Training dan Evaluasi
# Buat obyek GaussianNB
gnb_std = GaussianNB()
# Fit dengan data yang telah di standarisasi
gnb_std.fit(X_train_std, y_train)
# Prediksi dengan data test
y_pred_gnb = gnb_std.predict(X_test_std)
# Evaluasi akurasi testing data
acc_gnb = accuracy_score(y_test, y_pred_gnb)
# Print hasil evaluasi
print("Test set accuracy: {:.2f}".format(acc_gnb))
print(f"Test set accuracy: {acc_gnb}")
Test set accuracy: 0.74
Test set accuracy: 0.7359307359307359
# Model SVM linier tanpa tunnning hyperparameter
svm_lin = SVC(kernel='linear')
# Fit ke model
svm_lin.fit(X_train_std, y_train)
# Prediksi
y_pred_svm_lin = svm_lin.predict(X_test_std)
# Evaluasi akurasi testing data
acc_svm_lin = accuracy_score(y_test, y_pred_svm_lin)
# Print hasil evaluasi
print("Test set accuracy: {:.2f}".format(acc_svm_lin))
print(f"Test set accuracy: {acc_svm_lin}")
Test set accuracy: 0.74
Test set accuracy: 0.7402597402597403
# Model SVM RBF tanpa tunnning hyperparameter
svm_rbf = SVC(kernel='rbf')
# Fit ke model
svm_rbf.fit(X_train_std, y_train)
# Prediksi
y_pred_svm_rbf = svm_rbf.predict(X_test_std)
# Evaluasi akurasi testing data
acc_svm_rbf = accuracy_score(y_test, y_pred_svm_rbf)
# Print hasil evaluasi
print("Test set accuracy: {:.2f}".format(acc_svm_rbf))
print(f"Test set accuracy: {acc_svm_rbf}")
Test set accuracy: 0.72
Test set accuracy: 0.7229437229437229
# Definisikan algoritma yang akan digunakan untuk voting
clf1 = GaussianNB()
clf2 = SVC(kernel='linear')
clf3 = SVC(kernel='rbf', probability=True)
# model hard voting
voting = VotingClassifier(estimators=[('GaussianNB', clf1), ('SVM-LIN', clf2), ('SVM-RBF', clf3)], voting='hard')
# Fit model
voting.fit(X_train_std, y_train)
# Prediksi
y_pred_vt1 = voting.predict(X_test_std)
# Evaluasi akurasi testing data
acc_vt1 = accuracy_score(y_test, y_pred_vt1)
# Print hasil evaluasi
print('Voting Hard')
print("Test set accuracy: {:.2f}".format(acc_vt1))
print(f"Test set accuracy: {acc_vt1}")
Voting Hard
Test set accuracy: 0.74
Test set accuracy: 0.7402597402597403