# -*- coding: utf-8 -*-
"""Untitled29.ipynb

Automatically generated by Colab.

Original file is located at
    https://colab.research.google.com/drive/14VlNGbc_VXZx_6Wf6ocLWfwZmvk5puPl

**Logistik Regresi**
"""

# Import library yang dibutuhkan
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# Load dataset
df = pd.read_csv('parkinson.csv')
print(df.head())
print(df.info())

# Hapus kolom yang tidak relevan untuk klasifikasi
df = df.drop(columns=['PatientID', 'DoctorInCharge'])

# Cek distribusi kelas
print("Distribusi kelas:")
print(df['Diagnosis'].value_counts())

# Pisahkan fitur dan target
X = df.drop(columns=['Diagnosis'])  # Diagnosis sebagai target
y = df['Diagnosis']  # Menggunakan Diagnosis yang sudah numerik

# Split data menjadi data latih dan uji (80% latih, 20% uji) dengan stratifikasi
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# Latih model Regresi Logistik
model = LogisticRegression(max_iter=5000)
model.fit(X_train, y_train)

 # Prediksi dan evaluasi model
y_pred = model.predict(X_test)

# Akurasi Data Uji
test_accuracy = accuracy_score(y_test, y_pred)
print(f"Akurasi Data Uji: {test_accuracy * 100:.2f}%")

# Confusion Matrix
conf_matrix = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(conf_matrix)

# Classification Report
class_report = classification_report(y_test, y_pred)
print("Classification Report:")
print(class_report)

# Prediksi dan evaluasi model di data latih
y_train_pred = model.predict(X_train)
train_accuracy = accuracy_score(y_train, y_train_pred)

# Tampilkan hasil
print(f"Akurasi Data Latih: {train_accuracy * 100:.2f}%")
print(f"Akurasi Data Uji: {test_accuracy * 100:.2f}%")

"""**Naive Bayes**"""

# Import library yang dibutuhkan
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# Load dataset
df = pd.read_csv('parkinson.csv')

# Lihat beberapa data awal
print(df.head())
print(df.info())

# Hapus kolom yang tidak relevan untuk klasifikasi
df = df.drop(columns=['PatientID', 'DoctorInCharge'])

# Cek distribusi kelas
print("Distribusi kelas:")
print(df['Diagnosis'].value_counts())

# Pisahkan fitur dan target
X = df.drop(columns=['Diagnosis'])  # Diagnosis sebagai target
y = df['Diagnosis']  # Menggunakan Diagnosis yang sudah numerik

# Split data menjadi data latih dan uji (80% latih, 20% uji) dengan stratifikasi
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# Latih model Naive Bayes
model = GaussianNB()
model.fit(X_train, y_train)

# Prediksi dan evaluasi model
y_pred = model.predict(X_test)

# Akurasi Data Uji
test_accuracy = accuracy_score(y_test, y_pred)
print(f"Akurasi Data Uji: {test_accuracy * 100:.2f}%")

# Confusion Matrix
conf_matrix = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(conf_matrix)

# Classification Report
class_report = classification_report(y_test, y_pred)
print("Classification Report:")
print(class_report)

# Prediksi dan evaluasi model di data latih
y_train_pred = model.predict(X_train)
train_accuracy = accuracy_score(y_train, y_train_pred)

# Tampilkan hasil
print(f"Akurasi Data Latih: {train_accuracy * 100:.2f}%")
print(f"Akurasi Data Uji: {test_accuracy * 100:.2f}%")

"""**Random Forest**"""

# Import library yang dibutuhkan
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier  # Ganti dengan RandomForest
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# Load dataset
df = pd.read_csv('parkinson.csv')

#Lihat beberapa data awal
print(df.head())
print(df.info())

# Hapus kolom yang tidak relevan untuk klasifikasi
df = df.drop(columns=['PatientID', 'DoctorInCharge'])

# Cek distribusi kelas
print("Distribusi kelas:")
print(df['Diagnosis'].value_counts())

# Pisahkan fitur dan target
X = df.drop(columns=['Diagnosis'])  # Diagnosis sebagai target
y = df['Diagnosis']  # Menggunakan Diagnosis yang sudah numerik

# Split data menjadi data latih dan uji (80% latih, 20% uji) dengan stratifikasi
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# Latih model Random Forest
model = RandomForestClassifier(n_estimators=100, random_state=42)  # Model Random Forest
model.fit(X_train, y_train)

# Prediksi dan evaluasi model
y_pred = model.predict(X_test)

# Akurasi Data Uji
test_accuracy = accuracy_score(y_test, y_pred)
print(f"Akurasi Data Uji: {test_accuracy * 100:.2f}%")

# Confusion Matrix
conf_matrix = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(conf_matrix)

