【机器学习】模型的训练和评估(理论+图解)

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,5000CU*H 3个月
简介: 【机器学习】模型的训练和评估(理论+图解)

简 介:下面是我在学习时候的记录并加上自己的理解。本文意在记录自己近期学习过程中的所学所得,如有错误,欢迎大家指正。

 

关键词:Python、机器学习

一、K折交叉验证

  有的时候我们将数据分为训练集和测试集,但是可能不太科学,会有很大的偶然性在里面,如果划分不同可能存在不同的结果,所以为了增强模型的泛化能力,我们将数据分成k份,其中的k-1份作为训练集,剩余的1份作为测试集,这样就会存在10组数据集,我们就可以得到10组结果,然后取10组的平均值作为我们的模型结果。

1.K-fold

  在sklearn的model_selection模块就集成了这个算法,它是随机不放回的进行切分数据集,不会产生重复的数据。

代码实现:

from sklearn.datasets import load_iris
from sklearn import metrics
from sklearn.model_selection import KFold
from sklearn.model_selection import StratifiedKFold
from sklearn.tree import DecisionTreeClassifier
import numpy as np
X,y=load_iris(return_X_y=True)
# 定义分割器
kf=KFold(n_splits=10) 
# 定义模型
model=DecisionTreeClassifier()
# 用于保存每折的分数
scores=[]
for i,(train_index,test_index) in enumerate(kf.split(X)):
    model.fit(X[train_index],y[train_index])
    y_pred=model.predict(X[test_index])
    # 评估模型分数
    accuracy=metrics.accuracy_score(y[test_index],y_pred)
    scores.append(accuracy)
    print("Fold:{} accuracy:{:.4f}".format(i+1,accuracy))
print("平均accuracy:{}".format(np.mean(scores)))
  • KFold(n_splits=10)的意思就是将数据集切分成10份
  • kf.split(X)就是将利用定义好的分割器进行切分数据集,返回的是对应训练集和测试集的索引,注意是索引不是数据,需要用该索引进行从原数据中进行提取数据

2.Stratified K-flod

  Stratified K-flod也是集成好的分割算法,但是它不同的地方就是它会按照标签中的类别进行按比例分割,保证训练集和测试集的样本比例相同。

代码实现:

skf=StratifiedKFold(n_splits=3)
model=DecisionTreeClassifier()
scores=[]
for i,(train_index,test_index) in enumerate(skf.split(X,y)):
    model.fit(X[train_index],y[train_index])
    y_pred=model.predict(X[test_index])
    accuracy=metrics.accuracy_score(y[test_index],y_pred)
    scores.append(accuracy)
    print("Fold:{} accuracy:{:.4f}".format(i+1,accuracy))
print("平均accuracy:{}".format(np.mean(scores)))

二、网格参数搜索

  你会发现有的算法参数很多,而且范围很大是连续型的,如果一个一个尝试的相当的费时间,所以很容易想到有没有那种循环性遍历尝试的,GridSerarchCV就是这样的,它会将我们传入的参数一个一个的进行尝试,然后用每组参数进行交叉验证,选择最优的参数组合,虽然可以帮助我们很容易的找到最优参数组合,但是也会产生一定负面影响,因为要不断遍历每个参数组合,所以耗时较长,还有一点就是很容易产生过拟合,所以针对大数据集这种方法还是没有用的,还是要依赖一定的经验进行调整参数,过度依赖它肯定是不行的,但是作为新手使用它可以很容易帮助我们找打最优的参数组合。

代码实现:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
  • Pipeline:管道,可以将我们一些通用步骤进行封装
  • StandardScaler:用于将数据进行标准化
  • KNeighborsClassifier:K近邻算法
  • GridSearchCV:网格搜索
# 定义待评估的模型,这是个管道
pipe_KNN=Pipeline([('scale',StandardScaler()),
                  ('KNN',KNeighborsClassifier())])
n_neighbors=np.arange(1,11)
# 需要遍历的网格参数
params={"scale__with_mean":[True,False],
       "KNN__n_neighbors":n_neighbors}
# 定义网格器
gsCV=GridSearchCV(pipe_KNN,
                  params,
                  cv=10)
# 开始搜索参数
gsCV.fit(X,y)

  我们将标准化和K近邻算法封装在一个管道内,Pipeline的参数就是一个列表,列表中包括多个流程,每个流程是一个键值对,键就是这个流程的名字,用于后面进行提取该步骤,值就是每个流程的操作对象。

  然后定义了需要搜索的网格参数,他是一个字典,键是参数的名字,值是每个参数可选的值,这里发现键就是Pipeline管道中的键加__再加上参数名字,这是Pipeline中提取参数的方法,用于指明哪个步骤的哪个参数。

  然后GridSearchCV的参数就是评估器,网格参数,以及交叉验证的折数,这里用Pipeline充当一个评估器。

# 网格搜索后最优参数
>>>gsCV.best_params_
{'KNN__n_neighbors': 8, 'scale__with_mean': True}
# 搜索参数过程中的最优分数
>>>gsCV.best_score_
0.9666666666666668
# 返回最优参数下的模型
>>>model=gsCV.best_estimator_
>>>model
Pipeline(memory=None,
         steps=[('scale',
                 StandardScaler(copy=True, with_mean=True, with_std=True)),
                ('KNN',
                 KNeighborsClassifier(algorithm='auto', leaf_size=30,
                                      metric='minkowski', metric_params=None,
                                      n_jobs=None, n_neighbors=8, p=2,
                                      weights='uniform'))],
         verbose=False)
