0

0

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

DDD

DDD

发布时间:2025-10-26 10:26:01

|

893人浏览过

|

来源于php中文网

原创

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

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

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. 模型训练与评估中的常见陷阱

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

宣小二
宣小二

宣小二:媒体发稿平台,自媒体发稿平台,短视频矩阵发布平台,基于AI驱动的企业自助式投放平台。

下载

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

771

2023.10.12

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

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

329

2023.10.27

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

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

350

2024.02.23

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

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

1324

2024.03.06

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

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

362

2024.03.06

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

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

901

2024.04.07

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

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

581

2024.04.29

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

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

425

2024.04.29

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号