# Classification Report
class_report = classification_report(y_test, y_pred)
print("Classification Report:")
print(class_report)

# Prediksi dan evaluasi model di data latih
y_train_pred = model.predict(X_train)
train_accuracy = accuracy_score(y_train, y_train_pred)

# Tampilkan hasil
print(f"Akurasi Data Latih: {train_accuracy * 100:.2f}%")
print(f"Akurasi Data Uji: {test_accuracy * 100:.2f}%")

"""**Logistic Regression Setelah Tunning**

"""

# Import library yang dibutuhkan
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import (accuracy_score, confusion_matrix, classification_report,
                             roc_curve, auc, RocCurveDisplay)
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt

# Load dataset
df = pd.read_csv('parkinson.csv')

# Lihat beberapa data awal
print(df.head())
print(df.info())

# Hapus kolom yang tidak relevan
df = df.drop(columns=['PatientID', 'DoctorInCharge'])

# Cek distribusi kelas
print("Distribusi kelas:")
print(df['Diagnosis'].value_counts())

# Pisahkan fitur dan target
X = df.drop(columns=['Diagnosis'])
y = df['Diagnosis']

# Split data (80% latih, 20% uji) dengan stratifikasi
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# Scaling data
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# Hyperparameter tuning dengan GridSearchCV
param_grid = {
    'C': np.logspace(-5, 5, 10),
    'penalty': ['l1', 'l2'],
    'solver': ['liblinear', 'saga'],
    'max_iter': [1000],
    'class_weight': [None, 'balanced']
}

# Inisialisasi model Regresi Logistik
logreg = LogisticRegression()

# Mencari parameter terbaik menggunakan GridSearchCV
grid_search = GridSearchCV(estimator=logreg, param_grid=param_grid, scoring='accuracy', n_jobs=-1)
grid_search.fit(X_train, y_train)

# Gunakan model terbaik untuk prediksi
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)

# Evaluasi model
accuracy = accuracy_score(y_test, y_pred)
print(f"Akurasi: {accuracy * 100:.2f}%")

# Confusion Matrix
conf_matrix = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(conf_matrix)

# Ekstrak nilai TP, TN, FP, dan FN dari confusion matrix
TN, FP, FN, TP = conf_matrix.ravel()
print(f"True Positive (TP): {TP}")
print(f"True Negative (TN): {TN}")
print(f"False Positive (FP): {FP}")
print(f"False Negative (FN): {FN}")

# Classification Report
class_report = classification_report(y_test, y_pred)
print("Classification Report:")
print(class_report)

# Fit model dengan data latih
best_model.fit(X_train, y_train)

# Prediksi dan evaluasi model di data latih
y_train_pred = best_model.predict(X_train)
train_accuracy = accuracy_score(y_train, y_train_pred)

# Prediksi dan evaluasi model di data uji
y_test_pred = best_model.predict(X_test)
test_accuracy = accuracy_score(y_test, y_test_pred)

# Tampilkan hasil
print(f"Akurasi Data Latih: {train_accuracy * 100:.2f}%")
print(f"Akurasi Data Uji: {test_accuracy * 100:.2f}%")

# Hitung probabilitas untuk ROC
y_pred_prob = best_model.predict_proba(X_test)[:, 1]  # Probabilitas untuk kelas positif

# Hitung ROC curve
fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob)
roc_auc = auc(fpr, tpr)

# Tampilkan kurva ROC
plt.figure()
plt.plot(fpr, tpr, color='blue', label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='red', linestyle='--')  # Garis diagonal
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.grid()
plt.show()

"""**Naive Bayes Setelah Tunning**"""

# Import library yang dibutuhkan
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report, roc_curve, roc_auc_score

# Load dataset
df = pd.read_csv('parkinson.csv')

# Lihat beberapa data awal
print(df.head())
print(df.info())

# Hapus kolom yang tidak relevan untuk klasifikasi
df = df.drop(columns=['PatientID', 'DoctorInCharge'])

# Cek distribusi kelas
print("Distribusi kelas:")
print(df['Diagnosis'].value_counts())

# Pisahkan fitur dan target
X = df.drop(columns=['Diagnosis'])  # Diagnosis sebagai target
y = df['Diagnosis']

# Split data menjadi data latih dan uji (80% latih, 20% uji) dengan stratifikasi
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# Hyperparameter tuning dengan GridSearchCV
param_grid = {'var_smoothing': np.logspace(-12, -6, 7)}

# Inisialisasi model Naive Bayes
gnb = GaussianNB()

# Mencari parameter terbaik menggunakan GridSearchCV
grid_search = GridSearchCV(estimator=gnb, param_grid=param_grid, cv=5, scoring='accuracy', n_jobs=-1)
grid_search.fit(X_train, y_train)

