机器学习模型评估中的常见陷阱:变量误用导致指标结果一致性问题解析

风静小哥_5900

风静小哥_5900

2025-10-26

933人浏览

原创

机器学习模型评估中的常见陷阱:变量误用导致指标结果一致性问题解析

在机器学习模型开发中,不同模型却产生完全相同的性能指标结果,这往往是由于代码中的细微错误所致。本文将深入分析一个典型的案例,揭示在模型评估阶段因变量引用不当而导致指标计算错误的问题,并提供正确的代码实现与最佳实践,帮助开发者避免此类陷阱,确保模型评估的准确性。

1. 机器学习项目初始化与数据准备

一个典型的机器学习项目从导入必要的库、加载数据、进行预处理,并最终划分数据集为训练集和测试集开始。以下是本教程中使用的初始化步骤。

1.1 导入必要的库

首先,导入所有将在项目中使用的Python库,包括数据处理、特征工程、模型构建和评估工具。

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from nltk.corpus import stopwords
from sklearn.metrics import accuracy_score, f1_score, classification_report
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB
from sklearn.preprocessing import LabelEncoder
import joblib
import tensorflow as tf
import numpy as np
from tensorflow.keras import models, layers
import warnings

warnings.filterwarnings('ignore') # 忽略警告信息,保持输出简洁

1.2 加载与初步处理数据集

本教程使用一个名为payload_mini.csv的数据集,其中包含文本payload和对应的label。我们首先加载数据,并根据attack_type字段筛选出sqli(SQL注入)攻击和norm(正常)流量的数据。

# 加载数据集,指定编码格式
df = pd.read_csv("payload_mini.csv", encoding='utf-16')

# 筛选出感兴趣的攻击类型和正常流量
df = df[(df['attack_type'] == 'sqli') | (df['attack_type'] == 'norm')]

# 划分特征X和目标Y
X = df['payload']
y = df['label']

1.3 特征向量化与数据集划分

机器学习模型通常无法直接处理原始文本数据,需要将其转换为数值特征。这里采用CountVectorizer将文本转换为词频向量。随后,我们将数据集划分为训练集和测试集,以便独立评估模型的泛化能力。为了确保结果的可复现性,我们设置了random_state参数。

# 使用CountVectorizer进行文本特征向量化,过滤低频词和高频词,并移除英文停用词
vectorizer = CountVectorizer(min_df=2, max_df=0.8, stop_words=stopwords.words('english'))
X = vectorizer.fit_transform(X.values.astype('U')).toarray()

# 划分训练集和测试集,测试集占总数据的20%
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

print(f"训练集特征形状: {X_train.shape}")
print(f"训练集标签形状: {y_train.shape}")
print(f"测试集特征形状: {X_test.shape}")
print(f"测试集标签形状: {y_test.shape}")

输出示例:

训练集特征形状: (8040, 1585)
训练集标签形状: (8040,)
测试集特征形状: (2011, 1585)
测试集标签形状: (2011,)

2. 模型训练与评估中的常见陷阱

在训练和评估多个机器学习模型时,一个常见的错误是变量管理不当,这可能导致不同模型的评估指标结果出现异常的一致性。本节将通过一个具体的案例来展示这种错误。

图片转Word
图片转Word

将扫描图像、截图或表单、文档及以文字为主的图片内容,转换为可编辑的 Word(.docx)文件。 当用户提供包含文本内容的图片,并要求将其转为 Word 文档时,应使用此技能; 或用户表达类似“把图片搞成 word 文字版”、“convert image to docx”、“extract text from image to Word”等需求时,也应调用此技能。

下载

2.1 朴素贝叶斯分类器评估

我们首先训练一个高斯朴素贝叶斯分类器,并计算其在测试集上的准确率和F1分数。

nb_clf = GaussianNB()
nb_clf.fit(X_train, y_train)
y_pred_nb = nb_clf.predict(X_test) # 将朴素贝叶斯的预测结果存储在y_pred_nb中

print(f"朴素贝叶斯分类器在测试集上的准确率: {accuracy_score(y_pred_nb, y_test)}")
print(f"朴素贝叶斯分类器在测试集上的F1分数 (pos_label='anom'): {f1_score(y_pred_nb, y_test, pos_label='anom')}")
print("\n朴素贝叶斯分类报告:")
print(classification_report(y_test, y_pred_nb))

输出示例:

朴素贝叶斯分类器在测试集上的准确率: 0.9806066633515664
朴素贝叶斯分类器在测试集上的F1分数 (pos_label='anom'): 0.9735234215885948

朴素贝叶斯分类报告:
              precision    recall  f1-score   support

        anom       0.97      0.98      0.97       732
        norm       0.99      0.98      0.98      1279

    accuracy                           0.98      2011
   macro avg       0.98      0.98      0.98      2011
weighted avg       0.98      0.98      0.98      2011

2.2 随机森林分类器评估(错误示例)

接下来,我们训练一个随机森林分类器。请仔细观察以下代码中的评估部分,它包含了一个常见的变量引用错误。

rf_clf = RandomForestClassifier(random_state=42) # 设置random_state以确保可复现性
rf_clf.fit(X_train, y_train)
y_pred_rf = rf_clf.predict(X_test) # 随机森林模型的预测结果存储在y_pred_rf中

# 错误的评估代码:在计算accuracy_score和f1_score时,不小心引用了前一个模型(朴素贝叶斯)的预测结果y_pred_nb
print(f"随机森林分类器在测试集上的准确率 (错误示例): {accuracy_score(y_pred_nb, y_test)}") # 错误地使用了y_pred_nb
print(f"随机森林分类器在测试集上的F1分数 (pos_label='anom') (错误示例): {f1_score(y_pred_nb, y_test, pos_label='anom')}") # 错误地使用了y_pred_nb
print("\n随机森林分类报告 (基于y_pred_rf):") # 注意:classification_report这里使用了正确的y_pred_rf
print(classification_report(y_test, y_pred_rf))

输出示例:

随机森林分类器在测试集上的准确率 (错误示例): 0.9806066633515664
随机森林分类器在测试集上的F1分数 (pos_label='anom') (错误示例): 0.9735234215885948

随机森林分类报告 (基于y_pred_rf):
              precision    recall  f1-score   support

        anom       1.00      0.96      0.98       73

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

word python csv sql注入

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4783

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

971

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1249

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6781

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3503

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6780

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9381

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1270

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1112

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程