louiecerv commited on
Commit
08befbb
·
1 Parent(s): 3d81d0a

fixed the problem of the decision boundary plot

Browse files
Files changed (1) hide show
  1. app.py +25 -2
app.py CHANGED
@@ -7,6 +7,25 @@ from sklearn.model_selection import train_test_split
7
  from sklearn.svm import SVC
8
  from sklearn.metrics import confusion_matrix, classification_report
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  # Load the dataset
11
  st.title("SVM Kernel Performance Comparison")
12
 
@@ -39,7 +58,7 @@ if uploaded_file:
39
  y_pred = model.predict(X_test)
40
  cm = confusion_matrix(y_test, y_pred)
41
  cr = classification_report(y_test, y_pred, output_dict=True)
42
- return cm, cr
43
 
44
  # Streamlit tabs
45
  tab1, tab2, tab3 = st.tabs(["Linear Kernel", "Polynomial Kernel", "RBF Kernel"])
@@ -47,7 +66,7 @@ if uploaded_file:
47
  for tab, kernel in zip([tab1, tab2, tab3], ["linear", "poly", "rbf"]):
48
  with tab:
49
  st.write(f"## SVM with {kernel.capitalize()} Kernel")
50
- cm, cr = evaluate_svm(kernel)
51
 
52
  # Confusion matrix
53
  st.write("### Confusion Matrix")
@@ -62,6 +81,10 @@ if uploaded_file:
62
  st.write("### Classification Report")
63
  st.dataframe(pd.DataFrame(cr).transpose())
64
 
 
 
 
 
65
  # Explanation
66
  explanation = {
67
  "linear": "The linear kernel performs well when the data is linearly separable.",
 
7
  from sklearn.svm import SVC
8
  from sklearn.metrics import confusion_matrix, classification_report
9
 
10
+ # Function to visualize decision boundary
11
+ def visualize_classifier(classifier, X, y, title=''):
12
+ min_x, max_x = X[:, 0].min() - 1.0, X[:, 0].max() + 1.0
13
+ min_y, max_y = X[:, 1].min() - 1.0, X[:, 1].max() + 1.0
14
+ mesh_step_size = 0.01
15
+ x_vals, y_vals = np.meshgrid(np.arange(min_x, max_x, mesh_step_size),
16
+ np.arange(min_y, max_y, mesh_step_size))
17
+ output = classifier.predict(np.c_[x_vals.ravel(), y_vals.ravel()])
18
+ output = output.reshape(x_vals.shape)
19
+ fig, ax = plt.subplots()
20
+ ax.set_title(title)
21
+ ax.pcolormesh(x_vals, y_vals, output, cmap=plt.cm.gray, shading='auto')
22
+ ax.scatter(X[:, 0], X[:, 1], c=y, s=75, edgecolors='black', linewidth=1, cmap=plt.cm.Paired)
23
+ ax.set_xlim(x_vals.min(), x_vals.max())
24
+ ax.set_ylim(y_vals.min(), y_vals.max())
25
+ ax.set_xticks(np.arange(int(X[:, 0].min() - 1), int(X[:, 0].max() + 1), 1.0))
26
+ ax.set_yticks(np.arange(int(X[:, 1].min() - 1), int(X[:, 1].max() + 1), 1.0))
27
+ st.pyplot(fig)
28
+
29
  # Load the dataset
30
  st.title("SVM Kernel Performance Comparison")
31
 
 
58
  y_pred = model.predict(X_test)
59
  cm = confusion_matrix(y_test, y_pred)
60
  cr = classification_report(y_test, y_pred, output_dict=True)
61
+ return model, cm, cr
62
 
63
  # Streamlit tabs
64
  tab1, tab2, tab3 = st.tabs(["Linear Kernel", "Polynomial Kernel", "RBF Kernel"])
 
66
  for tab, kernel in zip([tab1, tab2, tab3], ["linear", "poly", "rbf"]):
67
  with tab:
68
  st.write(f"## SVM with {kernel.capitalize()} Kernel")
69
+ model, cm, cr = evaluate_svm(kernel)
70
 
71
  # Confusion matrix
72
  st.write("### Confusion Matrix")
 
81
  st.write("### Classification Report")
82
  st.dataframe(pd.DataFrame(cr).transpose())
83
 
84
+ # Decision boundary
85
+ st.write("### Decision Boundary")
86
+ visualize_classifier(model, X.to_numpy(), y.to_numpy(), title=f"Decision Boundary - {kernel.capitalize()} Kernel")
87
+
88
  # Explanation
89
  explanation = {
90
  "linear": "The linear kernel performs well when the data is linearly separable.",