浅显易懂的机器学习(五)—— 模型选择及调优

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,5000CU*H 3个月
简介: 本文讲述了如何在机器学习中进行模型选择及调优

5 模型选择及调优

5.1 数据增强

有时候,你和你的老板说你数据不够,它是不会理你的。老板会发问:为什么你是做机器学习的要那么多数据干嘛,让机器去做不就行了。

对于这种问题有时候即使无语但你也不能正面拆穿,否则你的工作就不用干了。而为了解决数据集不足的问题,我们通常会采用数据增强

这个名词看似高大上,实际上就是把数据集经过某些变换,从而产生新的数据集。

这种方法多用于图片识别上,将图片结果左右对称变换,或反转,或偏移角度来达到拥有更多数据集的目的。

5.2 过拟合

统计学习的目的是使学到的模型不仅对已知数据而且对未知数据都能有很好的预测能力。不同的学习方法会给出不同的模型。当损失函数给定时,基于损失函数的模型的训练误差和模型的测试误差就自然成为学习方法评估的标准。注意,统计学习方法具体采用的损失函数未必是评估时使用的损失函数。当然,让两者一致是比较理想的。

训练误差的大小,对判断给定的问题是不是一个容易学习的问题是有意义的,但本质上不重要。测试误差反映了学习方法对未知的测试数据集的预测能力,是学习中的重要概念。显然,给定两种学习方法,测试误差小的方法具有更好的预测能力,是更有效的方法。

通常将学习方法对未知数据的预测能力称为泛化能力

当假设空间含有不同复杂度的模型时,就要面临模型选择的问题。我们希望选择或学习一个合适的模型。如果在假设空间中存在真模型,那么所选择的模型应该逼近真模型。具体地,所选择的模型要与真模型的参数个数相同,所选择的模型的参数向量与真模型的参数向量相近。

如果一味追求提高对训练数据的预测能力,所选模型的复杂度则往往会比真模型更高。这种现象称为过拟合。过拟合是指学习时选择的模型所包含的参数过多,以至于出现这一模型对已知数据预测的很好,但对未知数据预测得很差的现象。可以说模型选择旨在避免过拟合并提高模型的预测能力。

也就是说,上述的话翻译成人话就是,我们不要那种能够完全贴合训练集的函数,那种函数训练出来训练集在上面跑挺牛逼,一到测试集就不行了。我们需要的是那种在训练集跑的差不多,对于测试集跑出来效果也很好的那种函数。

image-20220306172629610

现在我们有以上的数据集,我们要选择一个模型去拟合真模型,也就是M=0时图中画的曲线,那条曲线即为真模型。当然了,根据我们上面所说,我们要的是做到“差不多”即可,我们不要精度完全一样或者超过真模型。

当我们M=1,选择的是一条直线,这种模型其实是罔顾事实的做法,我们完全不考虑拟合的效果,一上来就乱套模型,这样会导致拟合数据的效果贼差。这种在古老的文献中称为“欠拟合”现象。

当M=3时,我们选择的模型已经接近数据所对应的真模型了,已经几乎拟合了,这时候的模型符合测试误差最小的学习目的了。

当M=9时,这时候就是所谓的过拟合现象了,由于参数设置过多,导致这条曲线几乎穿过了我们已知的所有的数据点。的确,他对已知数据预测很好(穿过了嘛),但是他对未知数据却预测很差(说不定下一个点不在这条线上,这就导致前面预测很准,后面误差越来越大)。

简单来说,想解决过拟合,实际上无非就是选择复杂度适当的模型,以达到使测试误差最小的学习目的。我们常用的模型选择方法:正则化交叉验证。关于正则化的学习我们在后面的学习中会接触到,我们这里要提到的是关于交叉验证

5.3 交叉验证

交叉验证(cross validation)简单来说就是将拿到的训练数据,再次分为训练集和验证集。其中验证集和测试集的功能一样,都是对训练集训练出来的模型进行评估。而交叉验证方法就是将训练集划分为训练集+测试集,测试集通常占1份,而训练集占k-1份,通过四次测试,每次更换不同的验证集来达到在有限的数据集中得出不同精度,得出4组模型结果;得出结果后取平均值作为最终结果。我们把上述的做法称为K折交叉验证。

K折交叉验证示意图如下:

image-20220306173643643

虽然K折交叉验证能够在k均值算法中起到优化K值的效果,那么如何来选取K值呢?什么时候才是最好呢?这就要进入我们的下一小节了。

5.4 超参数搜索——网格搜索

通常情况下,有很多参数时需要手动指定的(如K-近邻算法中的K值),这种叫做超参数。但是手动指定不准且计算复杂,所以我们要对模型预设几种超参数组合,每组超参数都采用交叉验证来进行评估,最后选出最优参数组合建立模型。