# Gunakan model dengan parameter terbaik untuk prediksi
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)

# Evaluasi model
accuracy = accuracy_score(y_test, y_pred)
print(f"Akurasi: {accuracy * 100:.2f}%")

# Confusion Matrix
conf_matrix = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(conf_matrix)

TN, FP, FN, TP = conf_matrix.ravel()
print(f"True Positive (TP): {TP}")
print(f"True Negative (TN): {TN}")
print(f"False Positive (FP): {FP}")
print(f"False Negative (FN): {FN}")

# Classification Report
class_report = classification_report(y_test, y_pred)
print("Classification Report:")
print(class_report)

# Fit model dengan data latih
best_model.fit(X_train, y_train)

# Prediksi dan evaluasi model di data latih
y_train_pred = best_model.predict(X_train)
train_accuracy = accuracy_score(y_train, y_train_pred)

# Prediksi dan evaluasi model di data uji
y_test_pred = best_model.predict(X_test)
test_accuracy = accuracy_score(y_test, y_test_pred)

# Tampilkan hasil
print(f"Akurasi Data Latih: {train_accuracy * 100:.2f}%")
print(f"Akurasi Data Uji: {test_accuracy * 100:.2f}%")

# Hitung ROC dan AUC
y_scores = best_model.predict_proba(X_test)[:, 1]  # Ambil probabilitas untuk kelas positif
fpr, tpr, thresholds = roc_curve(y_test, y_scores)
auc = roc_auc_score(y_test, y_scores)

# Visualisasi ROC Curve
plt.figure(figsize=(10, 6))
plt.plot(fpr, tpr, color='blue', label='ROC Curve (AUC = {:.2f})'.format(auc))
plt.plot([0, 1], [0, 1], color='red', linestyle='--')  # Garis diagonal
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.grid()
plt.show()

"""**Random Forest Setelah Tunning**"""

# Import library yang dibutuhkan
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report, roc_curve, roc_auc_score

# Load dataset
df = pd.read_csv('parkinson.csv')

# Lihat beberapa data awal
print(df.head())
print(df.info())

# Hapus kolom yang tidak relevan untuk klasifikasi
df = df.drop(columns=['PatientID', 'DoctorInCharge'])

# Cek distribusi kelas
print("Distribusi kelas:")
print(df['Diagnosis'].value_counts())

# Pisahkan fitur dan target
X = df.drop(columns=['Diagnosis'])  # Diagnosis sebagai target
y = df['Diagnosis']  # Menggunakan Diagnosis yang sudah numerik

# Split data menjadi data latih dan uji (80% latih, 20% uji) dengan stratifikasi
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# Setup parameter grid untuk Grid Search
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [None, 10, 20, 30],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4],
    'max_features': [None, 'sqrt', 'log2']
}

# Inisialisasi RandomForestClassifier
rf = RandomForestClassifier(random_state=42)

# Inisialisasi GridSearchCV
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid,
                           cv=3, n_jobs=-1, verbose=2, scoring='accuracy')

# Fit model dengan Grid Search
grid_search.fit(X_train, y_train)

# Evaluasi model terbaik
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)

# Akurasi Data Uji
test_accuracy = accuracy_score(y_test, y_pred)
print(f"Akurasi Data Uji: {test_accuracy * 100:.2f}%")

# Confusion Matrix
conf_matrix = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(conf_matrix)

TN, FP, FN, TP = conf_matrix.ravel()
print(f"True Positive (TP): {TP}")
print(f"True Negative (TN): {TN}")
print(f"False Positive (FP): {FP}")
print(f"False Negative (FN): {FN}")

# Classification Report
class_report = classification_report(y_test, y_pred)
print("Classification Report:")
print(class_report)

# Prediksi dan evaluasi model di data latih
y_train_pred = best_model.predict(X_train)
train_accuracy = accuracy_score(y_train, y_train_pred)

# Tampilkan hasil
print(f"Akurasi Data Latih: {train_accuracy * 100:.2f}%")
print(f"Akurasi Data Uji: {test_accuracy * 100:.2f}%")

# Hitung ROC dan AUC
y_scores = best_model.predict_proba(X_test)[:, 1]  # Ambil probabilitas untuk kelas positif
fpr, tpr, thresholds = roc_curve(y_test, y_scores)
auc = roc_auc_score(y_test, y_scores)

# Visualisasi ROC Curve
plt.figure(figsize=(10, 6))
plt.plot(fpr, tpr, color='blue', label='ROC Curve (AUC = {:.2f})'.format(auc))
plt.plot([0, 1], [0, 1], color='red', linestyle='--')  # Garis diagonal
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.grid()
plt.show()