class SpamClassifier def __init__self selfvectorizer = CountVectorizer# 初始化特征提取器 selfclassifier = MultinomialNB# 初始化分类器 selftest_size = None # 初始化测试集所占比例 def evaluateself X
import tkinter as tk from tkinter import ttk from sklearn.metrics import precision_score, recall_score, f1_score, accuracy_score from tkinter import messagebox
class App: def init(self, master): self.master = master self.master.title("垃圾邮件分类器") self.master.geometry("1000x700") self.classifier = SpamClassifier()
# 创建下拉框
self.chart_type = tk.StringVar(self.master)
self.chart_type.set("选择图表类型")
self.chart_dropdown = ttk.Combobox(self.master, textvariable=self.chart_type,
values=["选择图表类型", "邮件分类饼图", "混淆矩阵", "ROC曲线"])
self.chart_dropdown.pack(pady=20)
# 创建按钮
self.generate_button = tk.Button(self.master, text="生成图表", command=self.generate_chart)
self.generate_button.pack(pady=10)
# 创建画布
self.canvas = tk.Canvas(self.master, width=800, height=400)
self.canvas.pack(pady=20)
# 创建混淆矩阵文本框
self.cm_text = tk.Text(self.master, height=10)
self.cm_text.pack(pady=20)
# 创建弹窗
self.result_window = None
def show_pie_chart(self):
counts = dict(Counter(self.classifier.y))
labels = ['ham', 'spam']
values = [counts['ham'], counts['spam']]
test_size = self.classifier.test_size
fig, ax = plt.subplots()
ax.pie(values, labels=labels, autopct='%1.1f%%')
ax.set_title(f"Message classification scale (test size: {test_size})")
canvas = FigureCanvasTkAgg(fig, master=self.canvas)
canvas.draw()
self.plot = canvas.get_tk_widget()
self.plot.pack()
def generate_chart(self):
chart_type = self.chart_type.get()
if chart_type == '选择图表类型':
messagebox.showerror('错误', '请选择一种图表类型')
return
elif chart_type == '邮件分类饼图':
self.show_pie_chart()
elif chart_type == '混淆矩阵':
self.show_confusion_matrix()
elif chart_type == 'ROC曲线':
self.generate_roc_curve()
def show_confusion_matrix(self):
X_train, X_test, y_train, y_test = self.classifier.split_data()
cm, report = self.classifier.evaluate(self.classifier.vectorizer.transform(X_test), y_test)
self.cm_text.insert(tk.END, '混淆矩阵:\n')
self.cm_text.insert(tk.END, str(cm))
self.cm_text.insert(tk.END, '\n分类报告:\n')
self.cm_text.insert(tk.END, str(report))
test_size = self.classifier.test_size
fig, ax = plt.subplots()
im = ax.imshow(cm)
ax.set_xticks([0, 1])
ax.set_yticks([0, 1])
ax.set_xticklabels(['ham', 'spam'], fontsize=14)
ax.set_yticklabels(['ham', 'spam'], fontsize=14)
ax.set_xlabel('Predicted labels', fontsize=14)
ax.set_ylabel('True labels', fontsize=14)
ax.set_title(f"Confusion Matrix (test size: {test_size})", fontsize=18)
sns.heatmap(cm, cmap="Blues", annot=True, fmt='g', annot_kws={"size": 16}, cbar=False)
canvas = FigureCanvasTkAgg(fig, master=self.canvas)
canvas.draw()
self.plot = canvas.get_tk_widget()
self.plot.pack()
def show_metrics(self):
X_train, X_test, y_train, y_test = self.classifier.split_data()
y_pred = self.classifier.classifier.predict(self.classifier.vectorizer.transform(X_test))
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
accuracy = accuracy_score(y_test, y_pred)
# 创建新窗口
self.result_window = tk.Toplevel(self.master)
self.result_window.title("分类指标")
self.result_window.geometry("400x200")
# 显示分类指标
tk.Label(self.result_window, text=f"Precision: {precision:.3f}").pack(pady=10)
tk.Label(self.result_window, text=f"Recall: {recall:.3f}").pack(pady=10)
tk.Label(self.result_window, text=f"F1-score: {f1:.3f}").pack(pady=10)
tk.Label(self.result_window, text=f"Accuracy: {accuracy:.3f}").pack(pady=10)
def generate_roc_curve(self):
pass
root = tk.Tk() app = App(root) root.mainloop(
原文地址: https://www.cveoy.top/t/topic/g026 著作权归作者所有。请勿转载和采集!