知道原理了就是动手写代码的时刻,我们看一下sklearn中有哪些库供我们调用。

sklearn.model_selection.GridSearchCV(estimator,param_grid = None,cv = None)

该API可以对估计器的指定参数值进行详尽搜索

  • estimator:估计器对象
  • param——grid:估计器参数,对应到knn中可以传入多个k值建立多个模型,以此评估哪个模型最好,传入时要用字典形式,如{"n_neighbors":[1,3,5]}
  • cv:指定几折交叉验证,常用10折交叉验证

fit():输入训练数据

score():准确率

通过调用以下属性可以查看结果:

  • 最佳参数:best_params_
  • 最佳结果:best_score_
  • 最佳估计器:best_estimator_
  • 交叉验证结果:cv_results_

知道上面的原理,让我们对前一讲的KNN分类鸢尾花代码优化一下吧!

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV


def knn_iris():
    """用KNN算法对鸢尾花进行分类"""
    # 1 导入数据集
    iris = load_iris()

    # 2 划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)

    # 3 特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4 实例化KNN算法预估器
    estimator = KNeighborsClassifier()

    # 选用合适的K值来选择多个模型
    param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]}

    # 加入超参数网格搜索和交叉验证
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)
    estimator.fit(x_train, y_train)

    # 5 模型评估
    # 方法1 直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接对比真实值和预测值:\n", y_test == y_predict)

    # 方法2 计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)

    # 查看最佳参数
    print("KNN模型最佳参数:\n", estimator.best_params_)
    print("最佳结果:\n", estimator.best_score_)
    print("最佳估计器:\n", estimator.best_estimator_)
    print("交叉验证结果:\n", estimator.cv_results_)


# 调用方法
knn_iris()
目录
相关文章
|
13天前
|
机器学习/深度学习 数据采集 数据挖掘
实战派教学:掌握Scikit-learn,轻松实现数据分析与机器学习模型优化!
【10月更文挑战第4天】Scikit-learn凭借高效、易用及全面性成为数据科学领域的首选工具,简化了数据预处理、模型训练与评估流程,并提供丰富算法库。本文通过实战教学,详细介绍Scikit-learn的基础入门、数据预处理、模型选择与训练、评估及调优等关键步骤,助你快速掌握并优化数据分析与机器学习模型。从环境搭建到参数调优,每一步都配有示例代码,便于理解和实践。
64 2
|
3天前
|
机器人
1024 云上见 使用 PAI+LLaMA Factory 微调 Qwen2-VL 模型,搭建 “文旅领域知识问答机器人” 领精美计时器
1024 云上见 使用 PAI+LLaMA Factory 微调 Qwen2-VL 模型,搭建 “文旅领域知识问答机器人” 领精美计时器
39 3
|
10天前
|
机器学习/深度学习 数据采集 监控
如何使用机器学习模型来自动化评估数据质量?
【10月更文挑战第6天】如何使用机器学习模型来自动化评估数据质量?
|
1月前
|
机器学习/深度学习 人工智能 分布式计算
使用PAI+LLaMA Factory 微调 Qwen2-VL 模型,搭建文旅领域知识问答机器人
本次教程介绍了如何使用 PAI ×LLaMA Factory 框架,基于全参方法微调 Qwen2-VL 模型,使其能够进行文旅领域知识问答,同时通过人工测试验证了微调的效果。
|
1月前
|
机器学习/深度学习 算法 数据可视化
机器学习模型中特征贡献度分析:预测贡献与错误贡献
本文将探讨特征重要性与特征有效性之间的关系,并引入两个关键概念:预测贡献度和错误贡献度。
140 3
|
9天前
|
数据采集 移动开发 数据可视化
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
这篇文章介绍了数据清洗、分析、可视化、模型搭建、训练和预测的全过程,包括缺失值处理、异常值处理、特征选择、数据归一化等关键步骤,并展示了模型融合技术。
25 1
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
|
1天前
|
机器人
1024 云上见 使用 PAI+LLaMA Factory 微调 Qwen2-VL 模型,搭建 “文旅领域知识问答机器人” 领 200个 精美计时器等你领
1024 云上见 使用 PAI+LLaMA Factory 微调 Qwen2-VL 模型,搭建 “文旅领域知识问答机器人” 领 200个 精美计时器等你领
11 2
|
9天前
|
机器学习/深度学习 前端开发 网络架构
Django如何调用机器学习模型进行预测
Django如何调用机器学习模型进行预测
37 5
|
7天前
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
69 3
|
6天前
|
人工智能 算法 测试技术
PAI 大语言模型评测平台现已支持裁判员模型评测
本文将为您介绍如何在 PAI 大语言模型评测平台,基于裁判员模型,评价开源模型或者微调后模型的性能。该功能限时免费,欢迎使用。

相关产品

  • 人工智能平台 PAI