# 将最优模型用于预测
>>>y_pred=model.predict(X)
>>>print("accuracy:{}".format(metrics.accuracy_score(y,y_pred)))
accuracy:0.9666666666666667

  当我们进行完网格搜索后,可以用gsCV获得最优参数,以及对应的模型用于之后的使用。



目录
相关文章
|
6天前
|
机器学习/深度学习 人工智能 分布式计算
使用PAI+LLaMA Factory 微调 Qwen2-VL 模型,搭建文旅领域知识问答机器人
本次教程介绍了如何使用 PAI 和 LLaMA Factory 框架,基于全参方法微调 Qwen2-VL模型,使其能够进行文旅领域知识问答,同时通过人工测试验证了微调的效果。
|
15天前
|
机器学习/深度学习 算法 数据可视化
机器学习模型中特征贡献度分析:预测贡献与错误贡献
本文将探讨特征重要性与特征有效性之间的关系,并引入两个关键概念:预测贡献度和错误贡献度。
49 3
|
11天前
|
存储 人工智能 并行计算
Pai-Megatron-Patch:围绕Megatron-Core打造大模型训练加速生态
Pai-Megatron-Patch(https://github.com/alibaba/Pai-Megatron-Patch)是阿里云人工智能平台PAI研发的围绕Nvidia MegatronLM的大模型开发配套工具,旨在帮助开发者快速上手大模型,完成大模型(LLM)相关的高效分布式训练,有监督指令微调,下游任务评估等大模型开发链路。最近一年来,我们持续打磨Pai-Megatron-Patch的性能和扩展功能,围绕Megatron-Core(以下简称MCore)进一步打造大模型训练加速技术生态,推出更多的的训练加速、显存优化特性。
|
13天前
|
机器学习/深度学习 算法 数据挖掘
Python数据分析革命:Scikit-learn库,让机器学习模型训练与评估变得简单高效!
在数据驱动时代,Python 以强大的生态系统成为数据科学的首选语言,而 Scikit-learn 则因简洁的 API 和广泛的支持脱颖而出。本文将指导你使用 Scikit-learn 进行机器学习模型的训练与评估。首先通过 `pip install scikit-learn` 安装库,然后利用内置数据集进行数据准备,选择合适的模型(如逻辑回归),并通过交叉验证评估其性能。最终,使用模型对新数据进行预测,简化整个流程。无论你是新手还是专家,Scikit-learn 都能助你一臂之力。
64 8
|
10天前
|
机器学习/深度学习 数据可视化 JavaScript
探索机器学习模型的可视化技术
【9月更文挑战第23天】在数据科学中,理解和解释机器学习模型的决策过程是至关重要的。本文将介绍几种流行的可视化工具和库,如TensorBoard、D3.js等,帮助读者更好地理解模型内部工作原理及其预测结果。通过实例演示如何使用这些工具进行模型可视化,增强模型的可解释性。
|
18天前
|
机器学习/深度学习 数据采集 算法
利用未标记数据的半监督学习在模型训练中的效果评估
本文将介绍三种适用于不同类型数据和任务的半监督学习方法。我们还将在一个实际数据集上评估这些方法的性能,并与仅使用标记数据的基准进行比较。
30 8
|
23天前
|
机器学习/深度学习 Python
训练集、测试集与验证集:机器学习模型评估的基石
在机器学习中,数据集通常被划分为训练集、验证集和测试集,以评估模型性能并调整参数。训练集用于拟合模型,验证集用于调整超参数和防止过拟合,测试集则用于评估最终模型性能。本文详细介绍了这三个集合的作用,并通过代码示例展示了如何进行数据集的划分。合理的划分有助于提升模型的泛化能力。
|
23天前
|
机器学习/深度学习 Python
验证集的划分方法:确保机器学习模型泛化能力的关键
本文详细介绍了机器学习中验证集的作用及其划分方法。验证集主要用于评估模型性能和调整超参数,不同于仅用于最终评估的测试集。文中描述了几种常见的划分方法,包括简单划分、交叉验证、时间序列数据划分及分层抽样划分,并提供了Python示例代码。此外,还强调了在划分数据集时应注意随机性、数据分布和多次实验的重要性。合理划分验证集有助于更准确地评估模型性能并进行有效调优。
|
21天前
|
机器学习/深度学习 算法 数据挖掘
从菜鸟到大师:Scikit-learn库实战教程,模型训练、评估、选择一网打尽!
【9月更文挑战第13天】在数据科学与机器学习领域,Scikit-learn是不可或缺的工具。本文通过问答形式,指导初学者从零开始使用Scikit-learn进行模型训练、评估与选择。首先介绍了如何安装库、预处理数据并训练模型;接着展示了如何利用多种评估指标确保模型性能;最后通过GridSearchCV演示了系统化的参数调优方法。通过这些实战技巧,帮助读者逐步成长为熟练的数据科学家。
63 3
|
24天前
|
机器学习/深度学习 人工智能 自然语言处理
机器学习模型之深度神经网络的特点
深度神经网络(Deep Neural Networks, DNNs)是一类机器学习模型,通过多个层级(层)的神经元来模拟人脑的工作方式,从而实现复杂的数据处理和模式识别任务。
32 1

相关产品

  • 人工智能平台 PAI
  • 下一篇
    无影云桌面