news 2026/10/17 6:44:57

机器学习之模型评估

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
机器学习之模型评估

模型评估

  1. 理论基础:

    • 欠拟合 (Underfitting):模型过于简单,无法捕捉数据真实规律(类比:学生没理解核心概念)。
      • 特征:训练误差和测试误差都高;模型复杂度不足;特征工程不充分。
    • 过拟合 (Overfitting):模型过于复杂,记住了训练数据的噪声和细节(类比:学生死记硬背,不会举一反三)。
  2. 数据处理:数据集划分

    核心原则:测试集必须完全独立,只能在最终评估时使用一次。

    • 训练集 (70%):用于训练模型参数,学习数据规律。
    • 验证集 (15%):用于调整超参数和模型选择,优化模型结构。
    • 测试集 (15%):用于最终评估模型性能,模拟真实应用场景【可选】。
    fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_split iris=load_iris()x=iris.data y=iris.target# 测试集(70%) + 临时集(30%)x_train,x_temp,y_train,y_temp=train_test_split(x,y,test_size=0.3,random_state=42)# 临时集(30%) = 验证集(15%) + 测试集(15%)x_val,x_test,y_val,y_test=train_test_split(x_temp,y_temp,test_size=0.5,random_state=42)
  3. 交叉验证:可靠的评估方法

    交叉验证主要用于模型评估、模型选择、超参数调优 和 生成OOF预测。

    目前而言,经常用于超参数调优(适用于任何场景)

    • 基本流程:
      • 数据分割:将数据分为K个等份
      • 循环训练:每次用K-1份进行训练
      • 轮流验证:每次用1份验证
      • 结果汇总:计算K次的平均值
    • 优势:充分利用有限数据、减少随机划分带来的偏差、获得更稳定的性能估计,适合小样本数据集。
    • K值选择:
      • K=5:常用默认值,平衡效率与准确性。
      • K=10:更精确,但计算成本较高。
      • K=N (LOOCV):留一交叉验证,适合极小数据集。
    fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_split,cross_val_scorefromsklearn.ensembleimportRandomForestClassifier iris=load_iris()x=iris.data y=iris.target x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=42)# 模型model=RandomForestClassifier(n_estimators=100,n_jobs=-1,random_state=42)# 执行K折交叉验证(在训练集上做!)# cv=5 表示5折交叉验证# scoring='accuracy' 表示评估指标为准确率cv_scores=cross_val_score(model,x_train,y_train,cv=5,scoring='accuracy')# 输出交叉验证结果print(f"各折准确率:{cv_scores}")# 打印每一折的得分print(f"平均准确率:{cv_scores.mean():.4f}")# 计算平均值print(f"标准差:{cv_scores.std():.4f}")# 计算标准差(越小说明模型越稳定)--------------------------------------------------------------------------------各折准确率:[0.958333330.958333330.833333331.0.95833333]平均准确率:0.9417标准差:0.0565最终测试集准确率:1.0000--------------------------------------------------------------------------------
  4. 分类模型的评估指标

    预测值:正类 (1)预测值:负类 (0)
    真实值:正类 (1)真正例 (TP)假负例 (FN)
    真实值:负类 (0)假正例 (FP)真负例 (TN)
    • 四大核心评估指标:

      指标名称定义计算公式适用场景与特点
      准确率 (Accuracy)正确预测的样本占总样本的比例。(TP + TN) / (TP + TN + FP + FN)适用于类别平衡的数据集。
      查准率 / 精确率 (Precision)预测为正类的样本中,真正为正类的比例。TP / (TP + FP)关注误报率。适合对“假正例”容忍度低、代价敏感的场景(如垃圾邮件拦截)。
      查全率 / 召回率 (Recall)真正为正类的样本中,被正确预测的比例。TP / (TP + FN)关注漏报率。适合需要高覆盖的场景(如地震预测、癌症筛查)。
      F1分数 (F1-Score)精确率和召回率的调和平均数,综合指标。2 * (Precision * Recall) / (Precision + Recall)平衡精确率和召回率的综合指标,尤其适合类别不平衡场景。
      fromsklearn.metricsimportaccuracy_score,precision_score,recall_score,f1_score# 计算各种分类指标accuracy=accuracy_score(y_true,y_pred)# 准确率 Accuracyprecision=precision_score(y_true,y_pred,average='weighted')# 查准率 Precisionrecall=recall_score(y_true,y_pred,average='weighted')# 查全率 Recallf1=f1_score(y_true,y_pred,average='weighted')# F1分数 F1-Score# 输出结果print(f"准确率(Accuracy):{accuracy:.4f}")print(f"查准率 / 精确率(Precision):{precision:.4f}")print(f"查全率 / 召回率(Recall):{recall:.4f}")print(f"F1分数(F1-Score):{f1:.4f}")
    • 基础工具:混淆矩阵(可视化分类结果)

      • 使用confusion_matrix(y_true, y_pred)计算混淆矩阵。
      • 使用classification_report(y_true, y_pred)生成包含精确率、召回率、F1分数及样本量的详细报告。
      fromsklearn.metricsimportconfusion_matrix,classification_report# 假设 y_true 为真实标签,y_pred 为模型预测标签# 1、计算混淆矩阵cm=confusion_matrix(y_true,y_pred)print("混淆矩阵:")print(cm)# 2、生成详细报告report=classification_report(y_true,y_pred,target_names=['负类','正类']# 指定类别名称,使报告更直观)print("\n分类报告:")print(report)
  5. 回归模型的评估指标

    • 三大核心评估指标

      指标名称定义计算公式特点与适用场景
      均方误差 (MSE)预测值与真实值差值的平方的平均值。MSE = Σ(y - ŷ)² / n对异常值敏感,数值较大。当需要惩罚大误差时使用。
      均方根误差 (RMSE)均方误差的平方根(预测值与真实值差值的平方的平均值的平方根)。RMSE = √[Σ(y - ŷ)² / n]或√MSE与原始数据单位相同,更易解释。对异常值敏感(因放大了大误差)。当需要惩罚大误差时使用。
      平均绝对误差 (MAE)预测值与真实值差值的绝对值的平均值。`MAE = Σy - ŷ
      R²决定系数模型解释的方差占总方差的比例。R² = 1 - SSE / SST取值0到1,越接近1越好。评估模型整体拟合优度,但不能单独使用,需结合其他指标。
      fromsklearn.metricsimportmean_squared_error,mean_absolute_error,r2_scoreimportnumpyasnp# 计算各种回归指标mse=mean_squared_error(y_true,y_pred)# 均方误差MSErmse=np.sqrt(mse)# 均方根误差RMSEmae=mean_absolute_error(y_true,y_pred)# 平均绝对误差MAEr2=r2_score(y_true,y_pred)# 决定系数R²# 输出结果print(f"均方误差(MSE):{mse:.4f}")print(f"均方根误差(RMSE):{rmse:.4f}")print(f"平均绝对误差(MAE):{mae:.4f}")print(f"R²分数:{r2:.4f}")
    • 可视化评估

      1. 预测值 vs 实际值散点图:
        • 理想情况下,点应该落在y=x线上,偏离程度反映预测误差。
      2. 残差图(Residual Plot):
        • 残差(真实值 - 预测值)应该随机分布在零附近。如果有明显的模式(如喇叭形、曲线形),则说明模型存在系统性偏差。
      3. 残差分布直方图:
        • 检查残差是否符合正态分布,以判断模型假设是否成立。
  6. 常见问题与解决方案

    常见问题核心表现(症状)避坑指南(对策)
    数据泄露预处理或特征工程时使用了测试集信息,导致评估结果虚高。严格分离数据,正确使用fit_transform(训练集)和transform(测试集)。
    过度依赖单一指标只看准确率(Accuracy),忽视了模型在其他维度的表现。使用多个互补指标(精确率、召回率、F1等),结合具体业务需求判断。
    测试集多次使用反复在测试集上调参、选特征,导致测试集变成了“验证集”。测试集仅用于最终评估,调参和模型选择必须使用交叉验证。
    忽视样本不平衡在类别极度不平衡的数据上仅看准确率(如99%正常邮件,全猜正常也99%)。使用F1分数、AUC-ROC等指标;
    采用重采样(SMOTE)或调整类别权重。
    过拟合 (Overfitting)训练误差极低,测试误差高。模型过于复杂,记住了噪声。增加数据量、正则化、降低模型复杂度。
    欠拟合 (Underfitting)训练误差和测试误差都很高。模型过于简单,没学到规律。增加模型复杂度、补充特征工程。
    K值选择不当K值过小(方差大),K值过大(计算成本高,留一法LOOCV成本极高)。在计算成本和评估准确性间权衡,K=5 或 K=10是最常用选择。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 6:44:47

用Python给自家WiFi做安全体检:从握手包抓取到弱密码检测

前两天有位读者在后台问我:用Python到底能不能把隔壁WiFi的密码跑出来?我盯着这条消息看了半天,第一个念头不是技术行不行,而是这事绝对不能碰。但转念一想,这个方向本身确实有巨大价值——只不过要把它放在合规的框架…

作者头像 李华
网站建设 2026/10/17 6:44:05

一根线的显相:人体拓扑论

—— 关于人体拓扑生长原理及未来仿生体路径的假说 本文为作者(道影子)基于内观体悟所提出的一个思想假说,非实证科学结论。文中涉及 "维性力网"" 人体拓扑 " 等概念,均为本体系内的自洽设定,供同…

作者头像 李华
网站建设 2026/10/17 6:44:04

内测分发折腾史:从微信传包到海哈游分发

做独立开发这几年,写代码的时间其实只占一半,另一半全耗在了“把包送到测试同学手里”这件事上。今天想聊聊内测分发这个看似不起眼、实则极其磨人的环节,以及我最终怎么用 海哈游分发 把这事儿理顺的。一、那些年我发内测包踩过的坑最开始&a…

作者头像 李华
网站建设 2026/10/17 6:39:29

基准测试的陷阱:优化掉、频率漂移、缓存预热

写基准测试的人最容易犯的错,不是代码写错,而是「测的根本不是你以为在测的东西」。一个累加循环可能被编译器按 as-if 规则整段删掉,让你测出「接近 0 秒」的假象;一次运行里 CPU 可能正忙着升频,下一次又在降频节流&…

作者头像 李华