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(

class SpamClassifier def __init__self selfvectorizer = CountVectorizer# 初始化特征提取器 selfclassifier = MultinomialNB# 初始化分类器 selftest_size = None # 初始化测试集所占比例 def evaluateself X

原文地址: https://www.cveoy.top/t/topic/g026 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录