基于支持向量机模型的性别判断系统

该系统使用支持向量机模型进行性别判断,用户可输入相关特征,获取预测结果。系统提供数据读取、标准化、模型构建和预测功能。

1. 数据读取和预处理

  • 用户需先读取数据文件,数据文件应包含相关特征,例如长发、前额宽度、前额高度、鼻子宽度、鼻子长度、嘴唇薄厚、鼻子到嘴唇的距离等。
  • 系统将对数据进行预处理,包括数据清洗、标准化等操作,以确保数据的完整性和一致性。

2. 模型构建

  • 系统使用支持向量机模型(SVM)进行性别判断。
  • 用户可以选择线性核函数或非线性核函数进行训练。
  • 系统将根据训练数据自动调整模型参数,以达到最佳预测效果。

3. 模型预测

  • 用户输入待预测的特征值,例如长发、前额宽度、前额高度、鼻子宽度、鼻子长度、嘴唇薄厚、鼻子到嘴唇的距离等。
  • 系统将使用训练好的模型对输入特征进行预测,并将结果输出给用户。

4. 模型评估

  • 系统将评估模型的预测精度、精确度、召回率和F1值,以评估模型的预测效果。

常见问题

Q:为什么用原数据集里的数据进行判断结果都是1?

A: 无法确定具体原因,可能是因为模型过拟合或者数据集不够全面、平衡导致的。建议尝试使用其他模型或者更全面、平衡的数据集进行训练和测试。

注意事项

  • 数据质量对模型预测效果至关重要,确保数据完整、准确、一致。
  • 尽量使用全面、平衡的数据集进行训练,以避免模型过拟合。
  • 可根据实际情况选择不同的模型和参数进行训练。

代码示例

# 对用户输入值的合法性判断
if data is None:
    messagebox.showerror('错误', '请先读取数据!')
    return

# 创建支持向量机模型
clf = svm.SVC(kernel='linear', C=1)

# 训练模型
clf.fit(X_train, Y_train)

Y_pred = clf.predict(X_test)
accuracy = accuracy_score(Y_test, Y_pred)
precision = precision_score(Y_test, Y_pred, average='macro')
recall = recall_score(Y_test, Y_pred, average='macro')
f1 = f1_score(Y_test, Y_pred, average='macro')
messagebox.showinfo('提示', f'支持向量机模型构建成功!\n模型预测准确率:{accuracy:.4%}\n模型精确度:{precision:.4%}\n模型召回率:{recall:.4%}\n模型F1值:{f1:.4%}')    
    

# 对数据进行预测
def predict_data():
    global data, scaler, clf
    def predict():
        global data, scaler, clf
        try:
            # 读取数据
            long_hair = long_hair_entry.get()
            forehead_width_cm = forehead_width_cm_entry.get()
            forehead_height_cm = forehead_height_cm_entry.get()
            nose_wide = nose_wide_entry.get()
            nose_long = nose_long_entry.get()
            lips_thin = lips_thin_entry.get()
            distance_nose_to_lip_long = distance_nose_to_lip_long_entry.get()
            predict_data = [[long_hair,forehead_width_cm,forehead_height_cm,nose_wide,nose_long,lips_thin,distance_nose_to_lip_long]]


            # 预测结果
            predict_result = clf.predict(predict_data)
            print(predict_result)
            
            predict_dict = {1:'男性', 0:'女性'}

            # 显示预测结果
            predict_result_window = tk.Toplevel(root)
            predict_result_window.title('模型判断结果')
            tk.Label(predict_result_window, text='性别判断结果:').grid(row=0, column=0, padx=10, pady=10)
            tk.Label(predict_result_window, text=predict_dict[predict_result[0]]).grid(row=0, column=1, padx=10, pady=10)
            
        except:
            messagebox.showerror('错误', '请确保输入值合法完整')
    
    if data is None:
        messagebox.showerror('错误', '请先读取数据!')
        return
    if scaler is None:
        messagebox.showerror('错误', '请先标准化数据!')
        return
    if clf is None:
        messagebox.showerror('错误', '请先构建决策树模型!')
        return
    
    
    window = tk.Tk()
    window.title('模型判断')

    # 创建文本输入框
    long_hair_entry = tk.Entry(window)
    forehead_width_cm_entry = tk.Entry(window)
    forehead_height_cm_entry = tk.Entry(window)
    nose_wide_entry = tk.Entry(window)
    nose_long_entry = tk.Entry(window)
    lips_thin_entry = tk.Entry(window)
    distance_nose_to_lip_long_entry = tk.Entry(window)

    # 创建标签
    long_hair_label = tk.Label(window, text='是否长发(0/1):')
    forehead_width_cm_label = tk.Label(window, text='前额宽度:')
    forehead_height_cm_label = tk.Label(window, text='前额高度:')
    nose_wide_label = tk.Label(window, text='是否鼻宽(0/1):')
    nose_long_label = tk.Label(window, text='是否鼻长(0/1):')
    lips_thin_label = tk.Label(window, text='是否嘴唇薄(0/1):')
    distance_nose_to_lip_long_label = tk.Label(window, text='鼻子到嘴唇的距离是否长(0/1):')

    # 将标签和文本输入框添加到窗口中
    long_hair_label.grid(row=0, column=0)
    long_hair_entry.grid(row=0, column=1)
    forehead_width_cm_label.grid(row=1, column=0)
    forehead_width_cm_entry.grid(row=1, column=1)
    forehead_height_cm_label.grid(row=2, column=0)
    forehead_height_cm_entry.grid(row=2, column=1)
    nose_wide_label.grid(row=3, column=0)
    nose_wide_entry.grid(row=3, column=1)
    nose_long_label.grid(row=4, column=0)
    nose_long_entry.grid(row=4, column=1)
    lips_thin_label.grid(row=5, column=0)
    lips_thin_entry.grid(row=5, column=1)
    distance_nose_to_lip_long_label.grid(row=6, column=0)
    distance_nose_to_lip_long_entry.grid(row=6, column=1)
    predict_button = tk.Button(window, text='开始判断', command=predict)
    predict_button.grid(row=7, column=0, columnspan=2)

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

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