import pandas as pd import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.svm import SVC from sklearn.metrics import roc_curve, auc import plotly.graph_objects as go # Create synthetic binary classification data X, y = make_classification(n_samples=1000, n_features=20, random_state=42) # Scale the data using StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # Split the data into train and test sets X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42) # Initialize the models knn = KNeighborsClassifier() rf = RandomForestClassifier() dt = DecisionTreeClassifier() svm = SVC(probability=True) # Fit the models on the train set knn.fit(X_train, y_train) rf.fit(X_train, y_train) dt.fit(X_train, y_train) svm.fit(X_train, y_train) # Predict probabilities on the test set knn_probs = knn.predict_proba(X_test)[:, 1] rf_probs = rf.predict_proba(X_test)[:, 1] dt_probs = dt.predict_proba(X_test)[:, 1] svm_probs = svm.predict_proba(X_test)[:, 1] # Calculate the false positive rate (FPR) and true positive rate (TPR) for ROC curve knn_fpr, knn_tpr, _ = roc_curve(y_test, knn_probs) rf_fpr, rf_tpr, _ = roc_curve(y_test, rf_probs) dt_fpr, dt_tpr, _ = roc_curve(y_test, dt_probs) svm_fpr, svm_tpr, _ = roc_curve(y_test, svm_probs) # Calculate the AUC (Area Under the Curve) for ROC curve knn_auc = auc(knn_fpr, knn_tpr) rf_auc = auc(rf_fpr, rf_tpr) dt_auc = auc(dt_fpr, dt_tpr) svm_auc = auc(svm_fpr, svm_tpr) # Create an interactive AUC/ROC curve using Plotly fig = go.Figure() fig.add_trace(go.Scatter(x=knn_fpr, y=knn_tpr, name='KNN (AUC = {:.2f})'.format(knn_auc))) fig.add_trace(go.Scatter(x=rf_fpr, y=rf_tpr, name='Random Forest (AUC = {:.2f})'.format(rf_auc))) fig.add_trace(go.Scatter(x=dt_fpr, y=dt_tpr, name='Decision Tree (AUC = {:.2f})'.format(dt_auc))) fig.add_trace(go.Scatter(x=svm_fpr, y=svm_tpr, name='SVM (AUC = {:.2f})'.format(svm_auc))) fig.update_layout(title='AUC/ROC Curve', xaxis=dict(title='False Positive Rate'), yaxis=dict(title='True Positive Rate'), legend=dict(x=0.7, y=0.2)) # Show plot fig.show()